Copy disabled (too large)
Download .txt
Showing preview only (26,721K chars total). Download the full file to get everything.
Repository: xenia-project/xenia
Branch: master
Commit: 95a5c3ee250f
Files: 1494
Total size: 25.2 MB
Directory structure:
gitextract_uybvm70e/
├── .appveyor.yml
├── .clang-format
├── .drone.star
├── .gdbinit
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ └── ISSUE_TEMPLATE/
│ ├── bug_report.yaml
│ └── config.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── android/
│ └── android_studio_project/
│ ├── .gitignore
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── jp/
│ │ │ └── xenia/
│ │ │ ├── XeniaRuntimeException.java
│ │ │ └── emulator/
│ │ │ ├── GpuTraceViewerActivity.java
│ │ │ ├── LauncherActivity.java
│ │ │ ├── WindowDemoActivity.java
│ │ │ ├── WindowSurfaceView.java
│ │ │ └── WindowedAppActivity.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ └── ic_launcher_background.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── layout/
│ │ │ ├── activity_gpu_trace_viewer.xml
│ │ │ ├── activity_launcher.xml
│ │ │ └── activity_window_demo.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ └── values/
│ │ └── strings.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── gradlew
│ ├── gradlew.bat
│ └── settings.gradle
├── assets/
│ └── icon/
│ └── LICENSE
├── docs/
│ ├── building.md
│ ├── cpu.md
│ ├── cpu_todo.md
│ ├── gpu.md
│ ├── instruction_tracing.md
│ ├── kernel.md
│ ├── ppc/
│ │ └── vmx128.txt
│ └── style_guide.md
├── premake5.lua
├── src/
│ └── xenia/
│ ├── app/
│ │ ├── discord/
│ │ │ ├── discord_presence.cc
│ │ │ ├── discord_presence.h
│ │ │ └── premake5.lua
│ │ ├── emulator_window.cc
│ │ ├── emulator_window.h
│ │ ├── main_resources.rc
│ │ ├── premake5.lua
│ │ └── xenia_main.cc
│ ├── apu/
│ │ ├── apu_flags.cc
│ │ ├── apu_flags.h
│ │ ├── audio_driver.cc
│ │ ├── audio_driver.h
│ │ ├── audio_system.cc
│ │ ├── audio_system.h
│ │ ├── conversion.h
│ │ ├── debug_visualizers.natvis
│ │ ├── nop/
│ │ │ ├── nop_apu_flags.cc
│ │ │ ├── nop_apu_flags.h
│ │ │ ├── nop_audio_system.cc
│ │ │ ├── nop_audio_system.h
│ │ │ └── premake5.lua
│ │ ├── premake5.lua
│ │ ├── sdl/
│ │ │ ├── premake5.lua
│ │ │ ├── sdl_audio_driver.cc
│ │ │ ├── sdl_audio_driver.h
│ │ │ ├── sdl_audio_system.cc
│ │ │ └── sdl_audio_system.h
│ │ ├── xaudio2/
│ │ │ ├── premake5.lua
│ │ │ ├── xaudio2_api.h
│ │ │ ├── xaudio2_apu_flags.cc
│ │ │ ├── xaudio2_apu_flags.h
│ │ │ ├── xaudio2_audio_driver.cc
│ │ │ ├── xaudio2_audio_driver.h
│ │ │ ├── xaudio2_audio_system.cc
│ │ │ └── xaudio2_audio_system.h
│ │ ├── xma_context.cc
│ │ ├── xma_context.h
│ │ ├── xma_decoder.cc
│ │ ├── xma_decoder.h
│ │ ├── xma_helpers.h
│ │ ├── xma_register_file.cc
│ │ ├── xma_register_file.h
│ │ └── xma_register_table.inc
│ ├── base/
│ │ ├── README.md
│ │ ├── app_win32.manifest
│ │ ├── arena.cc
│ │ ├── arena.h
│ │ ├── assert.h
│ │ ├── atomic.h
│ │ ├── bit_map.cc
│ │ ├── bit_map.h
│ │ ├── bit_range.h
│ │ ├── bit_stream.cc
│ │ ├── bit_stream.h
│ │ ├── byte_order.h
│ │ ├── byte_stream.cc
│ │ ├── byte_stream.h
│ │ ├── chrono.h
│ │ ├── chrono_steady_cast.h
│ │ ├── clock.cc
│ │ ├── clock.h
│ │ ├── clock_posix.cc
│ │ ├── clock_win.cc
│ │ ├── clock_x64.cc
│ │ ├── console.h
│ │ ├── console_app_main.h
│ │ ├── console_app_main_android.cc
│ │ ├── console_app_main_posix.cc
│ │ ├── console_app_main_win.cc
│ │ ├── console_posix.cc
│ │ ├── console_win.cc
│ │ ├── cvar.cc
│ │ ├── cvar.h
│ │ ├── cvar_android.cc
│ │ ├── debug_visualizers.natvis
│ │ ├── debugging.h
│ │ ├── debugging_mac.cc
│ │ ├── debugging_posix.cc
│ │ ├── debugging_win.cc
│ │ ├── delegate.h
│ │ ├── exception_handler.cc
│ │ ├── exception_handler.h
│ │ ├── exception_handler_posix.cc
│ │ ├── exception_handler_win.cc
│ │ ├── filesystem.cc
│ │ ├── filesystem.h
│ │ ├── filesystem_android.cc
│ │ ├── filesystem_posix.cc
│ │ ├── filesystem_wildcard.cc
│ │ ├── filesystem_wildcard.h
│ │ ├── filesystem_win.cc
│ │ ├── fuzzy.cc
│ │ ├── fuzzy.h
│ │ ├── hash.h
│ │ ├── host_thread_context.cc
│ │ ├── host_thread_context.h
│ │ ├── literals.h
│ │ ├── logging.cc
│ │ ├── logging.h
│ │ ├── main_android.cc
│ │ ├── main_android.h
│ │ ├── main_init_android.cc
│ │ ├── main_init_posix.cc
│ │ ├── main_init_win.cc
│ │ ├── main_win.cc
│ │ ├── main_win.h
│ │ ├── mapped_memory.h
│ │ ├── mapped_memory_posix.cc
│ │ ├── mapped_memory_win.cc
│ │ ├── math.h
│ │ ├── memory.cc
│ │ ├── memory.h
│ │ ├── memory_posix.cc
│ │ ├── memory_win.cc
│ │ ├── mutex.cc
│ │ ├── mutex.h
│ │ ├── platform.h
│ │ ├── platform_linux.h
│ │ ├── platform_win.h
│ │ ├── premake5.lua
│ │ ├── profiling.cc
│ │ ├── profiling.h
│ │ ├── reset_scope.h
│ │ ├── ring_buffer.cc
│ │ ├── ring_buffer.h
│ │ ├── socket.h
│ │ ├── socket_win.cc
│ │ ├── string.cc
│ │ ├── string.h
│ │ ├── string_buffer.cc
│ │ ├── string_buffer.h
│ │ ├── string_key.h
│ │ ├── string_util.h
│ │ ├── system.h
│ │ ├── system_android.cc
│ │ ├── system_gnulinux.cc
│ │ ├── system_win.cc
│ │ ├── testing/
│ │ │ ├── chrono_test.cc
│ │ │ ├── memory_test.cc
│ │ │ ├── premake5.lua
│ │ │ ├── threading_test.cc
│ │ │ └── utf8_test.cc
│ │ ├── threading.cc
│ │ ├── threading.h
│ │ ├── threading_mac.cc
│ │ ├── threading_posix.cc
│ │ ├── threading_timer_queue.cc
│ │ ├── threading_timer_queue.h
│ │ ├── threading_win.cc
│ │ ├── type_pool.h
│ │ ├── utf8.cc
│ │ ├── utf8.h
│ │ ├── vec128.cc
│ │ ├── vec128.h
│ │ └── xxhash.h
│ ├── config.cc
│ ├── config.h
│ ├── cpp.hint
│ ├── cpu/
│ │ ├── backend/
│ │ │ ├── assembler.cc
│ │ │ ├── assembler.h
│ │ │ ├── backend.cc
│ │ │ ├── backend.h
│ │ │ ├── code_cache.h
│ │ │ ├── machine_info.h
│ │ │ ├── null_backend.cc
│ │ │ ├── null_backend.h
│ │ │ └── x64/
│ │ │ ├── premake5.lua
│ │ │ ├── x64_assembler.cc
│ │ │ ├── x64_assembler.h
│ │ │ ├── x64_backend.cc
│ │ │ ├── x64_backend.h
│ │ │ ├── x64_code_cache.cc
│ │ │ ├── x64_code_cache.h
│ │ │ ├── x64_code_cache_posix.cc
│ │ │ ├── x64_code_cache_win.cc
│ │ │ ├── x64_emitter.cc
│ │ │ ├── x64_emitter.h
│ │ │ ├── x64_function.cc
│ │ │ ├── x64_function.h
│ │ │ ├── x64_op.h
│ │ │ ├── x64_seq_control.cc
│ │ │ ├── x64_seq_memory.cc
│ │ │ ├── x64_seq_vector.cc
│ │ │ ├── x64_sequences.cc
│ │ │ ├── x64_sequences.h
│ │ │ ├── x64_stack_layout.h
│ │ │ ├── x64_tracers.cc
│ │ │ ├── x64_tracers.h
│ │ │ └── x64_util.h
│ │ ├── breakpoint.cc
│ │ ├── breakpoint.h
│ │ ├── compiler/
│ │ │ ├── compiler.cc
│ │ │ ├── compiler.h
│ │ │ ├── compiler_pass.cc
│ │ │ ├── compiler_pass.h
│ │ │ ├── compiler_passes.h
│ │ │ └── passes/
│ │ │ ├── conditional_group_pass.cc
│ │ │ ├── conditional_group_pass.h
│ │ │ ├── conditional_group_subpass.cc
│ │ │ ├── conditional_group_subpass.h
│ │ │ ├── constant_propagation_pass.cc
│ │ │ ├── constant_propagation_pass.h
│ │ │ ├── context_promotion_pass.cc
│ │ │ ├── context_promotion_pass.h
│ │ │ ├── control_flow_analysis_pass.cc
│ │ │ ├── control_flow_analysis_pass.h
│ │ │ ├── control_flow_simplification_pass.cc
│ │ │ ├── control_flow_simplification_pass.h
│ │ │ ├── data_flow_analysis_pass.cc
│ │ │ ├── data_flow_analysis_pass.h
│ │ │ ├── dead_code_elimination_pass.cc
│ │ │ ├── dead_code_elimination_pass.h
│ │ │ ├── finalization_pass.cc
│ │ │ ├── finalization_pass.h
│ │ │ ├── memory_sequence_combination_pass.cc
│ │ │ ├── memory_sequence_combination_pass.h
│ │ │ ├── register_allocation_pass.cc
│ │ │ ├── register_allocation_pass.h
│ │ │ ├── simplification_pass.cc
│ │ │ ├── simplification_pass.h
│ │ │ ├── validation_pass.cc
│ │ │ ├── validation_pass.h
│ │ │ ├── value_reduction_pass.cc
│ │ │ └── value_reduction_pass.h
│ │ ├── cpu_flags.cc
│ │ ├── cpu_flags.h
│ │ ├── debug_listener.h
│ │ ├── elf_module.cc
│ │ ├── elf_module.h
│ │ ├── entry_table.cc
│ │ ├── entry_table.h
│ │ ├── export_resolver.cc
│ │ ├── export_resolver.h
│ │ ├── function.cc
│ │ ├── function.h
│ │ ├── function_debug_info.cc
│ │ ├── function_debug_info.h
│ │ ├── function_trace_data.h
│ │ ├── hir/
│ │ │ ├── block.cc
│ │ │ ├── block.h
│ │ │ ├── hir_builder.cc
│ │ │ ├── hir_builder.h
│ │ │ ├── instr.cc
│ │ │ ├── instr.h
│ │ │ ├── label.h
│ │ │ ├── opcodes.cc
│ │ │ ├── opcodes.h
│ │ │ ├── opcodes.inl
│ │ │ ├── value.cc
│ │ │ └── value.h
│ │ ├── lzx.cc
│ │ ├── lzx.h
│ │ ├── mmio_handler.cc
│ │ ├── mmio_handler.h
│ │ ├── module.cc
│ │ ├── module.h
│ │ ├── ppc/
│ │ │ ├── ppc_context.cc
│ │ │ ├── ppc_context.h
│ │ │ ├── ppc_decode_data.h
│ │ │ ├── ppc_emit-private.h
│ │ │ ├── ppc_emit.h
│ │ │ ├── ppc_emit_altivec.cc
│ │ │ ├── ppc_emit_alu.cc
│ │ │ ├── ppc_emit_control.cc
│ │ │ ├── ppc_emit_fpu.cc
│ │ │ ├── ppc_emit_memory.cc
│ │ │ ├── ppc_frontend.cc
│ │ │ ├── ppc_frontend.h
│ │ │ ├── ppc_hir_builder.cc
│ │ │ ├── ppc_hir_builder.h
│ │ │ ├── ppc_instr.h
│ │ │ ├── ppc_opcode.h
│ │ │ ├── ppc_opcode_disasm.cc
│ │ │ ├── ppc_opcode_disasm.h
│ │ │ ├── ppc_opcode_disasm_gen.cc
│ │ │ ├── ppc_opcode_info.cc
│ │ │ ├── ppc_opcode_info.h
│ │ │ ├── ppc_opcode_lookup_gen.cc
│ │ │ ├── ppc_opcode_table_gen.cc
│ │ │ ├── ppc_scanner.cc
│ │ │ ├── ppc_scanner.h
│ │ │ ├── ppc_translator.cc
│ │ │ ├── ppc_translator.h
│ │ │ └── testing/
│ │ │ ├── README.md
│ │ │ ├── instr_add.s
│ │ │ ├── instr_addc.s
│ │ │ ├── instr_adde.s
│ │ │ ├── instr_addic.s
│ │ │ ├── instr_addis.s
│ │ │ ├── instr_addme.s
│ │ │ ├── instr_addze.s
│ │ │ ├── instr_and.s
│ │ │ ├── instr_andc.s
│ │ │ ├── instr_andi.s
│ │ │ ├── instr_andis.s
│ │ │ ├── instr_cmp.s
│ │ │ ├── instr_cmpi.s
│ │ │ ├── instr_cmpl.s
│ │ │ ├── instr_cmpli.s
│ │ │ ├── instr_cntlzd.s
│ │ │ ├── instr_cntlzw.s
│ │ │ ├── instr_divd.s
│ │ │ ├── instr_divdu.s
│ │ │ ├── instr_divw.s
│ │ │ ├── instr_divwu.s
│ │ │ ├── instr_eqv.s
│ │ │ ├── instr_extsb.s
│ │ │ ├── instr_extsh.s
│ │ │ ├── instr_extsw.s
│ │ │ ├── instr_fabs.s
│ │ │ ├── instr_fadd.s
│ │ │ ├── instr_fctixz.s
│ │ │ ├── instr_fmadd.s
│ │ │ ├── instr_fmadds.s
│ │ │ ├── instr_fmul.s
│ │ │ ├── instr_fnabs.s
│ │ │ ├── instr_frsqrte.s
│ │ │ ├── instr_fsel.s
│ │ │ ├── instr_fsqrt.s
│ │ │ ├── instr_lvexx.s
│ │ │ ├── instr_lvl.s
│ │ │ ├── instr_lvr.s
│ │ │ ├── instr_lvsl.s
│ │ │ ├── instr_lvsr.s
│ │ │ ├── instr_mulhd.s
│ │ │ ├── instr_mulhdu.s
│ │ │ ├── instr_mulhw.s
│ │ │ ├── instr_mulhwu.s
│ │ │ ├── instr_mulld.s
│ │ │ ├── instr_mulli.s
│ │ │ ├── instr_mullw.s
│ │ │ ├── instr_neg.s
│ │ │ ├── instr_nor.s
│ │ │ ├── instr_ori.s
│ │ │ ├── instr_rldicl.s
│ │ │ ├── instr_rldicr.s
│ │ │ ├── instr_rlwimi.s
│ │ │ ├── instr_rlwinm.s
│ │ │ ├── instr_rlwnm.s
│ │ │ ├── instr_sld.s
│ │ │ ├── instr_slw.s
│ │ │ ├── instr_srad.s
│ │ │ ├── instr_sradi.s
│ │ │ ├── instr_sraw.s
│ │ │ ├── instr_srawi.s
│ │ │ ├── instr_srd.s
│ │ │ ├── instr_srw.s
│ │ │ ├── instr_stvew.s
│ │ │ ├── instr_stvl.s
│ │ │ ├── instr_stvr.s
│ │ │ ├── instr_subf.s
│ │ │ ├── instr_subfc.s
│ │ │ ├── instr_subfe.s
│ │ │ ├── instr_subfic.s
│ │ │ ├── instr_subfme.s
│ │ │ ├── instr_subfze.s
│ │ │ ├── instr_td.s
│ │ │ ├── instr_tdi.s
│ │ │ ├── instr_tw.s
│ │ │ ├── instr_twi.s
│ │ │ ├── instr_vaddfp.s
│ │ │ ├── instr_vaddfp128.s
│ │ │ ├── instr_vaddshs.s
│ │ │ ├── instr_vadduhm.s
│ │ │ ├── instr_vand.s
│ │ │ ├── instr_vand128.s
│ │ │ ├── instr_vandc.s
│ │ │ ├── instr_vandc128.s
│ │ │ ├── instr_vavgsh.s
│ │ │ ├── instr_vavguh.s
│ │ │ ├── instr_vcfsx.s
│ │ │ ├── instr_vcmpxxfp.s
│ │ │ ├── instr_vcmpxxfp128.s
│ │ │ ├── instr_vctsxs.s
│ │ │ ├── instr_vctuxs.s
│ │ │ ├── instr_vexptefp.s
│ │ │ ├── instr_vmaddfp.s
│ │ │ ├── instr_vmaxfp.s
│ │ │ ├── instr_vmaxfp128.s
│ │ │ ├── instr_vmaxsh.s
│ │ │ ├── instr_vmaxuh.s
│ │ │ ├── instr_vminfp.s
│ │ │ ├── instr_vminfp128.s
│ │ │ ├── instr_vminsh.s
│ │ │ ├── instr_vminuh.s
│ │ │ ├── instr_vmrghb.s
│ │ │ ├── instr_vmrghh.s
│ │ │ ├── instr_vmrghw.s
│ │ │ ├── instr_vmrglb.s
│ │ │ ├── instr_vmrglh.s
│ │ │ ├── instr_vmrglw.s
│ │ │ ├── instr_vmsum3fp128.s
│ │ │ ├── instr_vmsum4fp128.s
│ │ │ ├── instr_vor.s
│ │ │ ├── instr_vor128.s
│ │ │ ├── instr_vperm.s
│ │ │ ├── instr_vpermwi128.s
│ │ │ ├── instr_vpkd3d128.s
│ │ │ ├── instr_vpkpx.s
│ │ │ ├── instr_vpkshss.s
│ │ │ ├── instr_vpkshss128.s
│ │ │ ├── instr_vpkshus.s
│ │ │ ├── instr_vpkshus128.s
│ │ │ ├── instr_vpkswss.s
│ │ │ ├── instr_vpkswss128.s
│ │ │ ├── instr_vpkswus.s
│ │ │ ├── instr_vpkswus128.s
│ │ │ ├── instr_vpkuhum.s
│ │ │ ├── instr_vpkuhum128.s
│ │ │ ├── instr_vpkuhus.s
│ │ │ ├── instr_vpkuhus128.s
│ │ │ ├── instr_vpkuwum.s
│ │ │ ├── instr_vpkuwum128.s
│ │ │ ├── instr_vpkuwus.s
│ │ │ ├── instr_vpkuwus128.s
│ │ │ ├── instr_vrfin.s
│ │ │ ├── instr_vrlh.s
│ │ │ ├── instr_vrlimi128.s
│ │ │ ├── instr_vsel.s
│ │ │ ├── instr_vsl.s
│ │ │ ├── instr_vslb.s
│ │ │ ├── instr_vsldoi.s
│ │ │ ├── instr_vslh.s
│ │ │ ├── instr_vslo.s
│ │ │ ├── instr_vslw.s
│ │ │ ├── instr_vspltb.s
│ │ │ ├── instr_vsplth.s
│ │ │ ├── instr_vspltisb.s
│ │ │ ├── instr_vspltish.s
│ │ │ ├── instr_vspltisw.s
│ │ │ ├── instr_vspltw.s
│ │ │ ├── instr_vsr.s
│ │ │ ├── instr_vsrah.s
│ │ │ ├── instr_vsrh.s
│ │ │ ├── instr_vsro.s
│ │ │ ├── instr_vsubfp.s
│ │ │ ├── instr_vsubfp128.s
│ │ │ ├── instr_vsubshs.s
│ │ │ ├── instr_vsubuhm.s
│ │ │ ├── instr_vupkd3d128.s
│ │ │ ├── instr_vupkhsb.s
│ │ │ ├── instr_vupkhsb128.s
│ │ │ ├── instr_vupkhsh.s
│ │ │ ├── instr_vupklsb.s
│ │ │ ├── instr_vupklsb128.s
│ │ │ ├── instr_vupklsh.s
│ │ │ ├── instr_vxor.s
│ │ │ ├── instr_vxor128.s
│ │ │ ├── ppc_testing_main.cc
│ │ │ ├── ppc_testing_native_main.cc
│ │ │ ├── ppc_testing_native_thunks.s
│ │ │ ├── premake5.lua
│ │ │ ├── seq_branch_carry.s
│ │ │ └── seq_jumptable_constants.s
│ │ ├── premake5.lua
│ │ ├── processor.cc
│ │ ├── processor.h
│ │ ├── raw_module.cc
│ │ ├── raw_module.h
│ │ ├── stack_walker.h
│ │ ├── stack_walker_posix.cc
│ │ ├── stack_walker_win.cc
│ │ ├── symbol.h
│ │ ├── test_module.cc
│ │ ├── test_module.h
│ │ ├── testing/
│ │ │ ├── add_test.cc
│ │ │ ├── byte_swap_test.cc
│ │ │ ├── extract_test.cc
│ │ │ ├── insert_test.cc
│ │ │ ├── load_vector_shl_shr_test.cc
│ │ │ ├── pack_test.cc
│ │ │ ├── permute_test.cc
│ │ │ ├── premake5.lua
│ │ │ ├── sandbox_main.cc
│ │ │ ├── sha_test.cc
│ │ │ ├── shl_test.cc
│ │ │ ├── shr_test.cc
│ │ │ ├── swizzle_test.cc
│ │ │ ├── unpack_test.cc
│ │ │ ├── util.h
│ │ │ ├── vector_add_test.cc
│ │ │ ├── vector_max_test.cc
│ │ │ ├── vector_min_test.cc
│ │ │ ├── vector_rotate_left_test.cc
│ │ │ ├── vector_sha_test.cc
│ │ │ ├── vector_shl_test.cc
│ │ │ └── vector_shr_test.cc
│ │ ├── thread.cc
│ │ ├── thread.h
│ │ ├── thread_debug_info.h
│ │ ├── thread_state.cc
│ │ ├── thread_state.h
│ │ ├── xex_module.cc
│ │ └── xex_module.h
│ ├── debug/
│ │ └── ui/
│ │ ├── debug_window.cc
│ │ ├── debug_window.h
│ │ └── premake5.lua
│ ├── emulator.cc
│ ├── emulator.h
│ ├── gpu/
│ │ ├── command_processor.cc
│ │ ├── command_processor.h
│ │ ├── d3d12/
│ │ │ ├── d3d12_command_processor.cc
│ │ │ ├── d3d12_command_processor.h
│ │ │ ├── d3d12_graphics_system.cc
│ │ │ ├── d3d12_graphics_system.h
│ │ │ ├── d3d12_primitive_processor.cc
│ │ │ ├── d3d12_primitive_processor.h
│ │ │ ├── d3d12_render_target_cache.cc
│ │ │ ├── d3d12_render_target_cache.h
│ │ │ ├── d3d12_shader.cc
│ │ │ ├── d3d12_shader.h
│ │ │ ├── d3d12_shared_memory.cc
│ │ │ ├── d3d12_shared_memory.h
│ │ │ ├── d3d12_texture_cache.cc
│ │ │ ├── d3d12_texture_cache.h
│ │ │ ├── d3d12_trace_dump_main.cc
│ │ │ ├── d3d12_trace_viewer_main.cc
│ │ │ ├── deferred_command_list.cc
│ │ │ ├── deferred_command_list.h
│ │ │ ├── pipeline_cache.cc
│ │ │ ├── pipeline_cache.h
│ │ │ └── premake5.lua
│ │ ├── draw_extent_estimator.cc
│ │ ├── draw_extent_estimator.h
│ │ ├── draw_util.cc
│ │ ├── draw_util.h
│ │ ├── dxbc.h
│ │ ├── dxbc_shader.cc
│ │ ├── dxbc_shader.h
│ │ ├── dxbc_shader_translator.cc
│ │ ├── dxbc_shader_translator.h
│ │ ├── dxbc_shader_translator_alu.cc
│ │ ├── dxbc_shader_translator_fetch.cc
│ │ ├── dxbc_shader_translator_memexport.cc
│ │ ├── dxbc_shader_translator_om.cc
│ │ ├── gpu_flags.cc
│ │ ├── gpu_flags.h
│ │ ├── graphics_system.cc
│ │ ├── graphics_system.h
│ │ ├── null/
│ │ │ ├── null_command_processor.cc
│ │ │ ├── null_command_processor.h
│ │ │ ├── null_graphics_system.cc
│ │ │ ├── null_graphics_system.h
│ │ │ └── premake5.lua
│ │ ├── packet_disassembler.cc
│ │ ├── packet_disassembler.h
│ │ ├── premake5.lua
│ │ ├── primitive_processor.cc
│ │ ├── primitive_processor.h
│ │ ├── register_file.cc
│ │ ├── register_file.h
│ │ ├── register_table.inc
│ │ ├── registers.cc
│ │ ├── registers.h
│ │ ├── render_target_cache.cc
│ │ ├── render_target_cache.h
│ │ ├── sampler_info.cc
│ │ ├── sampler_info.h
│ │ ├── shader.cc
│ │ ├── shader.h
│ │ ├── shader_compiler_main.cc
│ │ ├── shader_interpreter.cc
│ │ ├── shader_interpreter.h
│ │ ├── shader_translator.cc
│ │ ├── shader_translator.h
│ │ ├── shader_translator_disasm.cc
│ │ ├── shaders/
│ │ │ ├── adaptive_quad.hs.hlsl
│ │ │ ├── adaptive_triangle.hs.hlsl
│ │ │ ├── apply_gamma_pwl.cs.xesl
│ │ │ ├── apply_gamma_pwl.ps.xesl
│ │ │ ├── apply_gamma_pwl.xesli
│ │ │ ├── apply_gamma_pwl_fxaa_luma.cs.xesl
│ │ │ ├── apply_gamma_pwl_fxaa_luma.ps.xesl
│ │ │ ├── apply_gamma_table.cs.xesl
│ │ │ ├── apply_gamma_table.ps.xesl
│ │ │ ├── apply_gamma_table.xesli
│ │ │ ├── apply_gamma_table_fxaa_luma.cs.xesl
│ │ │ ├── apply_gamma_table_fxaa_luma.ps.xesl
│ │ │ ├── bytecode/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── d3d12_5_1/
│ │ │ │ │ ├── adaptive_quad_hs.h
│ │ │ │ │ ├── adaptive_triangle_hs.h
│ │ │ │ │ ├── apply_gamma_pwl_cs.h
│ │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_cs.h
│ │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_ps.h
│ │ │ │ │ ├── apply_gamma_pwl_ps.h
│ │ │ │ │ ├── apply_gamma_table_cs.h
│ │ │ │ │ ├── apply_gamma_table_fxaa_luma_cs.h
│ │ │ │ │ ├── apply_gamma_table_fxaa_luma_ps.h
│ │ │ │ │ ├── apply_gamma_table_ps.h
│ │ │ │ │ ├── clear_uint2_ps.h
│ │ │ │ │ ├── continuous_quad_1cp_hs.h
│ │ │ │ │ ├── continuous_quad_4cp_hs.h
│ │ │ │ │ ├── continuous_triangle_1cp_hs.h
│ │ │ │ │ ├── continuous_triangle_3cp_hs.h
│ │ │ │ │ ├── discrete_quad_1cp_hs.h
│ │ │ │ │ ├── discrete_quad_4cp_hs.h
│ │ │ │ │ ├── discrete_triangle_1cp_hs.h
│ │ │ │ │ ├── discrete_triangle_3cp_hs.h
│ │ │ │ │ ├── float24_round_ps.h
│ │ │ │ │ ├── float24_truncate_ps.h
│ │ │ │ │ ├── fullscreen_cw_vs.h
│ │ │ │ │ ├── fxaa_cs.h
│ │ │ │ │ ├── fxaa_extreme_cs.h
│ │ │ │ │ ├── host_depth_store_1xmsaa_cs.h
│ │ │ │ │ ├── host_depth_store_2xmsaa_cs.h
│ │ │ │ │ ├── host_depth_store_4xmsaa_cs.h
│ │ │ │ │ ├── passthrough_position_xy_vs.h
│ │ │ │ │ ├── resolve_clear_32bpp_cs.h
│ │ │ │ │ ├── resolve_clear_32bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_clear_64bpp_cs.h
│ │ │ │ │ ├── resolve_clear_64bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_cs.h
│ │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled_cs.h
│ │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_cs.h
│ │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled_cs.h
│ │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_cs.h
│ │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled_cs.h
│ │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_cs.h
│ │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled_cs.h
│ │ │ │ │ ├── resolve_full_128bpp_cs.h
│ │ │ │ │ ├── resolve_full_128bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_full_16bpp_cs.h
│ │ │ │ │ ├── resolve_full_16bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_full_32bpp_cs.h
│ │ │ │ │ ├── resolve_full_32bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_full_64bpp_cs.h
│ │ │ │ │ ├── resolve_full_64bpp_scaled_cs.h
│ │ │ │ │ ├── resolve_full_8bpp_cs.h
│ │ │ │ │ ├── resolve_full_8bpp_scaled_cs.h
│ │ │ │ │ ├── tessellation_adaptive_vs.h
│ │ │ │ │ ├── tessellation_indexed_vs.h
│ │ │ │ │ ├── texture_load_128bpb_cs.h
│ │ │ │ │ ├── texture_load_128bpb_scaled_cs.h
│ │ │ │ │ ├── texture_load_16bpb_cs.h
│ │ │ │ │ ├── texture_load_16bpb_scaled_cs.h
│ │ │ │ │ ├── texture_load_32bpb_cs.h
│ │ │ │ │ ├── texture_load_32bpb_scaled_cs.h
│ │ │ │ │ ├── texture_load_64bpb_cs.h
│ │ │ │ │ ├── texture_load_64bpb_scaled_cs.h
│ │ │ │ │ ├── texture_load_8bpb_cs.h
│ │ │ │ │ ├── texture_load_8bpb_scaled_cs.h
│ │ │ │ │ ├── texture_load_bgrg8_rgb8_cs.h
│ │ │ │ │ ├── texture_load_bgrg8_rgbg8_cs.h
│ │ │ │ │ ├── texture_load_ctx1_cs.h
│ │ │ │ │ ├── texture_load_depth_float_cs.h
│ │ │ │ │ ├── texture_load_depth_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_depth_unorm_cs.h
│ │ │ │ │ ├── texture_load_depth_unorm_scaled_cs.h
│ │ │ │ │ ├── texture_load_dxn_rg8_cs.h
│ │ │ │ │ ├── texture_load_dxt1_rgba8_cs.h
│ │ │ │ │ ├── texture_load_dxt3_rgba8_cs.h
│ │ │ │ │ ├── texture_load_dxt3a_cs.h
│ │ │ │ │ ├── texture_load_dxt3aas1111_argb4_cs.h
│ │ │ │ │ ├── texture_load_dxt3aas1111_bgra4_cs.h
│ │ │ │ │ ├── texture_load_dxt5_rgba8_cs.h
│ │ │ │ │ ├── texture_load_dxt5a_r8_cs.h
│ │ │ │ │ ├── texture_load_gbgr8_grgb8_cs.h
│ │ │ │ │ ├── texture_load_gbgr8_rgb8_cs.h
│ │ │ │ │ ├── texture_load_r10g11b11_rgba16_cs.h
│ │ │ │ │ ├── texture_load_r10g11b11_rgba16_scaled_cs.h
│ │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_cs.h
│ │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled_cs.h
│ │ │ │ │ ├── texture_load_r11g11b10_rgba16_cs.h
│ │ │ │ │ ├── texture_load_r11g11b10_rgba16_scaled_cs.h
│ │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_cs.h
│ │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled_cs.h
│ │ │ │ │ ├── texture_load_r16_snorm_float_cs.h
│ │ │ │ │ ├── texture_load_r16_snorm_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_r16_unorm_float_cs.h
│ │ │ │ │ ├── texture_load_r16_unorm_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_cs.h
│ │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h
│ │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_cs.h
│ │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h
│ │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_cs.h
│ │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h
│ │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h
│ │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h
│ │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_cs.h
│ │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled_cs.h
│ │ │ │ │ ├── texture_load_rg16_snorm_float_cs.h
│ │ │ │ │ ├── texture_load_rg16_snorm_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_rg16_unorm_float_cs.h
│ │ │ │ │ ├── texture_load_rg16_unorm_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_rgba16_snorm_float_cs.h
│ │ │ │ │ ├── texture_load_rgba16_snorm_float_scaled_cs.h
│ │ │ │ │ ├── texture_load_rgba16_unorm_float_cs.h
│ │ │ │ │ └── texture_load_rgba16_unorm_float_scaled_cs.h
│ │ │ │ └── vulkan_spirv/
│ │ │ │ ├── apply_gamma_pwl_cs.h
│ │ │ │ ├── apply_gamma_pwl_fxaa_luma_cs.h
│ │ │ │ ├── apply_gamma_pwl_fxaa_luma_ps.h
│ │ │ │ ├── apply_gamma_pwl_ps.h
│ │ │ │ ├── apply_gamma_table_cs.h
│ │ │ │ ├── apply_gamma_table_fxaa_luma_cs.h
│ │ │ │ ├── apply_gamma_table_fxaa_luma_ps.h
│ │ │ │ ├── apply_gamma_table_ps.h
│ │ │ │ ├── fullscreen_cw_vs.h
│ │ │ │ ├── host_depth_store_1xmsaa_cs.h
│ │ │ │ ├── host_depth_store_2xmsaa_cs.h
│ │ │ │ ├── host_depth_store_4xmsaa_cs.h
│ │ │ │ ├── passthrough_position_xy_vs.h
│ │ │ │ ├── resolve_clear_32bpp_cs.h
│ │ │ │ ├── resolve_clear_32bpp_scaled_cs.h
│ │ │ │ ├── resolve_clear_64bpp_cs.h
│ │ │ │ ├── resolve_clear_64bpp_scaled_cs.h
│ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_cs.h
│ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled_cs.h
│ │ │ │ ├── resolve_fast_32bpp_4xmsaa_cs.h
│ │ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled_cs.h
│ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_cs.h
│ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled_cs.h
│ │ │ │ ├── resolve_fast_64bpp_4xmsaa_cs.h
│ │ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled_cs.h
│ │ │ │ ├── resolve_full_128bpp_cs.h
│ │ │ │ ├── resolve_full_128bpp_scaled_cs.h
│ │ │ │ ├── resolve_full_16bpp_cs.h
│ │ │ │ ├── resolve_full_16bpp_scaled_cs.h
│ │ │ │ ├── resolve_full_32bpp_cs.h
│ │ │ │ ├── resolve_full_32bpp_scaled_cs.h
│ │ │ │ ├── resolve_full_64bpp_cs.h
│ │ │ │ ├── resolve_full_64bpp_scaled_cs.h
│ │ │ │ ├── resolve_full_8bpp_cs.h
│ │ │ │ ├── resolve_full_8bpp_scaled_cs.h
│ │ │ │ ├── texture_load_128bpb_cs.h
│ │ │ │ ├── texture_load_128bpb_scaled_cs.h
│ │ │ │ ├── texture_load_16bpb_cs.h
│ │ │ │ ├── texture_load_16bpb_scaled_cs.h
│ │ │ │ ├── texture_load_32bpb_cs.h
│ │ │ │ ├── texture_load_32bpb_scaled_cs.h
│ │ │ │ ├── texture_load_64bpb_cs.h
│ │ │ │ ├── texture_load_64bpb_scaled_cs.h
│ │ │ │ ├── texture_load_8bpb_cs.h
│ │ │ │ ├── texture_load_8bpb_scaled_cs.h
│ │ │ │ ├── texture_load_bgrg8_rgb8_cs.h
│ │ │ │ ├── texture_load_bgrg8_rgbg8_cs.h
│ │ │ │ ├── texture_load_ctx1_cs.h
│ │ │ │ ├── texture_load_depth_float_cs.h
│ │ │ │ ├── texture_load_depth_float_scaled_cs.h
│ │ │ │ ├── texture_load_depth_unorm_cs.h
│ │ │ │ ├── texture_load_depth_unorm_scaled_cs.h
│ │ │ │ ├── texture_load_dxn_rg8_cs.h
│ │ │ │ ├── texture_load_dxt1_rgba8_cs.h
│ │ │ │ ├── texture_load_dxt3_rgba8_cs.h
│ │ │ │ ├── texture_load_dxt3a_cs.h
│ │ │ │ ├── texture_load_dxt3aas1111_argb4_cs.h
│ │ │ │ ├── texture_load_dxt3aas1111_bgra4_cs.h
│ │ │ │ ├── texture_load_dxt5_rgba8_cs.h
│ │ │ │ ├── texture_load_dxt5a_r8_cs.h
│ │ │ │ ├── texture_load_gbgr8_grgb8_cs.h
│ │ │ │ ├── texture_load_gbgr8_rgb8_cs.h
│ │ │ │ ├── texture_load_r10g11b11_rgba16_cs.h
│ │ │ │ ├── texture_load_r10g11b11_rgba16_scaled_cs.h
│ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_cs.h
│ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled_cs.h
│ │ │ │ ├── texture_load_r11g11b10_rgba16_cs.h
│ │ │ │ ├── texture_load_r11g11b10_rgba16_scaled_cs.h
│ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_cs.h
│ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled_cs.h
│ │ │ │ ├── texture_load_r16_snorm_float_cs.h
│ │ │ │ ├── texture_load_r16_snorm_float_scaled_cs.h
│ │ │ │ ├── texture_load_r16_unorm_float_cs.h
│ │ │ │ ├── texture_load_r16_unorm_float_scaled_cs.h
│ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_cs.h
│ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h
│ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_cs.h
│ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h
│ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_cs.h
│ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h
│ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h
│ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h
│ │ │ │ ├── texture_load_r5g6b5_b5g6r5_cs.h
│ │ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled_cs.h
│ │ │ │ ├── texture_load_rg16_snorm_float_cs.h
│ │ │ │ ├── texture_load_rg16_snorm_float_scaled_cs.h
│ │ │ │ ├── texture_load_rg16_unorm_float_cs.h
│ │ │ │ ├── texture_load_rg16_unorm_float_scaled_cs.h
│ │ │ │ ├── texture_load_rgba16_snorm_float_cs.h
│ │ │ │ ├── texture_load_rgba16_snorm_float_scaled_cs.h
│ │ │ │ ├── texture_load_rgba16_unorm_float_cs.h
│ │ │ │ └── texture_load_rgba16_unorm_float_scaled_cs.h
│ │ │ ├── clear_uint2.ps.hlsl
│ │ │ ├── continuous_quad.hlsli
│ │ │ ├── continuous_quad_1cp.hs.hlsl
│ │ │ ├── continuous_quad_4cp.hs.hlsl
│ │ │ ├── continuous_triangle.hlsli
│ │ │ ├── continuous_triangle_1cp.hs.hlsl
│ │ │ ├── continuous_triangle_3cp.hs.hlsl
│ │ │ ├── discrete_quad.hlsli
│ │ │ ├── discrete_quad_1cp.hs.hlsl
│ │ │ ├── discrete_quad_4cp.hs.hlsl
│ │ │ ├── discrete_triangle.hlsli
│ │ │ ├── discrete_triangle_1cp.hs.hlsl
│ │ │ ├── discrete_triangle_3cp.hs.hlsl
│ │ │ ├── edram.xesli
│ │ │ ├── endian.xesli
│ │ │ ├── float24_round.ps.hlsl
│ │ │ ├── float24_truncate.ps.hlsl
│ │ │ ├── fullscreen_cw.vs.xesl
│ │ │ ├── fxaa.cs.hlsl
│ │ │ ├── fxaa.hlsli
│ │ │ ├── fxaa_extreme.cs.hlsl
│ │ │ ├── host_depth_store.xesli
│ │ │ ├── host_depth_store_1xmsaa.cs.xesl
│ │ │ ├── host_depth_store_2xmsaa.cs.xesl
│ │ │ ├── host_depth_store_4xmsaa.cs.xesl
│ │ │ ├── passthrough_position_xy.vs.xesl
│ │ │ ├── pixel_formats.xesli
│ │ │ ├── resolve.xesli
│ │ │ ├── resolve_clear_32bpp.cs.xesl
│ │ │ ├── resolve_clear_32bpp.xesli
│ │ │ ├── resolve_clear_32bpp_scaled.cs.xesl
│ │ │ ├── resolve_clear_64bpp.cs.xesl
│ │ │ ├── resolve_clear_64bpp.xesli
│ │ │ ├── resolve_clear_64bpp_scaled.cs.xesl
│ │ │ ├── resolve_fast_32bpp_1x2xmsaa.cs.xesl
│ │ │ ├── resolve_fast_32bpp_1x2xmsaa.xesli
│ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled.cs.xesl
│ │ │ ├── resolve_fast_32bpp_4xmsaa.cs.xesl
│ │ │ ├── resolve_fast_32bpp_4xmsaa.xesli
│ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled.cs.xesl
│ │ │ ├── resolve_fast_64bpp_1x2xmsaa.cs.xesl
│ │ │ ├── resolve_fast_64bpp_1x2xmsaa.xesli
│ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled.cs.xesl
│ │ │ ├── resolve_fast_64bpp_4xmsaa.cs.xesl
│ │ │ ├── resolve_fast_64bpp_4xmsaa.xesli
│ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled.cs.xesl
│ │ │ ├── resolve_full_128bpp.cs.xesl
│ │ │ ├── resolve_full_128bpp.xesli
│ │ │ ├── resolve_full_128bpp_scaled.cs.xesl
│ │ │ ├── resolve_full_16bpp.cs.xesl
│ │ │ ├── resolve_full_16bpp.xesli
│ │ │ ├── resolve_full_16bpp_scaled.cs.xesl
│ │ │ ├── resolve_full_32bpp.cs.xesl
│ │ │ ├── resolve_full_32bpp.xesli
│ │ │ ├── resolve_full_32bpp_scaled.cs.xesl
│ │ │ ├── resolve_full_64bpp.cs.xesl
│ │ │ ├── resolve_full_64bpp.xesli
│ │ │ ├── resolve_full_64bpp_scaled.cs.xesl
│ │ │ ├── resolve_full_8bpp.cs.xesl
│ │ │ ├── resolve_full_8bpp.xesli
│ │ │ ├── resolve_full_8bpp_scaled.cs.xesl
│ │ │ ├── tessellation_adaptive.vs.hlsl
│ │ │ ├── tessellation_indexed.vs.hlsl
│ │ │ ├── texture_address.xesli
│ │ │ ├── texture_load.xesli
│ │ │ ├── texture_load_128bpb.cs.xesl
│ │ │ ├── texture_load_128bpb.xesli
│ │ │ ├── texture_load_128bpb_scaled.cs.xesl
│ │ │ ├── texture_load_16bpb.cs.xesl
│ │ │ ├── texture_load_16bpb.xesli
│ │ │ ├── texture_load_16bpb_scaled.cs.xesl
│ │ │ ├── texture_load_32bpb.cs.xesl
│ │ │ ├── texture_load_32bpb.xesli
│ │ │ ├── texture_load_32bpb_64bpb.xesli
│ │ │ ├── texture_load_32bpb_scaled.cs.xesl
│ │ │ ├── texture_load_64bpb.cs.xesl
│ │ │ ├── texture_load_64bpb.xesli
│ │ │ ├── texture_load_64bpb_scaled.cs.xesl
│ │ │ ├── texture_load_8bpb.cs.xesl
│ │ │ ├── texture_load_8bpb.xesli
│ │ │ ├── texture_load_8bpb_scaled.cs.xesl
│ │ │ ├── texture_load_bgrg8_rgb8.cs.xesl
│ │ │ ├── texture_load_bgrg8_rgbg8.cs.xesl
│ │ │ ├── texture_load_ctx1.cs.xesl
│ │ │ ├── texture_load_depth_float.cs.xesl
│ │ │ ├── texture_load_depth_float_scaled.cs.xesl
│ │ │ ├── texture_load_depth_unorm.cs.xesl
│ │ │ ├── texture_load_depth_unorm_scaled.cs.xesl
│ │ │ ├── texture_load_dxn_rg8.cs.xesl
│ │ │ ├── texture_load_dxt1_rgba8.cs.xesl
│ │ │ ├── texture_load_dxt3_rgba8.cs.xesl
│ │ │ ├── texture_load_dxt3a.cs.xesl
│ │ │ ├── texture_load_dxt3aas1111.xesli
│ │ │ ├── texture_load_dxt3aas1111_argb4.cs.xesl
│ │ │ ├── texture_load_dxt3aas1111_bgra4.cs.xesl
│ │ │ ├── texture_load_dxt5_rgba8.cs.xesl
│ │ │ ├── texture_load_dxt5a_r8.cs.xesl
│ │ │ ├── texture_load_gbgr8_grgb8.cs.xesl
│ │ │ ├── texture_load_gbgr8_rgb8.cs.xesl
│ │ │ ├── texture_load_r10g11b11_rgba16.cs.xesl
│ │ │ ├── texture_load_r10g11b11_rgba16_scaled.cs.xesl
│ │ │ ├── texture_load_r10g11b11_rgba16_snorm.cs.xesl
│ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled.cs.xesl
│ │ │ ├── texture_load_r11g11b10_rgba16.cs.xesl
│ │ │ ├── texture_load_r11g11b10_rgba16_scaled.cs.xesl
│ │ │ ├── texture_load_r11g11b10_rgba16_snorm.cs.xesl
│ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled.cs.xesl
│ │ │ ├── texture_load_r16_snorm_float.cs.xesl
│ │ │ ├── texture_load_r16_snorm_float_scaled.cs.xesl
│ │ │ ├── texture_load_r16_unorm_float.cs.xesl
│ │ │ ├── texture_load_r16_unorm_float_scaled.cs.xesl
│ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4.cs.xesl
│ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled.cs.xesl
│ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4.cs.xesl
│ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled.cs.xesl
│ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1.cs.xesl
│ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled.cs.xesl
│ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga.cs.xesl
│ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled.cs.xesl
│ │ │ ├── texture_load_r5g6b5_b5g6r5.cs.xesl
│ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled.cs.xesl
│ │ │ ├── texture_load_rg16_snorm_float.cs.xesl
│ │ │ ├── texture_load_rg16_snorm_float_scaled.cs.xesl
│ │ │ ├── texture_load_rg16_unorm_float.cs.xesl
│ │ │ ├── texture_load_rg16_unorm_float_scaled.cs.xesl
│ │ │ ├── texture_load_rgba16_snorm_float.cs.xesl
│ │ │ ├── texture_load_rgba16_snorm_float_scaled.cs.xesl
│ │ │ ├── texture_load_rgba16_unorm_float.cs.xesl
│ │ │ ├── texture_load_rgba16_unorm_float_scaled.cs.xesl
│ │ │ └── xenos_draw.hlsli
│ │ ├── shared_memory.cc
│ │ ├── shared_memory.h
│ │ ├── spirv_builder.cc
│ │ ├── spirv_builder.h
│ │ ├── spirv_shader.cc
│ │ ├── spirv_shader.h
│ │ ├── spirv_shader_translator.cc
│ │ ├── spirv_shader_translator.h
│ │ ├── spirv_shader_translator_alu.cc
│ │ ├── spirv_shader_translator_fetch.cc
│ │ ├── spirv_shader_translator_memexport.cc
│ │ ├── spirv_shader_translator_rb.cc
│ │ ├── texture_address.h
│ │ ├── texture_cache.cc
│ │ ├── texture_cache.h
│ │ ├── texture_dump.cc
│ │ ├── texture_extent.cc
│ │ ├── texture_info.cc
│ │ ├── texture_info.h
│ │ ├── texture_info_formats.cc
│ │ ├── texture_util.cc
│ │ ├── texture_util.h
│ │ ├── trace_dump.cc
│ │ ├── trace_dump.h
│ │ ├── trace_player.cc
│ │ ├── trace_player.h
│ │ ├── trace_protocol.h
│ │ ├── trace_reader.cc
│ │ ├── trace_reader.h
│ │ ├── trace_viewer.cc
│ │ ├── trace_viewer.h
│ │ ├── trace_writer.cc
│ │ ├── trace_writer.h
│ │ ├── ucode.cc
│ │ ├── ucode.h
│ │ ├── vulkan/
│ │ │ ├── deferred_command_buffer.cc
│ │ │ ├── deferred_command_buffer.h
│ │ │ ├── premake5.lua
│ │ │ ├── vulkan_command_processor.cc
│ │ │ ├── vulkan_command_processor.h
│ │ │ ├── vulkan_graphics_system.cc
│ │ │ ├── vulkan_graphics_system.h
│ │ │ ├── vulkan_pipeline_cache.cc
│ │ │ ├── vulkan_pipeline_cache.h
│ │ │ ├── vulkan_primitive_processor.cc
│ │ │ ├── vulkan_primitive_processor.h
│ │ │ ├── vulkan_render_target_cache.cc
│ │ │ ├── vulkan_render_target_cache.h
│ │ │ ├── vulkan_shader.cc
│ │ │ ├── vulkan_shader.h
│ │ │ ├── vulkan_shared_memory.cc
│ │ │ ├── vulkan_shared_memory.h
│ │ │ ├── vulkan_texture_cache.cc
│ │ │ ├── vulkan_texture_cache.h
│ │ │ ├── vulkan_trace_dump_main.cc
│ │ │ └── vulkan_trace_viewer_main.cc
│ │ ├── xenos.cc
│ │ └── xenos.h
│ ├── helper/
│ │ └── sdl/
│ │ ├── premake5.lua
│ │ ├── sdl_helper.cc
│ │ └── sdl_helper.h
│ ├── hid/
│ │ ├── hid_demo.cc
│ │ ├── hid_flags.cc
│ │ ├── hid_flags.h
│ │ ├── input.h
│ │ ├── input_driver.h
│ │ ├── input_system.cc
│ │ ├── input_system.h
│ │ ├── nop/
│ │ │ ├── nop_hid.cc
│ │ │ ├── nop_hid.h
│ │ │ ├── nop_input_driver.cc
│ │ │ ├── nop_input_driver.h
│ │ │ └── premake5.lua
│ │ ├── premake5.lua
│ │ ├── sdl/
│ │ │ ├── premake5.lua
│ │ │ ├── sdl_hid.cc
│ │ │ ├── sdl_hid.h
│ │ │ ├── sdl_input_driver.cc
│ │ │ └── sdl_input_driver.h
│ │ ├── winkey/
│ │ │ ├── premake5.lua
│ │ │ ├── winkey_binding_table.inc
│ │ │ ├── winkey_hid.cc
│ │ │ ├── winkey_hid.h
│ │ │ ├── winkey_input_driver.cc
│ │ │ └── winkey_input_driver.h
│ │ └── xinput/
│ │ ├── premake5.lua
│ │ ├── xinput_hid.cc
│ │ ├── xinput_hid.h
│ │ ├── xinput_input_driver.cc
│ │ └── xinput_input_driver.h
│ ├── kernel/
│ │ ├── debug_visualizers.natvis
│ │ ├── info/
│ │ │ ├── file.h
│ │ │ └── volume.h
│ │ ├── kernel_flags.cc
│ │ ├── kernel_flags.h
│ │ ├── kernel_module.cc
│ │ ├── kernel_module.h
│ │ ├── kernel_state.cc
│ │ ├── kernel_state.h
│ │ ├── premake5.lua
│ │ ├── user_module.cc
│ │ ├── user_module.h
│ │ ├── util/
│ │ │ ├── export_table_post.inc
│ │ │ ├── export_table_pre.inc
│ │ │ ├── gameinfo_utils.cc
│ │ │ ├── gameinfo_utils.h
│ │ │ ├── native_list.cc
│ │ │ ├── native_list.h
│ │ │ ├── object_table.cc
│ │ │ ├── object_table.h
│ │ │ ├── ordinal_table_post.inc
│ │ │ ├── ordinal_table_pre.inc
│ │ │ ├── shim_utils.cc
│ │ │ ├── shim_utils.h
│ │ │ ├── xdbf_utils.cc
│ │ │ ├── xdbf_utils.h
│ │ │ └── xex2_info.h
│ │ ├── xam/
│ │ │ ├── app_manager.cc
│ │ │ ├── app_manager.h
│ │ │ ├── apps/
│ │ │ │ ├── xam_app.cc
│ │ │ │ ├── xam_app.h
│ │ │ │ ├── xgi_app.cc
│ │ │ │ ├── xgi_app.h
│ │ │ │ ├── xlivebase_app.cc
│ │ │ │ ├── xlivebase_app.h
│ │ │ │ ├── xmp_app.cc
│ │ │ │ └── xmp_app.h
│ │ │ ├── content_manager.cc
│ │ │ ├── content_manager.h
│ │ │ ├── user_profile.cc
│ │ │ ├── user_profile.h
│ │ │ ├── xam_avatar.cc
│ │ │ ├── xam_content.cc
│ │ │ ├── xam_content_aggregate.cc
│ │ │ ├── xam_content_device.cc
│ │ │ ├── xam_content_device.h
│ │ │ ├── xam_enum.cc
│ │ │ ├── xam_info.cc
│ │ │ ├── xam_input.cc
│ │ │ ├── xam_locale.cc
│ │ │ ├── xam_module.cc
│ │ │ ├── xam_module.h
│ │ │ ├── xam_module_export_groups.inc
│ │ │ ├── xam_msg.cc
│ │ │ ├── xam_net.cc
│ │ │ ├── xam_notify.cc
│ │ │ ├── xam_nui.cc
│ │ │ ├── xam_ordinals.h
│ │ │ ├── xam_party.cc
│ │ │ ├── xam_private.h
│ │ │ ├── xam_table.inc
│ │ │ ├── xam_task.cc
│ │ │ ├── xam_ui.cc
│ │ │ ├── xam_user.cc
│ │ │ ├── xam_video.cc
│ │ │ └── xam_voice.cc
│ │ ├── xbdm/
│ │ │ ├── xbdm_misc.cc
│ │ │ ├── xbdm_module.cc
│ │ │ ├── xbdm_module.h
│ │ │ ├── xbdm_module_export_groups.inc
│ │ │ ├── xbdm_ordinals.h
│ │ │ ├── xbdm_private.h
│ │ │ └── xbdm_table.inc
│ │ ├── xboxkrnl/
│ │ │ ├── cert_monitor.cc
│ │ │ ├── cert_monitor.h
│ │ │ ├── debug_monitor.cc
│ │ │ ├── debug_monitor.h
│ │ │ ├── xboxkrnl_audio.cc
│ │ │ ├── xboxkrnl_audio_xma.cc
│ │ │ ├── xboxkrnl_crypt.cc
│ │ │ ├── xboxkrnl_debug.cc
│ │ │ ├── xboxkrnl_error.cc
│ │ │ ├── xboxkrnl_error.h
│ │ │ ├── xboxkrnl_hal.cc
│ │ │ ├── xboxkrnl_hid.cc
│ │ │ ├── xboxkrnl_io.cc
│ │ │ ├── xboxkrnl_io_info.cc
│ │ │ ├── xboxkrnl_memory.cc
│ │ │ ├── xboxkrnl_misc.cc
│ │ │ ├── xboxkrnl_module.cc
│ │ │ ├── xboxkrnl_module.h
│ │ │ ├── xboxkrnl_module_export_groups.inc
│ │ │ ├── xboxkrnl_modules.cc
│ │ │ ├── xboxkrnl_ob.cc
│ │ │ ├── xboxkrnl_ordinals.h
│ │ │ ├── xboxkrnl_private.h
│ │ │ ├── xboxkrnl_rtl.cc
│ │ │ ├── xboxkrnl_rtl.h
│ │ │ ├── xboxkrnl_strings.cc
│ │ │ ├── xboxkrnl_table.inc
│ │ │ ├── xboxkrnl_threading.cc
│ │ │ ├── xboxkrnl_threading.h
│ │ │ ├── xboxkrnl_usbcam.cc
│ │ │ ├── xboxkrnl_video.cc
│ │ │ ├── xboxkrnl_video.h
│ │ │ └── xboxkrnl_xconfig.cc
│ │ ├── xenumerator.cc
│ │ ├── xenumerator.h
│ │ ├── xevent.cc
│ │ ├── xevent.h
│ │ ├── xfile.cc
│ │ ├── xfile.h
│ │ ├── xiocompletion.cc
│ │ ├── xiocompletion.h
│ │ ├── xmodule.cc
│ │ ├── xmodule.h
│ │ ├── xmutant.cc
│ │ ├── xmutant.h
│ │ ├── xnotifylistener.cc
│ │ ├── xnotifylistener.h
│ │ ├── xobject.cc
│ │ ├── xobject.h
│ │ ├── xsemaphore.cc
│ │ ├── xsemaphore.h
│ │ ├── xsocket.cc
│ │ ├── xsocket.h
│ │ ├── xsymboliclink.cc
│ │ ├── xsymboliclink.h
│ │ ├── xthread.cc
│ │ ├── xthread.h
│ │ ├── xtimer.cc
│ │ └── xtimer.h
│ ├── memory.cc
│ ├── memory.h
│ ├── premake5.lua
│ ├── tools/
│ │ └── api-scanner/
│ │ ├── README.md
│ │ ├── api_scanner_loader.cc
│ │ ├── api_scanner_loader.h
│ │ └── api_scanner_main.cc
│ ├── ui/
│ │ ├── d3d12/
│ │ │ ├── d3d12_api.h
│ │ │ ├── d3d12_cpu_descriptor_pool.cc
│ │ │ ├── d3d12_cpu_descriptor_pool.h
│ │ │ ├── d3d12_descriptor_heap_pool.cc
│ │ │ ├── d3d12_descriptor_heap_pool.h
│ │ │ ├── d3d12_gpu_completion_timeline.cc
│ │ │ ├── d3d12_gpu_completion_timeline.h
│ │ │ ├── d3d12_immediate_drawer.cc
│ │ │ ├── d3d12_immediate_drawer.h
│ │ │ ├── d3d12_presenter.cc
│ │ │ ├── d3d12_presenter.h
│ │ │ ├── d3d12_provider.cc
│ │ │ ├── d3d12_provider.h
│ │ │ ├── d3d12_upload_buffer_pool.cc
│ │ │ ├── d3d12_upload_buffer_pool.h
│ │ │ ├── d3d12_util.cc
│ │ │ ├── d3d12_util.h
│ │ │ ├── d3d12_window_demo.cc
│ │ │ └── premake5.lua
│ │ ├── dxgi_include_win.h
│ │ ├── file_picker.h
│ │ ├── file_picker_android.cc
│ │ ├── file_picker_gtk.cc
│ │ ├── file_picker_win.cc
│ │ ├── gpu_completion_timeline.h
│ │ ├── graphics_provider.h
│ │ ├── graphics_upload_buffer_pool.cc
│ │ ├── graphics_upload_buffer_pool.h
│ │ ├── graphics_util.cc
│ │ ├── graphics_util.h
│ │ ├── imgui_dialog.cc
│ │ ├── imgui_dialog.h
│ │ ├── imgui_drawer.cc
│ │ ├── imgui_drawer.h
│ │ ├── immediate_drawer.cc
│ │ ├── immediate_drawer.h
│ │ ├── menu_item.cc
│ │ ├── menu_item.h
│ │ ├── microprofile_drawer.cc
│ │ ├── microprofile_drawer.h
│ │ ├── premake5.lua
│ │ ├── presenter.cc
│ │ ├── presenter.h
│ │ ├── renderdoc_api.cc
│ │ ├── renderdoc_api.h
│ │ ├── shaders/
│ │ │ ├── amd_language.xesli
│ │ │ ├── bytecode/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── d3d12_5_1/
│ │ │ │ │ ├── guest_output_bilinear_dither_ps.h
│ │ │ │ │ ├── guest_output_bilinear_ps.h
│ │ │ │ │ ├── guest_output_ffx_cas_resample_dither_ps.h
│ │ │ │ │ ├── guest_output_ffx_cas_resample_ps.h
│ │ │ │ │ ├── guest_output_ffx_cas_sharpen_dither_ps.h
│ │ │ │ │ ├── guest_output_ffx_cas_sharpen_ps.h
│ │ │ │ │ ├── guest_output_ffx_fsr_easu_ps.h
│ │ │ │ │ ├── guest_output_ffx_fsr_rcas_dither_ps.h
│ │ │ │ │ ├── guest_output_ffx_fsr_rcas_ps.h
│ │ │ │ │ ├── guest_output_triangle_strip_rect_vs.h
│ │ │ │ │ ├── immediate_ps.h
│ │ │ │ │ └── immediate_vs.h
│ │ │ │ └── vulkan_spirv/
│ │ │ │ ├── guest_output_bilinear_dither_ps.h
│ │ │ │ ├── guest_output_bilinear_ps.h
│ │ │ │ ├── guest_output_ffx_cas_resample_dither_ps.h
│ │ │ │ ├── guest_output_ffx_cas_resample_ps.h
│ │ │ │ ├── guest_output_ffx_cas_sharpen_dither_ps.h
│ │ │ │ ├── guest_output_ffx_cas_sharpen_ps.h
│ │ │ │ ├── guest_output_ffx_fsr_easu_ps.h
│ │ │ │ ├── guest_output_ffx_fsr_rcas_dither_ps.h
│ │ │ │ ├── guest_output_ffx_fsr_rcas_ps.h
│ │ │ │ ├── guest_output_triangle_strip_rect_vs.h
│ │ │ │ ├── immediate_ps.h
│ │ │ │ └── immediate_vs.h
│ │ │ ├── dither_8bpc.xesli
│ │ │ ├── guest_output_bilinear.ps.xesl
│ │ │ ├── guest_output_bilinear.xesli
│ │ │ ├── guest_output_bilinear_dither.ps.xesl
│ │ │ ├── guest_output_ffx_cas_resample.ps.xesl
│ │ │ ├── guest_output_ffx_cas_resample.xesli
│ │ │ ├── guest_output_ffx_cas_resample_dither.ps.xesl
│ │ │ ├── guest_output_ffx_cas_sharpen.ps.xesl
│ │ │ ├── guest_output_ffx_cas_sharpen.xesli
│ │ │ ├── guest_output_ffx_cas_sharpen_dither.ps.xesl
│ │ │ ├── guest_output_ffx_fsr_easu.ps.xesl
│ │ │ ├── guest_output_ffx_fsr_rcas.ps.xesl
│ │ │ ├── guest_output_ffx_fsr_rcas.xesli
│ │ │ ├── guest_output_ffx_fsr_rcas_dither.ps.xesl
│ │ │ ├── guest_output_triangle_strip_rect.vs.xesl
│ │ │ ├── immediate.ps.xesl
│ │ │ ├── immediate.vs.xesl
│ │ │ ├── noise.xesli
│ │ │ └── xesl.xesli
│ │ ├── surface.h
│ │ ├── surface_android.cc
│ │ ├── surface_android.h
│ │ ├── surface_gnulinux.cc
│ │ ├── surface_gnulinux.h
│ │ ├── surface_win.cc
│ │ ├── surface_win.h
│ │ ├── ui_drawer.h
│ │ ├── ui_event.h
│ │ ├── virtual_key.h
│ │ ├── vulkan/
│ │ │ ├── functions/
│ │ │ │ ├── device_1_0.inc
│ │ │ │ ├── device_1_1_khr_bind_memory2.inc
│ │ │ │ ├── device_1_1_khr_get_memory_requirements2.inc
│ │ │ │ ├── device_1_3_khr_maintenance4.inc
│ │ │ │ ├── device_khr_swapchain.inc
│ │ │ │ ├── instance_1_0.inc
│ │ │ │ ├── instance_1_1_khr_get_physical_device_properties2.inc
│ │ │ │ ├── instance_ext_debug_utils.inc
│ │ │ │ ├── instance_khr_android_surface.inc
│ │ │ │ ├── instance_khr_surface.inc
│ │ │ │ ├── instance_khr_win32_surface.inc
│ │ │ │ └── instance_khr_xcb_surface.inc
│ │ │ ├── linked_type_descriptor_set_allocator.cc
│ │ │ ├── linked_type_descriptor_set_allocator.h
│ │ │ ├── premake5.lua
│ │ │ ├── single_layout_descriptor_set_pool.cc
│ │ │ ├── single_layout_descriptor_set_pool.h
│ │ │ ├── spirv_tools_context.cc
│ │ │ ├── spirv_tools_context.h
│ │ │ ├── ui_samplers.cc
│ │ │ ├── ui_samplers.h
│ │ │ ├── vulkan_api.h
│ │ │ ├── vulkan_device.cc
│ │ │ ├── vulkan_device.h
│ │ │ ├── vulkan_gpu_completion_timeline.cc
│ │ │ ├── vulkan_gpu_completion_timeline.h
│ │ │ ├── vulkan_immediate_drawer.cc
│ │ │ ├── vulkan_immediate_drawer.h
│ │ │ ├── vulkan_instance.cc
│ │ │ ├── vulkan_instance.h
│ │ │ ├── vulkan_mem_alloc.cc
│ │ │ ├── vulkan_mem_alloc.h
│ │ │ ├── vulkan_presenter.cc
│ │ │ ├── vulkan_presenter.h
│ │ │ ├── vulkan_provider.cc
│ │ │ ├── vulkan_provider.h
│ │ │ ├── vulkan_upload_buffer_pool.cc
│ │ │ ├── vulkan_upload_buffer_pool.h
│ │ │ ├── vulkan_util.cc
│ │ │ ├── vulkan_util.h
│ │ │ └── vulkan_window_demo.cc
│ │ ├── window.cc
│ │ ├── window.h
│ │ ├── window_android.cc
│ │ ├── window_android.h
│ │ ├── window_demo.cc
│ │ ├── window_demo.h
│ │ ├── window_gtk.cc
│ │ ├── window_gtk.h
│ │ ├── window_listener.h
│ │ ├── window_win.cc
│ │ ├── window_win.h
│ │ ├── windowed_app.cc
│ │ ├── windowed_app.h
│ │ ├── windowed_app_context.cc
│ │ ├── windowed_app_context.h
│ │ ├── windowed_app_context_android.cc
│ │ ├── windowed_app_context_android.h
│ │ ├── windowed_app_context_gtk.cc
│ │ ├── windowed_app_context_gtk.h
│ │ ├── windowed_app_context_win.cc
│ │ ├── windowed_app_context_win.h
│ │ ├── windowed_app_main_android.cc
│ │ ├── windowed_app_main_posix.cc
│ │ └── windowed_app_main_win.cc
│ ├── vfs/
│ │ ├── device.cc
│ │ ├── device.h
│ │ ├── devices/
│ │ │ ├── disc_image_device.cc
│ │ │ ├── disc_image_device.h
│ │ │ ├── disc_image_entry.cc
│ │ │ ├── disc_image_entry.h
│ │ │ ├── disc_image_file.cc
│ │ │ ├── disc_image_file.h
│ │ │ ├── host_path_device.cc
│ │ │ ├── host_path_device.h
│ │ │ ├── host_path_entry.cc
│ │ │ ├── host_path_entry.h
│ │ │ ├── host_path_file.cc
│ │ │ ├── host_path_file.h
│ │ │ ├── null_device.cc
│ │ │ ├── null_device.h
│ │ │ ├── null_entry.cc
│ │ │ ├── null_entry.h
│ │ │ ├── null_file.cc
│ │ │ ├── null_file.h
│ │ │ ├── stfs_container_device.cc
│ │ │ ├── stfs_container_device.h
│ │ │ ├── stfs_container_entry.cc
│ │ │ ├── stfs_container_entry.h
│ │ │ ├── stfs_container_file.cc
│ │ │ ├── stfs_container_file.h
│ │ │ └── stfs_xbox.h
│ │ ├── entry.cc
│ │ ├── entry.h
│ │ ├── file.h
│ │ ├── premake5.lua
│ │ ├── testing/
│ │ │ ├── premake5.lua
│ │ │ └── vfs_test.cc
│ │ ├── vfs_dump.cc
│ │ ├── virtual_file_system.cc
│ │ └── virtual_file_system.h
│ └── xbox.h
├── third_party/
│ ├── .clang-format
│ ├── SDL2-static.lua
│ ├── SDL2.lua
│ ├── aes_128.lua
│ ├── binutils/
│ │ ├── README.md
│ │ └── build.sh
│ ├── capstone.lua
│ ├── clang-format/
│ │ ├── LICENSE.TXT
│ │ ├── clang-format-bbedit.applescript
│ │ ├── clang-format-diff.py
│ │ ├── clang-format-sublime.py
│ │ ├── clang-format.el
│ │ ├── clang-format.py
│ │ └── git-clang-format
│ ├── cpptoml.lua
│ ├── crypto/
│ │ ├── TinySHA1.hpp
│ │ ├── des/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── des.cpp
│ │ │ ├── des.h
│ │ │ ├── des3.h
│ │ │ ├── des_data.h
│ │ │ ├── des_key.h
│ │ │ ├── des_lookup.h
│ │ │ └── descbc.h
│ │ ├── rc4.c
│ │ ├── rc4.h
│ │ ├── rijndael-alg-fst.c
│ │ ├── rijndael-alg-fst.h
│ │ ├── sha256.cpp
│ │ └── sha256.h
│ ├── cxxopts.lua
│ ├── discord-rpc.lua
│ ├── dxbc/
│ │ ├── DXBCChecksum.cpp
│ │ └── DXBCChecksum.h
│ ├── dxbc.lua
│ ├── fmt.lua
│ ├── fxaa/
│ │ ├── FXAA3_11.h
│ │ └── LICENSE
│ ├── glslang-spirv.lua
│ ├── google-styleguide/
│ │ └── cpplint/
│ │ ├── README
│ │ └── cpplint.py
│ ├── half/
│ │ ├── ChangeLog.txt
│ │ ├── LICENSE.txt
│ │ ├── README.txt
│ │ └── include/
│ │ └── half.hpp
│ ├── imgui.lua
│ ├── llvm/
│ │ ├── LICENSE.txt
│ │ ├── dummy.cc
│ │ └── include/
│ │ └── llvm/
│ │ ├── ADT/
│ │ │ └── BitVector.h
│ │ └── Support/
│ │ ├── Compiler.h
│ │ ├── MathExtras.h
│ │ └── type_traits.h
│ ├── microprofile/
│ │ ├── README.md
│ │ ├── microprofile.h
│ │ ├── microprofiledraw.h
│ │ ├── microprofilehtml.h
│ │ └── microprofileui.h
│ ├── mspack/
│ │ ├── COPYING.LIB
│ │ ├── config.h
│ │ ├── logging.cc
│ │ ├── lzx.h
│ │ ├── lzxd.c
│ │ ├── mspack.h
│ │ ├── readbits.h
│ │ ├── readhuff.h
│ │ ├── system.c
│ │ └── system.h
│ ├── mspack.lua
│ ├── pe/
│ │ └── pe_image.h
│ ├── renderdoc/
│ │ └── renderdoc_app.h
│ ├── snappy.lua
│ ├── stb/
│ │ ├── stb_image.h
│ │ └── stb_image_write.h
│ └── xxhash.lua
├── tools/
│ ├── build/
│ │ ├── premake
│ │ ├── premake5.lua
│ │ ├── scripts/
│ │ │ ├── build_paths.lua
│ │ │ ├── force_compile_as_c.lua
│ │ │ ├── force_compile_as_cc.lua
│ │ │ ├── pkg_config.lua
│ │ │ ├── platform_files.lua
│ │ │ ├── single_library.lua
│ │ │ ├── test_suite.lua
│ │ │ └── util.lua
│ │ └── src/
│ │ └── test_suite_main.cc
│ ├── diff.py
│ ├── generate_map.idc
│ ├── gpu-trace-diff
│ ├── ppc-instructions.xml
│ ├── ppc-table-gen
│ ├── shader-playground/
│ │ ├── App.config
│ │ ├── Editor.Designer.cs
│ │ ├── Editor.cs
│ │ ├── Editor.resx
│ │ ├── Program.cs
│ │ ├── README.md
│ │ ├── shader-playground.csproj
│ │ └── shader-playground.sln
│ ├── vswhere/
│ │ └── LICENSE.txt
│ └── xenosci/
│ └── local_runner.py
├── xb.bat
├── xb.ps1
├── xenia-build
└── xeniarc
================================================
FILE CONTENTS
================================================
================================================
FILE: .appveyor.yml
================================================
version: 1.0.{build}-{branch}
branches:
except:
- gh-pages
skip_tags: true
skip_commits:
files:
- .drone.star
- .github/**
- android/**
- docs/**
- src/**/*_posix.*
- src/**/*_linux.*
- src/**/*_gnulinux.*
- src/**/*_x11.*
- src/**/*_gtk.*
- src/**/*_android.*
- src/**/*_mac.*
- LICENSE
- README.md
skip_branch_with_pr: true
pull_requests:
do_not_increment_build_number: true
os: Visual Studio 2019
init:
- ps: |
If (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) {
$env:is_not_pr = "true"
}
If (-Not $env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED) {
$env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED = " "
}
install:
- |
vcpkg integrate remove
xb setup
platform: Windows
configuration: [Release, Checked]
build_script:
- xb build --config=%CONFIGURATION% --target=src\xenia-app --target=tests\xenia-base-tests --target=tests\xenia-cpu-ppc-tests --target=src\xenia-vfs-dump
after_build:
- |
IF NOT "%CONFIGURATION%"=="Checked" SET "ARCHIVE_SUFFIX=%APPVEYOR_REPO_BRANCH%"
IF NOT "%CONFIGURATION%"=="Checked" SET "ARCHIVE_SWITCHES=--"
IF "%CONFIGURATION%"=="Checked" SET "ARCHIVE_SUFFIX=%APPVEYOR_REPO_BRANCH%_FOR-DEVS-ONLY"
IF "%CONFIGURATION%"=="Checked" SET "ARCHIVE_SWITCHES="-pI know what I am doing." --"
7z a xenia_%ARCHIVE_SUFFIX%.zip %ARCHIVE_SWITCHES% LICENSE "%APPVEYOR_BUILD_FOLDER%\build\bin\%PLATFORM%\%CONFIGURATION%\xenia.exe" "%APPVEYOR_BUILD_FOLDER%\build\bin\%PLATFORM%\%CONFIGURATION%\xenia.pdb"
7z a xenia-vfs-dump_%ARCHIVE_SUFFIX%.zip %ARCHIVE_SWITCHES% LICENSE "%APPVEYOR_BUILD_FOLDER%\build\bin\%PLATFORM%\%CONFIGURATION%\xenia-vfs-dump.exe" "%APPVEYOR_BUILD_FOLDER%\build\bin\%PLATFORM%\%CONFIGURATION%\xenia-vfs-dump.pdb"
before_test:
- xb gentests
test_script:
- xb test --config=%CONFIGURATION% --no_build
artifacts:
- path: '*.zip'
- path: xenia-cpu-ppc-test.log
deploy:
- provider: Environment
name: xenia-master
release: xenia-$(appveyor_repo_branch)-v$(appveyor_build_version)
artifact: '*.zip'
draft: false
prerelease: true
on:
branch: master
configuration: release
appveyor_repo_tag: true
is_not_pr: true
- provider: GitHub
name: xenia-master
repository: xenia-project/release-builds-windows
auth_token:
secure: /8he47z1WnPN7LcCTe5T5KMxxX0SmqFj9QMpeWEa3aZ64kMsfupOT/jKakqTM8af
tag: v$(appveyor_build_version)
release: v$(appveyor_build_version)
description: |
Windows release build for https://github.com/xenia-project/xenia/commit/$(APPVEYOR_REPO_COMMIT).
$(APPVEYOR_REPO_COMMIT_MESSAGE)
$(APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED)
draft: false
prerelease: false
on:
branch: master
configuration: release
is_not_pr: true
================================================
FILE: .clang-format
================================================
---
BasedOnStyle: Google
DerivePointerAlignment: false
PointerAlignment: Left
SortIncludes: true
# Regroup causes unnecessary noise due to clang-format bug.
IncludeBlocks: Preserve
---
Language: Java
DisableFormat: true
SortIncludes: false
================================================
FILE: .drone.star
================================================
def main(ctx):
return [
pipeline_lint(),
pipeline_linux_desktop('x86_64-linux-clang', image_linux_x86_64(), 'amd64', 'clang', True),
pipeline_linux_desktop('x86_64-linux-gcc', image_linux_x86_64(), 'amd64', 'gcc', False), # GCC release linking is really slow
pipeline_android('x86_64-android', image_linux_x86_64(), 'amd64', 'Android-x86_64'),
pipeline_android('aarch64-android', image_linux_x86_64(), 'amd64', 'Android-ARM64'),
]
def image_linux_x86_64():
return 'xeniaproject/buildenv:2022-07-15'
def volume_build(toolchain, path='/drone/src/build'):
return {
'name': 'build-' + toolchain,
'path': path,
}
def command_cc(cc):
# set CC, CXX, ...
return 'export $(cat /{}.env | sed \'s/#.*//g\' | xargs)'.format(cc)
def command_ndk_build(platform, configuration, target):
return '$ANDROID_NDK_ROOT/build/ndk-build NDK_PROJECT_PATH:=./bin/{configuration} NDK_APPLICATION_MK:=./xenia.Application.mk PREMAKE_ANDROIDNDK_PLATFORMS:={platform} PREMAKE_ANDROIDNDK_CONFIGURATIONS:={configuration} -j$(nproc) {target}'.format(platform=platform, configuration=configuration, target=target)
def xenia_base_tests_filters():
# https://github.com/xenia-project/xenia/issues/2036
return 'exclude:"Wait on Timer" exclude:"Wait on Multiple Timers" exclude:"HighResolutionTimer"'
# Run lint in a separate pipeline so that it will try building even if lint fails
def pipeline_lint():
return {
'kind': 'pipeline',
'type': 'docker',
'name': 'lint',
'steps': [
{
'name': 'lint',
'image': image_linux_x86_64(),
'commands': [
'clang-format --version',
'./xenia-build lint --all',
],
},
],
}
def pipeline_linux_desktop(name, image, arch, cc, build_release_all):
return {
'kind': 'pipeline',
'type': 'docker',
'name': name,
'platform': {
'os': 'linux',
'arch': arch,
},
# These volumes will be mounted at the build directory, allowing to
# run different premake toolchains from the same source tree
'volumes': [
{
'name': 'build-premake',
'temp': {},
},
{
'name': 'build-cmake',
'temp': {},
},
],
'steps': [
#
# Setup the source tree
#
{
'name': 'clone-submodules',
'image': image,
'commands': [
'pwd',
# May miss recursive submodules (but faster than xb setup)
'git submodule update --init --depth 1 -j $(nproc)',
],
},
#
# Setup the two build systems
#
# Native premake Makefiles for production
{
'name': 'toolchain-premake',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
command_cc(cc),
'$CXX --version',
'python3 --version',
'./xenia-build premake --cc={}'.format(cc),
],
'depends_on': ['clone-submodules'],
},
# Development toolchain
{
'name': 'toolchain-cmake',
'image': image,
'volumes': [volume_build('cmake')],
'commands': [
command_cc(cc),
'''
./xenia-build premake --cc={} --devenv=cmake
cd build
for c in Debug Release
do
mkdir cmake-$c
cmake -S . -B cmake-$c -G Ninja -DCMAKE_BUILD_TYPE=$c
done
'''.format(cc),
],
# Premake itself needs to be build first:
'depends_on': ['toolchain-premake'],
},
#
# Building
#
{
'name': 'build-premake-debug-tests',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
command_cc(cc),
'./xenia-build build --no_premake -j$(nproc) --config=Debug --target=xenia-base-tests',
],
'depends_on': ['toolchain-premake'],
},
{
'name': 'build-premake-debug-all',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
command_cc(cc),
'./xenia-build build --no_premake -j$(nproc) --config=Debug',
],
'depends_on': ['build-premake-debug-tests'],
},
{
'name': 'build-premake-release-tests',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
command_cc(cc),
'./xenia-build build --no_premake -j$(nproc) --config=Release --target=xenia-base-tests',
],
'depends_on': ['toolchain-premake'],
},
] + ([
{
'name': 'build-premake-release-all',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
command_cc(cc),
'./xenia-build build --no_premake -j$(nproc) --config=Release',
],
'depends_on': ['build-premake-release-tests'],
},
] if build_release_all else []) + [
{
'name': 'build-cmake-debug-all',
'image': image,
'volumes': [volume_build('cmake')],
'commands': [
command_cc(cc),
'cd build/cmake-Debug',
'cmake --build . -j$(nproc)',
],
'depends_on': ['toolchain-cmake'],
},
{
'name': 'build-cmake-release-tests',
'image': image,
'volumes': [volume_build('cmake')],
'commands': [
command_cc(cc),
'cd build/cmake-Release',
'cmake --build . -j$(nproc) --target xenia-base-tests',
],
'depends_on': ['toolchain-cmake'],
},
] + ([
{
'name': 'build-cmake-release-all',
'image': image,
'volumes': [volume_build('cmake')],
'commands': [
command_cc(cc),
'cd build/cmake-Release',
'cmake --build . -j$(nproc)',
],
'depends_on': ['build-cmake-release-tests'],
},
] if build_release_all else []) + [
#
# Tests
#
{
'name': 'test-premake-debug-valgrind',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
'valgrind --error-exitcode=99 ./build/bin/Linux/Debug/xenia-base-tests --durations yes ' + xenia_base_tests_filters(),
],
'depends_on': ['build-premake-debug-tests'],
},
{
'name': 'test-premake-release',
'image': image,
'volumes': [volume_build('premake')],
'commands': [
'./build/bin/Linux/Release/xenia-base-tests --success --durations yes ' + xenia_base_tests_filters(),
],
'depends_on': ['build-premake-release-tests'],
},
{
'name': 'test-cmake-release',
'image': image,
'volumes': [volume_build('cmake')],
'commands': [
'./build/bin/Linux/Release/xenia-base-tests --success --durations yes ' + xenia_base_tests_filters(),
],
'depends_on': ['build-cmake-release-tests'],
},
#
# Stat
#
{
'name': 'stat',
'image': image,
'volumes': [
volume_build('premake', '/build-premake'),
volume_build('cmake', '/build-cmake'),
],
'commands': [
'''
header() {
SEP='============================================================'
echo
echo $SEP
echo $@
echo $SEP
}
for v in premake cmake
do
for c in Debug Release
do
header $v $c
p=/build-$v/bin/Linux/$c
ls -la $p
sha256sum $p/*
done
done
'''
],
'depends_on': [
'build-premake-debug-all',
'build-cmake-debug-all',
] + ([
'build-premake-release-all',
'build-cmake-release-all',
] if build_release_all else [
'build-premake-release-tests',
'build-cmake-release-tests',
]),
},
],
}
def pipeline_android(name, image, arch, platform):
return {
'kind': 'pipeline',
'type': 'docker',
'name': name,
'platform': {
'os': 'linux',
'arch': arch,
},
'steps': [
#
# Setup the source tree
#
{
'name': 'clone-submodules',
'image': image,
'commands': [
'pwd',
# May miss recursive submodules (but faster than xb setup)
'git submodule update --init --depth 1 -j $(nproc)',
],
},
#
# Build premake and generate NDK makefiles
#
# NDK Makefiles
{
'name': 'toolchain',
'image': image,
'commands': [
'c++ --version',
'python3 --version',
'./xenia-build premake --target_os android',
],
'depends_on': ['clone-submodules'],
},
#
# Building
#
{
'name': 'build-debug',
'image': image,
'commands': [
'cd build',
command_ndk_build(platform, 'Debug', 'all'),
],
'depends_on': ['toolchain'],
},
{
'name': 'build-release',
'image': image,
'commands': [
'cd build',
command_ndk_build(platform, 'Release', 'all'),
],
'depends_on': ['toolchain'],
},
#
# Stat
#
{
'name': 'stat',
'image': image,
'commands': [
'''
header() {
SEP='============================================================'
echo
echo $SEP
echo $@
echo $SEP
}
for c in Debug Release
do
header $c
p=build/bin/$c/obj/local/*
ls -la $p
sha256sum $p/* || true
done
'''
],
'depends_on': [
'build-debug',
'build-release',
],
},
],
}
================================================
FILE: .gdbinit
================================================
# Ignore HighResolutionTimer custom event
handle SIG34 nostop noprint
# Ignore PosixTimer custom event
handle SIG35 nostop noprint
# Ignore PosixThread exit event
handle SIG32 nostop noprint
# Ignore PosixThread suspend event
handle SIG36 nostop noprint
# Ignore PosixThread user callback event
handle SIG37 nostop noprint
================================================
FILE: .gitattributes
================================================
* text=auto whitespace=blank-at-eol,tab-in-indent,trailing-space,tabwidth=2
*.bat text eol=crlf
*.sh text eol=lf
*.sln text eol=crlf -whitespace
*.csproj text eol=crlf -whitespace merge=union
*.vcxproj text eol=crlf -whitespace merge=union
*.props text eol=crlf -whitespace merge=union
src/**/shaders/bytecode/** linguist-generated=true
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Content Guidelines
The issue tracker is exclusively for filing and discussing bugs, feature
requests, and tracking work items. It is not for technical support or general
discussion. Avoid discussing any illegal activity, such as downloading games.
**Repeated misuses will result in a permanent project ban.**
## Information Sourcing
All information in xenia has been derived from reverse engineering legally-owned
games, hardware, and tools made public by Microsoft (such as the XNA Game Studio
tooling), scouring documentation made public by Microsoft (such as slide decks
and other presentations at conferences), and information from code made public
by 3rd party companies (like the Valve SDKs).
The official Microsoft Xbox Development Kits (XDKs) are not to be used for any
information added to the project. The contributors do not want the XDKs, nor do
they want any information derived from them. The challenge of the project is
what makes it fun! Poisoning the codebase with code obtained by shady means
could result in the project being terminated, so just don't do it.
**Posting any information directly from an XDK will result in a project ban.**
# Contributing Code
## Style Guide
Please read over [style_guide.md](../docs/style_guide.md) before sending pull requests
and ensure your code is clean as the buildbot (or I) will make you to fix it :)
[style_guide.md](../docs/style_guide.md) has information about using `xb format` and
various IDE auto formatting tools so that you can avoid having to clean things
up later, so be sure to check it out.
Basically: run `xb format` before you add a commit and you won't have a problem.
## Referencing Sources
In code interacting with guest interfaces or protocols, where applicable, please
leave comments describing how the information included in it was obtained. For
code based on analysis of the response of the original Xbox 360 hardware or
software, please provide reproduction information, such as an outline of the
algorithm executed, arguments and results of function calls or processor
instructions involved, GPU or XMA commands and state register changes. Having
traceable sources helps solve multiple issues:
* The legality of the submitted code can be verified easily.
* Additional analysis based on reproduction steps from prior research can be
done to discover more details or to research the behavior of other related
features.
* The accuracy and completeness of the information can be evaluated. Knowing
whether something is ground truth about the console's behavior or an
approximation (for example, based on similar functionality in Windows, the
Qualcomm Adreno 200 GPU, AMD's desktop GPU architectures; the Direct3D 11.3
functional specification, which may be used as a generic fallback when no
information specific to the Xenos or Direct3D 9 is available) may help avoid
redoing work that has already been done if the findings are accurate, or
making potentially wrong conclusions about related functionality if there's no
certainty about the correctness of the information. In addition, it's useful
to describe how complete the implementation of a feature is — such as edge
cases checked and covered. If you are unsure if your code accurately reflects
the behavior of the console, or you have deliberately made deviations due to
the lack of prerequisites for an accurate implementation or for performance
reasons (in case of the latter, it's recommended to provide both options,
selectable with a configuration variable), or you just want more research to
be done in the future, please leave a TODO comment in the format provided in
[style_guide.md](../docs/style_guide.md).
If you have verified your code by checking the correctness of the behavior of a
game, **do not** refer to it by its title trademark. To avoid unnecessary
dependencies on third parties, instead, use the hexadecimal title ID number
displayed in the title bar beside the name of the game. It's also recommended to
avoid using proper names of game content if they can be replaced with easily
understandable pointers not including them, such as "first mission",
"protagonist", "enemy aircraft".
Do not leave any hard-coded references to specific games, even in title ID form,
in any part of the user interface, including the configuration file. If you want
to provide an example of a game where changing a configuration variable may have
a noticeable effect, use a code comment near the declaration of the variable
rather than its description string. Any game identifiers referenced in the user
interface must be obtained only from information provided by the user such as
game data files.
Also, do not put any conditionals based on hard-coded identifiers of games — the
task of the project is researching the Xbox 360 console itself and documenting
its behavior by creating open implementations of its interfaces. Game-specific
hacks provide no help in achieving that, instead only complicating research by
introducing incorrect state and hiding the symptoms of actual issues. While
temporary workarounds, though discouraged, may be added in cases when progress
would be blocked otherwise in other areas, they must be expressed and reasoned
in terms of the common interface rather than logic internal to a specific game.
## Clean Git History
Tools such as `git bisect` are used on the repository regularly to check for and
identify regressions. Such tools require a clean git history to function
properly. Incoming pull requests must follow good git rules, the most basic of
which is that individual commits add functionality in somewhat working form and
fully compile and run on their own. Small pull requests with a single commit are
best and multiple commits in a pull request are allowed only if they are
kept clean. If not clean, you will be asked to rebase your pulls (and if
you don't know what that means, avoid getting into that situation ;).
Example of a bad commit history:
* Adding audio callback, random file loading, networking, etc. (+2000 lines)
* Whoops.
* Fixing build break.
* Fixing lint errors.
* Adding audio callback, second attempt.
* ...
Histories like this make it extremely difficult to check out any individual
commit and know that the repository is in a good state. Rebasing,
cherry-picking, or splitting your commits into separate branches will help keep
things clean and easy.
# License
All xenia code is licensed under the 3-clause BSD license as detailed in
[LICENSE](../LICENSE). Code under `third_party/` is licensed under its original
license.
Incoming code in pull requests are subject to the xenia [LICENSE](../LICENSE).
Once code comes into the codebase it is very difficult to ever fully remove so
copyright is ascribed to the project to prevent future disputes such as what
occurred in [Dolphin](https://dolphin-emu.org/blog/2015/05/25/relicensing-dolphin/).
That said: xenia will never be sold, never be made closed source, and never
change to a fundamentally incompatible license.
Any `third_party/` code added will be reviewed for conformance with the license.
In general, GPL code is forbidden unless it is used exclusively for
development-time tooling (like compiling). LGPL code is strongly discouraged as
it complicates building.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug report
description: Template for bug reports.
labels: bug
body:
- id: disclaimer
type: markdown
attributes:
value: |
Try to create a very concise title that's straight to the point.
**THIS IS NOT A SUPPORT FORUM!** For support, first read the wiki: https://github.com/xenia-project/xenia/wiki
If your question wasn't answered there or you need help, proceed to #help in the Discord server: https://discord.gg/Q9mxZf9
DO NOT CREATE ISSUES ABOUT SPECIFIC GAMES IN THIS REPOSITORY!
A game specific issue would be e.g. "Game X crashes after you hit a character a certain way"
A Xenia issue would be e.g. "Kernel export NtDoSomething does nothing"
For specific games, visit https://github.com/xenia-project/game-compatibility#game-compatibility
- id: validation
type: checkboxes
attributes:
label: Validation
options:
- label: I've read the [FAQ](https://github.com/xenia-project/xenia/wiki/FAQ).
required: true
- label: The Xenia build used is from the master branch (not MLBS/AlexVS/Canary/pull requests, etc.)
required: true
- label: This issue isn't for tech support (help with Xenia).
required: true
- label: If this issue occurs in a specific game, I've done analysis to locate the faulty subsystem of the emulator and a potential reason in it.
required: true
- label: I've checked if this issue hasn't already been reported.
required: true
- label: 'My device meets the minimum requirements: https://github.com/xenia-project/xenia/wiki/Quickstart#system-requirements'
required: true
- label: '(If building) I have read the building doc: https://github.com/xenia-project/xenia/blob/master/docs/building.md'
- id: problem
type: textarea
attributes:
label: Describe what's going wrong
validations:
required: true
- id: what-should-happen
type: textarea
attributes:
label: Describe what should happen
validations:
required: true
- id: callstack
type: textarea
attributes:
label: If applicable, provide a callstack here, especially for crashes
- id: logfile
type: textarea
attributes:
label: If applicable, upload a logfile and link it here
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
- name: Xenia Discord server
url: https://discord.gg/Q9mxZf9
about: Tech support for Xenia belongs here.
================================================
FILE: .gitignore
================================================
# ==============================================================================
# Misc system junk
# ==============================================================================
.DS_Store
._*
.Spotlight-V100
.Trashes
.com.apple.*
Thumbs.db
Desktop.ini
.svn
# Microprofile settings
.microprofilepreset.*
# ==============================================================================
# Projects/IDE files
# ==============================================================================
*~
# Sublime Text
*.sublime-project
*.sublime-workspace
# VIM
.*.sw[a-z]
*.un~
Session.vim
# TextMate
*.tmproj
*.tmproject
tmtags
# Eclipse
.project
.metadata
# WebStorm
.idea
# VS
.vs
*.user
*.sdf
*.opensdf
*.suo
bin/
obj/
# VSCode
.vscode
# ==============================================================================
# Temp generated code
# ==============================================================================
*.py[co]
.coverage
*.o
*.aps
# ==============================================================================
# Logs and dumps
# ==============================================================================
npm-debug.log
private/
*.trace
imgui.ini
*.log
# ==============================================================================
# Build system output
# ==============================================================================
# npm/node
.lock-wscript
node_modules/
node_modules/**/build/
node_modules/.bin/
# coverage/etc
/scratch/
/build/
# ==============================================================================
# Local-only paths
# ==============================================================================
.vagrant
/attic/
/content/
/third_party/binutils/binutils-2.24.tar.gz
/third_party/binutils/bin/
/third_party/binutils/powerpc-none-elf/
/third_party/binutils/share/
/third_party/binutils/binutils*
/third_party/vasm/
/tools/shader-playground/*.dll
================================================
FILE: .gitmodules
================================================
[submodule "third_party/xbyak"]
path = third_party/xbyak
url = https://github.com/xenia-project/xbyak.git
[submodule "third_party/imgui"]
path = third_party/imgui
url = https://github.com/ocornut/imgui.git
[submodule "third_party/binutils-ppc-cygwin"]
path = third_party/binutils-ppc-cygwin
url = https://github.com/benvanik/binutils-ppc-cygwin.git
[submodule "third_party/catch"]
path = third_party/catch
url = https://github.com/catchorg/Catch2.git
[submodule "third_party/premake-core"]
path = third_party/premake-core
url = https://github.com/xenia-project/premake-core.git
[submodule "third_party/snappy"]
path = third_party/snappy
url = https://github.com/xenia-project/snappy.git
[submodule "third_party/premake-export-compile-commands"]
path = third_party/premake-export-compile-commands
url = https://github.com/xenia-project/premake-export-compile-commands.git
[submodule "third_party/discord-rpc"]
path = third_party/discord-rpc
url = https://github.com/discordapp/discord-rpc.git
[submodule "third_party/rapidjson"]
path = third_party/rapidjson
url = https://github.com/Tencent/rapidjson.git
[submodule "third_party/aes_128"]
path = third_party/aes_128
url = https://github.com/openluopworld/aes_128.git
[submodule "third_party/capstone"]
path = third_party/capstone
url = https://github.com/xenia-project/capstone.git
[submodule "third_party/cpptoml"]
path = third_party/cpptoml
url = https://github.com/skystrife/cpptoml.git
[submodule "third_party/cxxopts"]
path = third_party/cxxopts
url = https://github.com/jarro2783/cxxopts.git
[submodule "third_party/SDL2"]
path = third_party/SDL2
url = https://github.com/libsdl-org/SDL.git
[submodule "third_party/utfcpp"]
path = third_party/utfcpp
url = https://github.com/xenia-project/utfcpp.git
[submodule "third_party/fmt"]
path = third_party/fmt
url = https://github.com/fmtlib/fmt.git
[submodule "third_party/disruptorplus"]
path = third_party/disruptorplus
url = https://github.com/xenia-project/disruptorplus.git
[submodule "third_party/DirectXShaderCompiler"]
path = third_party/DirectXShaderCompiler
url = https://github.com/microsoft/DirectXShaderCompiler.git
[submodule "third_party/premake-cmake"]
path = third_party/premake-cmake
url = https://github.com/JoelLinn/premake-cmake.git
[submodule "third_party/date"]
path = third_party/date
url = https://github.com/HowardHinnant/date.git
[submodule "third_party/xxhash"]
path = third_party/xxhash
url = https://github.com/Cyan4973/xxHash.git
[submodule "third_party/FFmpeg"]
path = third_party/FFmpeg
url = https://github.com/xenia-project/FFmpeg.git
[submodule "third_party/premake-androidndk"]
path = third_party/premake-androidndk
url = https://github.com/Triang3l/premake-androidndk.git
[submodule "third_party/FidelityFX-CAS"]
path = third_party/FidelityFX-CAS
url = https://github.com/GPUOpen-Effects/FidelityFX-CAS.git
[submodule "third_party/FidelityFX-FSR"]
path = third_party/FidelityFX-FSR
url = https://github.com/GPUOpen-Effects/FidelityFX-FSR.git
[submodule "third_party/Vulkan-Headers"]
path = third_party/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "third_party/glslang"]
path = third_party/glslang
url = https://github.com/KhronosGroup/glslang.git
[submodule "third_party/SPIRV-Tools"]
path = third_party/SPIRV-Tools
url = https://github.com/KhronosGroup/SPIRV-Tools.git
[submodule "third_party/VulkanMemoryAllocator"]
path = third_party/VulkanMemoryAllocator
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
[submodule "third_party/DirectX-Headers"]
path = third_party/DirectX-Headers
url = https://github.com/microsoft/DirectX-Headers.git
================================================
FILE: LICENSE
================================================
Copyright (c) 2015, Ben Vanik.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the project nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL BEN VANIK BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README.md
================================================
<p align="center">
<a href="https://github.com/xenia-project/xenia/tree/master/assets/icon">
<img height="120px" src="https://raw.githubusercontent.com/xenia-project/xenia/master/assets/icon/128.png" />
</a>
</p>
<h1 align="center">Xenia - Xbox 360 Emulator</h1>
Xenia is an experimental emulator for the Xbox 360. For more information, see the
[main Xenia wiki](https://github.com/xenia-project/xenia/wiki).
**Interested in supporting the core contributors?** Visit
[Xenia Project on Patreon](https://www.patreon.com/xenia_project).
Come chat with us about **emulator-related topics** on [Discord](https://discord.gg/Q9mxZf9).
For developer chat join `#dev` but stay on topic. Lurking is not only fine, but encouraged!
Please check the [FAQ](https://github.com/xenia-project/xenia/wiki/FAQ) page before asking questions.
We've got jobs/lives/etc, so don't expect instant answers.
Discussing illegal activities will get you banned.
## Status
Buildbot | Status | Releases
-------- | ------ | --------
[Windows](https://ci.appveyor.com/project/benvanik/xenia/branch/master) | [](https://ci.appveyor.com/project/benvanik/xenia/branch/master) | [Latest](https://github.com/xenia-project/release-builds-windows/releases/latest) ◦ [All](https://github.com/xenia-project/release-builds-windows/releases)
[Linux](https://cloud.drone.io/xenia-project/xenia) | [](https://cloud.drone.io/xenia-project/xenia)
Quite a few real games run. Quite a few don't.
See the [Game compatibility list](https://github.com/xenia-project/game-compatibility/issues)
for currently tracked games, and feel free to contribute your own updates,
screenshots, and information there following the [existing conventions](https://github.com/xenia-project/game-compatibility/blob/master/README.md).
## Disclaimer
The goal of this project is to experiment, research, and educate on the topic
of emulation of modern devices and operating systems. **It is not for enabling
illegal activity**. All information is obtained via reverse engineering of
legally purchased devices and games and information made public on the internet
(you'd be surprised what's indexed on Google...).
## Quickstart
See the [Quickstart](https://github.com/xenia-project/xenia/wiki/Quickstart) page.
## Building
See [building.md](docs/building.md) for setup and information about the
`xb` script. When writing code, check the [style guide](docs/style_guide.md)
and be sure to run clang-format!
## Contributors Wanted!
Have some spare time, know advanced C++, and want to write an emulator?
Contribute! There's a ton of work that needs to be done, a lot of which
is wide open greenfield fun.
**For general rules and guidelines please see [CONTRIBUTING.md](.github/CONTRIBUTING.md).**
Fixes and optimizations are always welcome (please!), but in addition to
that there are some major work areas still untouched:
* Help work through [missing functionality/bugs in games](https://github.com/xenia-project/xenia/labels/compat)
* Reduce the size of Xenia's [huge log files](https://github.com/xenia-project/xenia/issues/1526)
* Skilled with Linux? A strong contributor is needed to [help with porting](https://github.com/xenia-project/xenia/labels/platform-linux)
See more projects [good for contributors](https://github.com/xenia-project/xenia/labels/good%20first%20issue). It's a good idea to ask on Discord and check the issues page before beginning work on
something.
## FAQ
See the [frequently asked questions](https://github.com/xenia-project/xenia/wiki/FAQ) page.
================================================
FILE: android/android_studio_project/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
================================================
FILE: android/android_studio_project/app/.gitignore
================================================
/build
================================================
FILE: android/android_studio_project/app/build.gradle
================================================
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 33
ndkVersion '25.0.8775105'
defaultConfig {
applicationId 'jp.xenia.emulator'
// 24 (7.0) - Vulkan.
minSdkVersion 24
targetSdkVersion 33
versionCode 1
versionName 'Prototype'
externalNativeBuild {
ndkBuild {
arguments 'NDK_APPLICATION_MK:=../../../build/xenia.Application.mk',
'PREMAKE_ANDROIDNDK_PLATFORMS:=Android-ARM64',
'PREMAKE_ANDROIDNDK_PLATFORMS+=Android-x86_64',
// ndk.jobs doesn't work as of Gradle 7.1.0.
"-j${Runtime.runtime.availableProcessors()}",
// Work around "Bad file descriptor" on Windows on NDK r22+.
'--output-sync=none'
// For the app, don't build the executables designed for running from a terminal.
// To build the executables, run ndk-build manually.
targets 'xenia-app'
}
}
ndk {
abiFilters 'arm64-v8a', 'x86_64'
stl 'c++_static'
}
}
buildTypes {
release {
externalNativeBuild {
ndkBuild {
arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Release'
}
}
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix '.debug'
debuggable true
externalNativeBuild {
ndkBuild {
arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Debug'
}
}
}
checked {
applicationIdSuffix '.checked'
debuggable true
externalNativeBuild {
ndkBuild {
arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Checked'
}
}
}
}
flavorDimensions 'distribution'
productFlavors {
github {
dimension 'distribution'
applicationIdSuffix '.github'
}
googlePlay {
dimension 'distribution'
// TODO(Triang3l): Provide a signing config for core contributors only.
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
externalNativeBuild {
ndkBuild {
path file('../../../build/xenia.wks.Android.mk')
}
}
}
dependencies {
implementation 'org.jetbrains:annotations:15.0'
}
================================================
FILE: android/android_studio_project/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: android/android_studio_project/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.xenia.emulator">
<uses-feature
android:name="android.hardware.vulkan.level"
android:required="true"
android:version="0" />
<uses-feature
android:name="android.hardware.vulkan.version"
android:required="true"
android:version="0x400000" />
<!-- Granted automatically - guest sockets. -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@android:style/Theme.Material.Light">
<activity
android:name="jp.xenia.emulator.LauncherActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="jp.xenia.emulator.GpuTraceViewerActivity"
android:exported="true"
android:label="@string/activity_label_gpu_trace_viewer"
android:screenOrientation="sensorLandscape"
android:theme="@android:style/Theme.Material.Light.NoActionBar" />
<activity
android:name="jp.xenia.emulator.WindowDemoActivity"
android:exported="true"
android:label="@string/activity_label_window_demo"
android:theme="@android:style/Theme.Material.Light.NoActionBar" />
</application>
</manifest>
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/XeniaRuntimeException.java
================================================
package jp.xenia;
/**
* Base class for all unchecked exceptions thrown by the Xenia project components.
*/
public class XeniaRuntimeException extends RuntimeException {
public XeniaRuntimeException() {
}
public XeniaRuntimeException(final String name) {
super(name);
}
public XeniaRuntimeException(final String name, final Throwable cause) {
super(name, cause);
}
public XeniaRuntimeException(final Exception cause) {
super(cause);
}
}
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/emulator/GpuTraceViewerActivity.java
================================================
package jp.xenia.emulator;
import android.os.Bundle;
public class GpuTraceViewerActivity extends WindowedAppActivity {
@Override
protected String getWindowedAppIdentifier() {
return "xenia_gpu_vulkan_trace_viewer";
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gpu_trace_viewer);
setWindowSurfaceView(findViewById(R.id.gpu_trace_viewer_surface_view));
}
}
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/emulator/LauncherActivity.java
================================================
package jp.xenia.emulator;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class LauncherActivity extends Activity {
private static final int REQUEST_OPEN_GPU_TRACE_VIEWER = 0;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
}
@Override
protected void onActivityResult(
final int requestCode, final int resultCode, final Intent data) {
if (requestCode == REQUEST_OPEN_GPU_TRACE_VIEWER && resultCode == RESULT_OK) {
final Uri uri = data.getData();
if (uri != null) {
final Intent gpuTraceViewerIntent = new Intent(this, GpuTraceViewerActivity.class);
final Bundle gpuTraceViewerLaunchArguments = new Bundle();
gpuTraceViewerLaunchArguments.putString("target_trace_file", uri.toString());
gpuTraceViewerIntent.putExtra(
WindowedAppActivity.EXTRA_CVARS, gpuTraceViewerLaunchArguments);
startActivity(gpuTraceViewerIntent);
}
}
}
public void onLaunchGpuTraceViewerClick(final View view) {
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/octet-stream");
startActivityForResult(intent, REQUEST_OPEN_GPU_TRACE_VIEWER);
}
public void onLaunchWindowDemoClick(final View view) {
startActivity(new Intent(this, WindowDemoActivity.class));
}
}
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowDemoActivity.java
================================================
package jp.xenia.emulator;
import android.os.Bundle;
public class WindowDemoActivity extends WindowedAppActivity {
@Override
protected String getWindowedAppIdentifier() {
return "xenia_ui_window_vulkan_demo";
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_window_demo);
setWindowSurfaceView(findViewById(R.id.window_demo_surface_view));
}
}
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowSurfaceView.java
================================================
package jp.xenia.emulator;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceView;
public class WindowSurfaceView extends SurfaceView {
public WindowSurfaceView(final Context context) {
super(context);
// Native drawing is invoked from onDraw.
setWillNotDraw(false);
}
public WindowSurfaceView(final Context context, final AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
}
public WindowSurfaceView(
final Context context, final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
setWillNotDraw(false);
}
public WindowSurfaceView(
final Context context, final AttributeSet attrs, final int defStyleAttr,
final int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setWillNotDraw(false);
}
@Override
protected void onDraw(final Canvas canvas) {
final Context context = getContext();
if (!(context instanceof WindowedAppActivity)) {
return;
}
final WindowedAppActivity activity = (WindowedAppActivity) context;
activity.onWindowSurfaceDraw(false);
}
}
================================================
FILE: android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowedAppActivity.java
================================================
package jp.xenia.emulator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.View;
import org.jetbrains.annotations.Nullable;
import jp.xenia.XeniaRuntimeException;
public abstract class WindowedAppActivity extends Activity {
// The EXTRA_CVARS value literal is also used in the native code.
/**
* Name of the Bundle intent extra containing Xenia config variable launch arguments.
*/
public static final String EXTRA_CVARS = "jp.xenia.emulator.WindowedAppActivity.EXTRA_CVARS";
static {
System.loadLibrary("xenia-app");
}
private final WindowSurfaceListener mWindowSurfaceListener = new WindowSurfaceListener();
// May be 0 while destroying (mainly while the superclass is).
private long mAppContext = 0;
@Nullable
private WindowSurfaceView mWindowSurfaceView = null;
private native long initializeWindowedAppOnCreate(
String windowedAppIdentifier, AssetManager assetManager);
private native void onDestroyNative(long appContext);
private native void onWindowSurfaceLayoutChange(
long appContext, int left, int top, int right, int bottom);
private native boolean onWindowSurfaceMotionEvent(long appContext, MotionEvent event);
private native void onWindowSurfaceChanged(long appContext, Surface windowSurface);
private native void paintWindow(long appContext, boolean forcePaint);
protected abstract String getWindowedAppIdentifier();
protected void setWindowSurfaceView(@Nullable final WindowSurfaceView windowSurfaceView) {
if (mWindowSurfaceView == windowSurfaceView) {
return;
}
// Detach from the old surface.
if (mWindowSurfaceView != null) {
mWindowSurfaceView.getHolder().removeCallback(mWindowSurfaceListener);
mWindowSurfaceView.setOnTouchListener(null);
mWindowSurfaceView.setOnGenericMotionListener(null);
mWindowSurfaceView.removeOnLayoutChangeListener(mWindowSurfaceListener);
mWindowSurfaceView = null;
if (mAppContext != 0) {
onWindowSurfaceChanged(mAppContext, null);
}
}
if (windowSurfaceView == null) {
return;
}
mWindowSurfaceView = windowSurfaceView;
// FIXME(Triang3l): This doesn't work if the layout has already been performed.
mWindowSurfaceView.addOnLayoutChangeListener(mWindowSurfaceListener);
mWindowSurfaceView.setOnGenericMotionListener(mWindowSurfaceListener);
mWindowSurfaceView.setOnTouchListener(mWindowSurfaceListener);
final SurfaceHolder windowSurfaceHolder = mWindowSurfaceView.getHolder();
windowSurfaceHolder.addCallback(mWindowSurfaceListener);
// If setting after the creation of the surface.
if (mAppContext != 0) {
final Surface windowSurface = windowSurfaceHolder.getSurface();
if (windowSurface != null) {
onWindowSurfaceChanged(mAppContext, windowSurface);
}
}
}
public void onWindowSurfaceDraw(final boolean forcePaint) {
if (mAppContext == 0) {
return;
}
paintWindow(mAppContext, forcePaint);
}
// Used from the native WindowedAppContext. May be called from non-UI threads.
@SuppressWarnings("UnusedDeclaration")
protected void postInvalidateWindowSurface() {
if (mWindowSurfaceView == null) {
return;
}
mWindowSurfaceView.postInvalidate();
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final String windowedAppIdentifier = getWindowedAppIdentifier();
mAppContext = initializeWindowedAppOnCreate(windowedAppIdentifier, getAssets());
if (mAppContext == 0) {
finish();
throw new XeniaRuntimeException(
"Error initializing the windowed app " + windowedAppIdentifier);
}
}
@Override
protected void onDestroy() {
setWindowSurfaceView(null);
if (mAppContext != 0) {
onDestroyNative(mAppContext);
}
mAppContext = 0;
super.onDestroy();
}
private class WindowSurfaceListener implements
View.OnGenericMotionListener,
View.OnLayoutChangeListener,
View.OnTouchListener,
SurfaceHolder.Callback2 {
@Override
public void onLayoutChange(
final View v, final int left, final int top, final int right, final int bottom,
final int oldLeft, final int oldTop, final int oldRight, final int oldBottom) {
if (mAppContext != 0) {
onWindowSurfaceLayoutChange(mAppContext, left, top, right, bottom);
}
}
@Override
public boolean onGenericMotion(final View view, final MotionEvent event) {
if (mAppContext == 0) {
return false;
}
return onWindowSurfaceMotionEvent(mAppContext, event);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(final View view, final MotionEvent event) {
if (mAppContext == 0) {
return false;
}
return onWindowSurfaceMotionEvent(mAppContext, event);
}
@Override
public void surfaceCreated(final SurfaceHolder holder) {
if (mAppContext == 0) {
return;
}
onWindowSurfaceChanged(mAppContext, holder.getSurface());
}
@Override
public void surfaceChanged(
final SurfaceHolder holder, final int format, final int width, final int height) {
if (mAppContext == 0) {
return;
}
onWindowSurfaceChanged(mAppContext, holder.getSurface());
}
@Override
public void surfaceDestroyed(final SurfaceHolder holder) {
if (mAppContext == 0) {
return;
}
onWindowSurfaceChanged(mAppContext, null);
}
@Override
public void surfaceRedrawNeeded(final SurfaceHolder holder) {
onWindowSurfaceDraw(true);
}
}
}
================================================
FILE: android/android_studio_project/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
================================================
FILE: android/android_studio_project/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
================================================
FILE: android/android_studio_project/app/src/main/res/layout/activity_gpu_trace_viewer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<jp.xenia.emulator.WindowSurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/gpu_trace_viewer_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="jp.xenia.emulator.GpuTraceViewerActivity" />
================================================
FILE: android/android_studio_project/app/src/main/res/layout/activity_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="jp.xenia.emulator.LauncherActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onLaunchGpuTraceViewerClick"
android:text="@string/activity_label_gpu_trace_viewer" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onLaunchWindowDemoClick"
android:text="@string/activity_label_window_demo" />
</LinearLayout>
</ScrollView>
================================================
FILE: android/android_studio_project/app/src/main/res/layout/activity_window_demo.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<jp.xenia.emulator.WindowSurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/window_demo_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="jp.xenia.emulator.WindowDemoActivity" />
================================================
FILE: android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: android/android_studio_project/app/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">Xenia</string>
<string name="activity_label_gpu_trace_viewer">GPU Trace Viewer</string>
<string name="activity_label_window_demo">Window Demo</string>
</resources>
================================================
FILE: android/android_studio_project/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: android/android_studio_project/gradle/wrapper/gradle-wrapper.properties
================================================
#Mon Nov 01 23:19:20 MSK 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
================================================
FILE: android/android_studio_project/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
================================================
FILE: android/android_studio_project/gradlew
================================================
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
================================================
FILE: android/android_studio_project/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: android/android_studio_project/settings.gradle
================================================
include ':app'
rootProject.name = "Xenia"
================================================
FILE: assets/icon/LICENSE
================================================
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.
================================================
FILE: docs/building.md
================================================
# Building
You must have a 64-bit machine for building and running the project. Always
run your system updater before building and make sure you have the latest
drivers.
## Setup
### Windows
* Windows 7 or later
* [Visual Studio 2022, Visual Studio 2019, or Visual Studio 2017](https://www.visualstudio.com/downloads/)
* For Visual Studio 2022, MSBuild `v142` must be used due to a compiler bug; See [#2003](https://github.com/xenia-project/xenia/issues/2003).
* [Python 3.6+](https://www.python.org/downloads/)
* Ensure Python is in PATH.
* Windows 11 SDK version 10.0.22000.0 (for Visual Studio 2019, this or any newer version)
```
git clone https://github.com/xenia-project/xenia.git
cd xenia
xb setup
# Build on command line (add --config=release for release):
xb build
# Pull latest changes, rebase, update submodules, and run premake:
xb pull
# Run premake and open Visual Studio (run the 'xenia-app' project):
xb devenv
# Run premake to update the sln/vcproj's:
xb premake
# Format code to the style guide:
xb format
```
<!--
# Remove intermediate files and build outputs (doesn't work on Linux):
xb clean
# Check for lint errors with clang-format:
xb lint
# Run the style checker on all code:
xb style
# Remove all build/ output and do a hard git reset:
xb nuke
# Runs the clang-tidy checker on all code:
xb tidy
## Testing:
# Generate tests:
xb gentests
# Run tests:
xb test
# Run GPU tests:
xb gputest
## Other:
# Generate SPIR-V binaries and header files:
xb genspirv
-->
#### Debugging
VS behaves oddly with the debug paths. Open the 'xenia-app' project properties
and set the 'Command' to `$(SolutionDir)$(TargetPath)` and the
'Working Directory' to `$(SolutionDir)..\..`. You can specify flags and
the file to run in the 'Command Arguments' field (or use `--flagfile=flags.txt`).
By default logs are written to a file with the name of the executable. You can
override this with `--log_file=log.txt`.
If running under Visual Studio and you want to look at the JIT'ed code
(available around 0xA0000000) you should pass `--emit_source_annotations` to
get helpful spacers/movs in the disassembly.
### Linux
Linux support is extremely experimental and presently incomplete.
The build script uses LLVM/Clang 9. GCC while it should work in theory, is not easily
interchangeable right now.
* Normal building via `xb build` uses Make.
* [CodeLite](https://codelite.org) is supported. `xb devenv` will generate a workspace and attempt to open it. Your distribution's version may be out of date so check their website.
* Experimental CMake generation is available to facilitate use of other IDEs such as [CLion](https://www.jetbrains.com/clion/). If `clion` is available inside `$PATH`, `xb devenv` will start it. Otherwise `build/CMakeLists.txt` needs to be generated by invoking `xb premake --devenv=cmake` manually.
Clang-9 or newer should be available from system repositories on all up to date distributions.
You will also need some development libraries. To get them on an Ubuntu system:
```bash
sudo apt-get install libgtk-3-dev libpthread-stubs0-dev liblz4-dev libx11-dev libx11-xcb-dev libvulkan-dev libsdl2-dev libiberty-dev libunwind-dev libc++-dev libc++abi-dev
```
In addition, you will need up to date Vulkan libraries and drivers for your hardware, which most distributions have in their standard repositories nowadays.
## Running
To make life easier you can set the program startup arguments in your IDE to something like `--log_file=stdout /path/to/Default.xex` to log to console rather than a file and start up the emulator right away.
================================================
FILE: docs/cpu.md
================================================
# CPU Documentation
## The JIT

The JIT is the core of Xenia. It translates Xenon PowerPC code into native
code runnable on the host computer.
There are 3 phases to translation:
1. Translation to IR (intermediate representation)
2. IR compilation/optimization
3. Backend emission
PowerPC instructions are translated to Xenia's intermediate representation
format in src/xenia/cpu/ppc/ppc_emit_*.cc (e.g. processor control is done in
[ppc_emit_control.cc](../src/xenia/cpu/ppc/ppc_emit_control.cc)). HIR opcodes
are relatively simple opcodes such that any host can define an implementation.
After the HIR is generated, it is ran through a compiler to prep it for generation.
The compiler is ran in a series of passes, the order of which is defined in
[ppc_translator.cc](../src/xenia/cpu/ppc/ppc_translator.cc). Some passes are
essential to the successful generation, while others are merely for optimization
purposes. Compiler passes are defined in src/xenia/cpu/compiler/passes with
descriptive class names.
Finally, the backend consumes the HIR and emits code that runs natively on the
host. Currently, the only backend that exists is the x64 backend, with all the
emission done in
[x64_sequences.cc](../src/xenia/cpu/backend/x64/x64_sequences.cc).
## ABI
Xenia guest functions are not directly callable, but rather must be called
through APIs provided by Xenia. Xenia will first execute a thunk to transition
the host context to a state dependent on the JIT backend, and that will call the
guest code.
### x64
Transition thunks defined in [x64_backend.cc](../src/xenia/cpu/backend/x64/x64_backend.cc#L389).
Registers are stored on the stack as defined by [StackLayout::Thunk](../src/xenia/cpu/backend/x64/x64_stack_layout.h#L96)
for later transitioning back to the host.
Some registers are reserved for usage by the JIT to store temporary variables.
See: [X64Emitter::gpr_reg_map_ and X64Emitter::xmm_reg_map_](../src/xenia/cpu/backend/x64/x64_emitter.cc#L57).
#### Integer Registers
Register | Usage
--- | ---
RAX | Scratch
RBX | JIT temp
RCX | Scratch
RDX | Scratch
RSP | Stack Pointer
RBP | Unused
RSI | PowerPC Context
RDI | Virtual Memory Base
R8-R11 | Unused (parameters)
R12-R15 | JIT temp
#### Floating Point Registers
Register | Usage
--- | ---
XMM0-XMM5 | Scratch
XMM6-XMM15 | JIT temp
## Memory
Xenia defines virtual memory as a mapped range beginning at Memory::virtual_membase(),
and physical memory as another mapped range from Memory::physical_membase()
(usually 0x100000000 and 0x200000000, respectively). If the default bases are
not available, they are shifted left 1 bit until an available range is found.
The guest only has access to these ranges, nothing else.
### Map
```
0x00000000 - 0x3FFFFFFF (1024mb) - virtual 4k pages
0x40000000 - 0x7FFFFFFF (1024mb) - virtual 64k pages
0x80000000 - 0x8BFFFFFF ( 192mb) - xex 64k pages
0x8C000000 - 0x8FFFFFFF ( 64mb) - xex 64k pages (encrypted)
0x90000000 - 0x9FFFFFFF ( 256mb) - xex 4k pages
0xA0000000 - 0xBFFFFFFF ( 512mb) - physical 64k pages (overlapped)
0xC0000000 - 0xDFFFFFFF - physical 16mb pages (overlapped)
0xE0000000 - 0xFFFFFFFF - physical 4k pages (overlapped)
```
Virtual pages are usually allocated by NtAllocateVirtualMemory, and
physical pages are usually allocated by MmAllocatePhysicalMemoryEx.
Virtual pages mapped to physical memory are also mapped to the physical membase,
i.e. virtual 0xA0000000 == physical 0x00000000
The 0xE0000000-0xFFFFFFFF range is mapped to physical memory with a single 4 KB
page offset. On Windows, memory mappings must be aligned to 64 KB, so the offset
has to be added when guest addresses are converted to host addresses in the
translated CPU code. This can't be faked other ways because calculations
involving the offset are built into games - see the following sequence:
```
srwi r9, r10, 20 # r9 = r10 >> 20
clrlwi r10, r10, 3 # r10 = r10 & 0x1FFFFFFF (physical address)
addi r11, r9, 0x200
rlwinm r11, r11, 0,19,19 # r11 = r11 & 0x1000
add r11, r11, r10 # add 1 page to addresses > 0xE0000000
# r11 = addess passed to GPU
```
## Memory Management
TODO
## References
### PowerPC
The processor in the 360 is a 64-bit PowerPC chip running in 32-bit mode.
Programs are still allowed to use 64-bit PowerPC instructions, and registers
are 64-bit as well, but 32-bit instructions will run in 32-bit mode.
The CPU is largely similar to the PPC part in the PS3, so Cell documents
often line up for the core instructions. The 360 adds some additional AltiVec
instructions, though, which are only documented in a few places (like the gcc source code, etc).
* [Free60 Info](https://free60project.github.io/wiki/Xenon_(CPU))
* [Power ISA docs](https://web.archive.org/web/20140603115759/https://www.power.org/wp-content/uploads/2012/07/PowerISA_V2.06B_V2_PUBLIC.pdf) (aka 'PowerISA')
* [PowerPC Programming Environments Manual](https://web.archive.org/web/20141028181028/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/F7E732FF811F783187256FDD004D3797/$file/pem_64bit_v3.0.2005jul15.pdf) (aka 'pem_64')
* [PowerPC Vector PEM](https://web.archive.org/web/20130502201029/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf)
* [AltiVec PEM](https://web.archive.org/web/20151110180336/https://cache.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf)
* [VMX128 Opcodes](http://biallas.net/doc/vmx128/vmx128.txt)
* [AltiVec Decoding](https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp)
### x64
* [Intel Manuals](https://software.intel.com/en-us/articles/intel-sdm)
* [Combined Intel Manuals](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)
* [Apple AltiVec/SSE Migration Guide](https://developer.apple.com/legacy/library/documentation/Performance/Conceptual/Accelerate_sse_migration/Accelerate_sse_migration.pdf)
================================================
FILE: docs/cpu_todo.md
================================================
# CPU TODO
There are many improvements that can be done under `xe::cpu` to improve
debugging, performance (both to JIT and of generated code), and portability.
Some are in various states of completion, and others are just thoughts that need
more exploring.
## Debugging Improvements
### Reproducable X64 Emission
It'd be useful to be able to run a PPC function through the entire pipeline and
spit out x64 that is byte-for-byte identical across runs. This would allow
automated verification, bulk analysis, etc. Currently `X64Emitter::Emplace`
will relocate the x64 when placing it in memory, which will be at a different
location each time. Instead it would be nice to have the xbyak `calcJmpAddress`
that performs the relocations use the address of our choosing.
### Sampling Profiler
Once we have stack walking it'd be nice to take something like
[micro-profiler](https://code.google.com/p/micro-profiler/) and augment it to
support our system. This would let us run continuous performance analysis and
track hotspots in JITed code without a large performance impact. Automatically
showing the top hot functions in the debugger could help track down poor
translation much faster.
### Intel Architecture Code Analyzer Support
The [Intel ACA](https://software.intel.com/en-us/articles/intel-architecture-code-analyzer)
is a nifty tool that, given a kernel of x64, can detail theoretical performance
characteristics on different processors down to cycle timings and potential
bottlenecks on memory/execution units. It's designed to run on elf/obj/etc files
however it simply looks for special markers in the code. Having something that
walks the code cache and dumps a specially formatted file with the markers
around basic blocks could allow running the tool in bulk, or alternatively being
able to invoke it one-off by dumping a specific x64 block to disk and processing
it for display when looking at the code in the debugger would be useful.
I've done some early experiments with this and its possible to pass just a
bin file with the markers and the x64.
### Function Tracing/Coverage Information
`function_trace_data.h` contains the `FunctionTraceData` struct, which is
currently partially populated by the x64 backend. This enables tracking of which
threads a function is called on, function call count, recent callers of the
function, and even instruction-level counts.
This is all only partially implemented, though, and there's no tool to read it
out. This would be nice to get integrated into the debugger so that it can
overlay the information when viewing a function, but also useful in aggregate to
find hot functions/code paths or enhance callstacks by automatically annotating
thread information.
#### Block-level Counting
Currently the code assumes each instruction has a count, however this is
expensive and often unneeded as it can be done on a block level and then the
instruction counts can be derived from that. This can reduce the overhead (both
in memory and accounting time) by an order of magnitude.
### On-Stack Context Inspection
Currently the debugger only works with `--store_all_context_values`, as it can
only get the values of PPC registers when they are stored to the PPC context
after each instruction. As this can slow things down by ~10-20% it could be
useful to be able to preserve the optimized and register-allocated HIR so that
host registers holding context values can be derived on demand. Or, we could
just make `--store_all_context_values` faster.
## JIT Performance Improvements
### Reduce HIR Size
Currently there are a lot of pointers stored within `Instr`, `Value`, and
related types. These are big 8B values that eat a lot of memory and really
hurt the cache (especially with all the block/instruction walking done).
Aligning everything to 16B values in the arena and using 16bit indices
(or something) could shrink things a lot.
### Serialize Code Cache
The x64 code cache is currently set up to use fixed memory addresses and is even
represented as mapped memory. It should be fairly easy to back this with a file
and have all code written to disk. Adding more metadata, or perhaps a side-car
file, would allow for the code to be written to disk. On future runs the code
cache could load this data (by mapping the file containing the code right into
memory) and short cut JIT'ing entirely.
It would be possible to use a common container format (ELF/etc), however there's
elegance in not requiring any additional steps beyond the memory mapping. Such
containers could be useful for running static tools against, though.
## Portability Improvements
### Emulated Opcode Layer
Having a way to use emulated variants for any HIR opcode in a backend would
help when writing a new backend as well as when verifying the existing backends.
This may look like a C library with functions for each opcode/type pairing and
utilities to call out to them. Something like the x64 backend could then call
out to these with CallNativeSafe (or some faster equivalent) and something like
an interpreter backend would be fairly trivial to write.
## X64 Backend Improvements
### Implement Emulated Instructions
There are a ton of half-implemented HIR opcodes that call out to C++ to do their
work. These are extremely expensive as they incur a full guest-to-host thunk
(~hundreds of instructions!). Basically, any of the `Emulate*`/`CallNativeSafe`
functions in `x64_sequences.cc` need to be replaced with proper AVX/AVX2
variants.
### Increase Register Availability
Currently only a few x64 registers are usable (due to reservations by the
backend or ABI conflicts). Though register pressure is surprisingly light in
most cases there are pathological cases that result in a lot of spills. By
freeing up some of the registers these spills could be reduced.
### Constant Pooling
This may make sense as a compiler pass instead.
Right now, particular sequences of instructions are nasty - such as anything
using `LoadConstantXmm` to load non-zero or non-1 vec128's. Instead of doing the
super fat (20-30byte!) constant loads as they are done now it may be better to
keep a per-function constant table and instead use RIP-relative addressing (or
something) to use the memory-form AVX instructions.
For example, right now this:
```
v82.v128 = [0,1,2,3]
v83.v128 = or v81.v128, v82.128
```
Translates to (something like):
```
mov([rsp+0x...], 0x00000000)
mov([rsp+0x...+4], 0x00000001)
mov([rsp+0x...+8], 0x00000002)
mov([rsp+0x...+12], 0x00000003)
vmovdqa(xmm2, [rsp+0x...])
vor(xmm2, xmm2, xmm2)
```
Where as it could be:
```
vor(xmm2, xmm2, [rip+0x...])
```
Whether the cost of doing the constant de-dupe is worth it remains to be seen.
Right now it's wasting a lot of instruction cache space, increasing decode time,
and potentially using a lot more memory bandwidth.
## Optimization Improvements
### Speed Up RegisterAllocationPass
Currently the slowest pass, this could be improved by requiring less use
tracking or perhaps maintaining the use tracking in other passes. A faster
SortUsageList (radix or something fancy?) may be helpful as well.
### More Opcodes in ConstantPropagationPass
There's a few HIR opcodes with no handling, and others with minimal handling.
It'd be nice to know what paths need improvement and add them, as any work here
makes things free later on.
### Cross-Block ConstantPropagationPass
Constant propagation currently only occurs within a single block. This makes it
difficult to optimize common PPC patterns like loading the constants 0 or 1 into
a register before a loop and other loads of expensive altivec values.
Either ControlFlowAnalysisPass or DataFlowAnalysisPass could be piggy-backed to
track constant load_context/store_context's across block bounds and propagate
the values. This is simpler than dynamic values as no phi functions or anything
fancy needs to happen.
### Add TypePropagationPass
There are many extensions/truncations in generated code right now due to
various load/stores of varying widths. Being able to find and short-
circuit the conversions early on would make following passes cleaner
and faster as they'd have to trace through fewer value definitions and there'd
be less extraneous movs in the final code.
Example (after ContextPromotion):
```
v82.i32 = truncate v81.i64
v83.i32 = and v82.i32, 3F
v85.i64 = zero_extend v84.i32
```
Becomes (after DCE/etc):
```
v85.i64 = and v81.i64, 3F
```
### Enhance MemorySequenceCombinationPass with Extend/Truncate
Currently this pass will look for byte_swap and merge that into loads/stores.
This allows for better final codegen at the cost of making optimization more
difficult, so it only happens at the end of the process.
There's currently TODOs in there for adding extend/truncate support, which
will extend what it does with swaps to also merge the
sign_extend/zero_extend/truncate into the matching load/store. This allows for
the x64 backend to generate the proper mov's that do these operations without
requiring additional steps. Note that if we had a LIR and a peephole optimizer
this would be better done there.
Load with swap and extend:
```
v1.i32 = load v0
v2.i32 = byte_swap v1.i32
v3.i64 = zero_extend v2.i32
```
Becomes:
```
v1.i64 = load_convert v0, [swap|i32->i64,zero]
```
Store with truncate and swap:
```
v1.i64 = ...
v2.i32 = truncate v1.i64
v3.i32 = byte_swap v2.i32
store v0, v3.i32
```
Becomes:
```
store_convert v0, v1.i64, [swap|i64->i32,trunc]
```
### Add DeadStoreEliminationPass
Generic DSE pass, removing all redundant stores. ContextPromotion may be
able to take care of most of these, as the input assembly is generally
pretty optimized already. This pass would mainly be looking for introduced
stores, such as those from comparisons.
Currently ControlFlowAnalysisPass will annotate blocks with incoming/outgoing
edges as well as dominators, and that could be used to check whether stores into
the context are used in their destination block or instead overwritten
(currently they almost never are).
If this pass was able to remove a good number of the stores then the comparisons
would also be removed with dead code elimination and dramatically reduce branch
overhead.
Example:
```
<block0>:
v0 = compare_ult ... (later removed by DCE)
v1 = compare_ugt ... (later removed by DCE)
v2 = compare_eq ...
store_context +300, v0 <-- removed
store_context +301, v1 <-- removed
store_context +302, v2 <-- removed
branch_true v1, ...
<block1>:
v3 = compare_ult ...
v4 = compare_ugt ...
v5 = compare_eq ...
store_context +300, v3 <-- these may be required if at end of function
store_context +301, v4 or before a call
store_context +302, v5
branch_true v5, ...
```
### Add X64CanonicalizationPass
For various opcodes add copies/commute the arguments to match x64
operand semantics. This makes code generation easier and if done
before register allocation can prevent a lot of extra shuffling in
the emitted code.
Example:
```
<block0>:
v0 = ...
v1 = ...
v2 = add v0, v1 <-- v1 now unused
```
Becomes:
```
v0 = ...
v1 = ...
v1 = add v1, v0 <-- src1 = dest/src, so reuse for both
by commuting and setting dest = src1
```
### Add MergeLocalSlotsPass
As the RegisterAllocationPass runs it generates load_local/store_local as it
spills. Currently each set of locals is unique to each block, which in very
large functions can result in a lot of locals that are only used briefly. It
may be useful to use the results of the ControlFlowAnalysisPass to track local
liveness and merge the slots so they are reused when they cannot possibly be
live at the same time. This saves stack space and potentially improves cache
behavior.
================================================
FILE: docs/gpu.md
================================================
# GPU Documentation
## The Xenos Chip
The [Xenos](https://en.wikipedia.org/wiki/Xenos_\(graphics_chip\)) is a graphics
chip designed by AMD based off of the R5xx architecture.
### Command Processing
The Xenos runs commands supplied to it directly by the DirectX bare-bones driver
via a ringbuffer located in system memory.
The bulk of the command processing code is located at
[src/xenia/gpu/command_processor.cc](../src/xenia/gpu/command_processor.cc)
### EDRAM
The Xenos uses special high-speed memory located on the same die as the chip to
store framebuffers/render targets.
TODO: More documentation
## Options
### General
See the top of [src/xenia/gpu/gpu_flags.cc](../src/xenia/gpu/gpu_flags.cc).
`--vsync=false` will attempt to render the game as fast as possible instead of
waiting for a fixed 60hz timer.
### Vulkan
See the top of [src/xenia/gpu/vulkan/vulkan_gpu_flags.cc](../src/xenia/gpu/vulkan/vulkan_gpu_flags.cc).
`vulkan_dump_disasm=true` "Dump shader disassembly. NVIDIA only supported."
## Tools
### Shaders
#### Shader Dumps
Adding `--dump_shaders=path/` will write all translated shaders to the given
path with names based on input hash (so they'll be stable across runs).
Binaries containing the original microcode will be placed side-by-side with
the dumped output to make it easy to pipe to `xe-gpu-shader-compiler`.
#### xe-gpu-shader-compiler
A standalone shader compiler exists to allow for quick shader translation
testing. You can pass a binary ucode shader in and get either disassembled
ucode or translated source out. This is best used through the Shader
Playground tool.
```
xe-gpu-shader-compiler \
--shader_input=input_file.bin.vs (or .fs)
--shader_output=output_file.txt
--shader_output_type=ucode (or spirvtext)
```
#### Shader Playground
Built separately (for now) under [tools/shader-playground/](../tools/shader-playground/)
is a GUI for interactive shader assembly, disassembly, validation, and
translation.

Entering shader microcode on the left will invoke the XNA Game Studio
D3D compiler to translate the ucode to binary. The D3D compiler is then
used to disassemble the binary and display the optimized form. If
`xe-gpu-shader-compiler` has been built the ucode will be passed to that
for disassembly and that will then be passed through D3D compiler. If
the output of D3D compiler on the xenia disassembly doesn't match the
original D3D compiler output the box will turn red, indicating that the
disassembly is broken. Finally, the right most box will show the
translated shader in the desired format.
For more information and setup instructions see
[tools/shader-playground/README.md](../tools/shader-playground/README.md).
### xe-gpu-trace-viewer
To quickly iterate on graphical issues, xenia can dump frames (or sequences of
frames) while running that can be opened and inspected in a separate app.
The basic workflow is:
1. Capture the frame in game (using F4) or a stream of frames.
2. Add the file path to the xe-gpu-trace-viewer Debugging command line in
Visual Studio.
3. Launch xe-gpu-trace-viewer.
4. Poke around, find issues, etc.
5. Modify code.
6. Build and relaunch.
7. Goto 4.
#### Capturing Frames
First, specify a path to capture traces to with
`--trace_gpu_prefix=path/file_prefix_`. All files will have a randomish name
based on that.
When running xenia.exe you can hit F4 at any time to capture the next frame the
game tries to draw (up until a VdSwap call). The file can be used immediately.
#### Capturing Sequences
Passing `--trace_gpu_stream` will write all frames rendered to a file, allowing
you to seek through them in the trace viewer. These files will get large.
## References
### Command Buffer/Registers
Registers documented at [src/xenia/gpu/register_table.inc](../src/xenia/gpu/register_table.inc).
PM4 commands documented at [src/xenia/gpu/xenos.h](../src/xenia/gpu/xenos.h#L521).
#### Performance Counters that may be read back by D3D
They are 64-bit values and have a high and low 32-bit register as well as a `SELECT` register each:
- CP_PERFCOUNTER0
- RBBM_PERFCOUNTER0
- RBBM_PERFCOUNTER1
- SQ_PERFCOUNTER0
- SQ_PERFCOUNTER1
- SQ_PERFCOUNTER2
- SQ_PERFCOUNTER3
- VGT_PERFCOUNTER0
- VGT_PERFCOUNTER1
- VGT_PERFCOUNTER2
- VGT_PERFCOUNTER3
- VC_PERFCOUNTER0
- VC_PERFCOUNTER1
- VC_PERFCOUNTER2
- VC_PERFCOUNTER3
- PA_SU_PERFCOUNTER0
- PA_SU_PERFCOUNTER1
- PA_SU_PERFCOUNTER2
- PA_SU_PERFCOUNTER3
- PA_SC_PERFCOUNTER0
- PA_SC_PERFCOUNTER1
- PA_SC_PERFCOUNTER2
- PA_SC_PERFCOUNTER3
- HZ_PERFCOUNTER0
- HZ_PERFCOUNTER1
- TCR_PERFCOUNTER0
- TCR_PERFCOUNTER1
- TCM_PERFCOUNTER0
- TCM_PERFCOUNTER1
- TCF_PERFCOUNTER0
- TCF_PERFCOUNTER1
- TCF_PERFCOUNTER2
- TCF_PERFCOUNTER3
- TCF_PERFCOUNTER4
- TCF_PERFCOUNTER5
- TCF_PERFCOUNTER6
- TCF_PERFCOUNTER7
- TCF_PERFCOUNTER8
- TCF_PERFCOUNTER9
- TCF_PERFCOUNTER10
- TCF_PERFCOUNTER11
- TP0_PERFCOUNTER0
- TP0_PERFCOUNTER1
- TP1_PERFCOUNTER0
- TP1_PERFCOUNTER1
- TP2_PERFCOUNTER0
- TP2_PERFCOUNTER1
- TP3_PERFCOUNTER0
- TP3_PERFCOUNTER1
- SX_PERFCOUNTER0
- BC_PERFCOUNTER0
- BC_PERFCOUNTER1
- BC_PERFCOUNTER2
- BC_PERFCOUNTER3
- MC0_PERFCOUNTER0
- MC1_PERFCOUNTER0
- MH_PERFCOUNTER0
- MH_PERFCOUNTER1
- MH_PERFCOUNTER2
- BIF_PERFCOUNTER0
### Shaders
* [LLVM R600 Tables](https://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/R600Instructions.td)
** The opcode formats don't match, but the name->psuedo code is correct.
* [xemit](https://github.com/gligli/libxemit/blob/master/xemitops.c)
================================================
FILE: docs/instruction_tracing.md
================================================
In x64_tracers.cc:
Enable tracing:
```
#define ITRACE 1 <--- for only ppc instructions
#define DTRACE 1 <--- add HIR data
```
If tracing data, run with the following flags:
```
--store_all_context_values
```
By default, tracing will start at the beginning and only for the specified
thread.
Change traced thread by thread creation ID:
```
#define TARGET_THREAD 4
```
To only trace at a certain point, change default trace flag to false:
```
bool trace_enabled = true;
```
Add a breakpoint:
```
--break_on_instruction=0x821009A4
```
On break, add the following to the Watch window and set it to true:
```
xe::cpu::backend::x64::trace_enabled
```
Continue, and watch stuff appear in the log.
================================================
FILE: docs/kernel.md
================================================
# Kernel Documentation
## Kernel shims
Xenia implements all kernel APIs as native functions under the host.
When a module is loaded, the loader will find all kernel imports, put a syscall in
their place, then lookup a kernel export and link it to each import. The JIT will
generate a sequence of instructions to call into Xenia's export if it encounters a syscall.
Currently, there are two ways an export can be defined -
[for example](../src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc):
* `SHIM_CALL XAudioGetSpeakerConfig_shim(PPCContext* ppc_context, KernelState* kernel_state)`
* `dword_result_t XAudioGetSpeakerConfig(lpdword_t config_ptr)`
The `SHIM_CALL` convention is deprecated, but allows a closer look at the internals of how
calls are done. `ppc_context` is the guest PowerPC context, which holds all guest
registers. Function parameters are fetched from r3...r10 (`SHIM_GET_ARG_32`), and
additional parameters are loaded from the stack. The return value (if there is one)
is stored in r3 (`SHIM_SET_RETURN_32`).
Details on how calls transition from guest -> host can be found in the [cpu documentation](cpu.md).
The newer convention does the same, but uses templates to automate the process
of loading arguments and setting a return value.
## Kernel Modules
Xenia has an implementation of two xbox kernel modules, xboxkrnl.exe and xam.xex
### xboxkrnl.exe - Xbox kernel
Defined under src/xenia/kernel/xboxkrnl.
This is a slightly modified version of the NT kernel. Most of the APIs
are equivalent to ones you'd find on MSDN or other online sources.
Source files are organized into groups of APIs.
### xam.xex - Xbox Auxiliary Methods
Defined under src/xenia/kernel/xam.
This module implements functionality specific to the Xbox.
================================================
FILE: docs/ppc/vmx128.txt
================================================
2006/09/01 Revision 1.2
-----------------------------------------------------------------
This is a description of the VMX128-type opcodes found on
the xbox360 processor. I figured this out by looking at
various disassmblies, so there might some errors and
missing instructions. Some instructions have unknown
semantics for me.
See comments or corrections to sb#biallas.net
=================================================================
Conventions:
VD128, VS128: 5 lower bits of a VMX128 vector register
number
VDh: upper 2 bits of VD128
(so register number is (VDh << 5 | VD128))
VA128: same as VD128
A: bit 6 of VA128
a: bit 5 of VA128
(so register number is (A<<6 | a<<5 | VA128))
VB128: same as VD128
VBh: same as VDh
VC128: 3 bits of a VMX128 vector register number
(you can only use vr0-vr7 here)
RA, RB: general purpose register number
UIMM: unsigned immediate value
SIMM: signed immediate value
PERMh: upper 3 bits of a permutation
PERMl: lower 5 bits of a permutation
x, y, z: unknown immediate values
=================================================================
lvewx128 Load Vector128 Element Word Indexed
|0 0 0 1 0 0| VD128 | RA | RB |0 0 0 1 0 0 0|VDh|1 1|
lvewx128 vr(VD128), r(RA), r(RB)
=================================================================
lvlx128 Load Vector128 Left Indexed
|0 0 0 1 0 0| VD128 | RA | RB |1 0 0 0 0 0 0|VDh|1 1|
lvlx128 vr(VD128), r(RA), r(RB)
=================================================================
lvrx128 Load Vector128 Right Indexed
|0 0 0 1 0 0| VD128 | RA | RB |1 0 0 0 1 0 0|VDh|1 1|
lvrx128 vr(VD128), r(RA), r(RB)
=================================================================
lvlxl128 Load Vector128 Left Indexed LRU
|0 0 0 1 0 0| VD128 | RA | RB |1 1 0 0 0 0 0|VDh|1 1|
lvlxl128 vr(VD128), r(RA), r(RB)
=================================================================
lvrxl128 Load Vector128 Right Indexed LRU
|0 0 0 1 0 0| VD128 | RA | RB |1 1 0 0 1 0 0|VDh|1 1|
lvrxl128 vr(VD128), r(RA), r(RB)
=================================================================
lvsl128 Load Vector128 for Shift Left
|0 0 0 1 0 0| VD128 | RA | RB |0 0 0 0 0 0 0|VDh|1 1|
lvsl128 vr(VD128), r(RA), r(RB)
=================================================================
lvsr128 Load Vector128 for Shift Right
|0 0 0 1 0 0| VD128 | RA | RB |0 0 0 0 1 0 0|VDh|1 1|
lvsr128 vr(VD128), r(RA), r(RB)
=================================================================
lvx128 Load Vector128 Indexed
|0 0 0 1 0 0| VD128 | RA | RB |0 0 0 1 1 0 0|VDh|1 1|
lvx128 vr(VD128), r(RA), r(RB)
=================================================================
lvxl128 Load Vector128 Indexed LRU
|0 0 0 1 0 0| VD128 | RA | RB |0 1 0 1 1 0 0|VDh|1 1|
lvxl128 vr(VD128), r(RA), r(RB)
=================================================================
stewx128 Store Vector128 Element Word Indexed
|0 0 0 1 0 0| VS128 | RA | RB |0 1 1 0 0 0 0|VDh|1 1|
stvewx128 vr(VS128), r(RA), r(RB)
=================================================================
stvlx128 Store Vector128 Left Indexed
|0 0 0 1 0 0| VS128 | RA | RB |1 0 1 0 0 0 0|VDh|1 1|
stvlx128 vr(VS128), r(RA), r(RB)
=================================================================
stvlxl128 Store Vector128 Left Indexed LRU
|0 0 0 1 0 0| VS128 | RA | RB |1 1 1 0 0 0 0|VDh|1 1|
lvlxl128 vr(VS128), r(RA), r(RB)
=================================================================
stvrx128 Store Vector128 Right Indexed
|0 0 0 1 0 0| VS128 | RA | RB |1 0 1 0 1 0 0|VDh|1 1|
stvrx128 vr(VS128), r(RA), r(RB)
=================================================================
stvrxl128 Store Vector128 Right Indexed LRU
|0 0 0 1 0 0| VS128 | RA | RB |1 1 1 0 1 0 0|VDh|1 1|
stvrxl128 vr(VS128), r(RA), r(RB)
=================================================================
stvx128 Store Vector128 Indexed
|0 0 0 1 0 0| VS128 | RA | RB |0 0 1 1 1 0 0|VDh|1 1|
stvx128 vr(VS128), r(RA), r(RB)
=================================================================
stvxl128 Store Vector128 Indexed LRU
|0 0 0 1 0 0| VS128 | RA | RB |0 1 1 1 1 0 0|VDh|1 1|
stvxl128 vr(VS128), r(RA), r(RB)
=================================================================
vaddfp128 Vector128 Add Floating Point
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 0 0 0|a|1|VDh|VBh|
vaddfp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vand128 Vector128 Logical AND
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 0 0|a|1|VDh|VBh|
vand128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vandc128 Vector128 Logical AND
with Complement
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 0|a|1|VDh|VBh|
vandc128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vcfpsxws128 Vector128 Convert From Floating-Point to
Signed Fixed-Point Word Saturate
|0 0 0 1 1 0| VD128 | SIMM | VB128 |0 1 0 0 0 1 1|VDh|VBh|
vcfpsxws128 vr(VD128), vr(VB128), SIMM
=================================================================
vcfpuxws128 Vector128 Convert From Floating-Point to
Unsigned Fixed-Point Word Saturate
|0 0 0 1 1 0| VD128 | UIMM | VB128 |0 1 0 0 1 1 1|VDh|VBh|
vcfpuxws128 vr(VD128), vr(VB128), UIMM
=================================================================
vcmpbfp128 Vector128 Compare Bounds
Floating Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 1 1|R|a|0|VDh|VBh|
vcmpbfp128 vr(VD128), vr(VA128), vr(VB128) (R == 0)
vcmpbfp128. vr(VD128), vr(VA128), vr(VB128) (R == 1)
=================================================================
vcmpeqfp128 Vector128 Compare Equal-to
Floating Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 0 0|R|a|0|VDh|VBh|
vcmpeqfp128 vr(VD128), vr(VA128), vr(VB128) (R == 0)
vcmpeqfp128. vr(VD128), vr(VA128), vr(VB128) (R == 1)
=================================================================
vcmpequw128 Vector128 Compare Equal-to
Unsigned Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 0 0|R|a|0|VDh|VBh|
vcmpequw128 vr(VD128), vr(VA128), vr(VB128) (R == 0)
vcmpequw128. vr(VD128), vr(VA128), vr(VB128) (R == 1)
=================================================================
vcmpgefp128 Vector128 Compare Greater-Than-
or-Equal-to Floating Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 0 1|R|a|0|VDh|VBh|
vcmpgefp128 vr(VD128), vr(VA128), vr(VB128) (R == 0)
vcmpgefp128. vr(VD128), vr(VA128), vr(VB128) (R == 1)
=================================================================
vcmpgtfp128 Vector128 Compare Greater-Than
Floating-Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 1 0|R|a|0|VDh|VBh|
vcmpgtfp128 vr(VD128), vr(VA128), vr(VB128) (R == 0)
vcmpgtfp128. vr(VD128), vr(VA128), vr(VB128) (R == 1)
=================================================================
vcsxwfp128 Vector128 Convert From Signed Fixed-Point
Word to Floating-Point
|0 0 0 1 1 0| VD128 | UIMM | VB128 |0 1 0 1 0 1 1|VDh|VBh|
vcsxwfp128 vr(VD128), vr(VB128), SIMM
=================================================================
vcuxwfp128 Vector128 Convert From Unsigned Fixed-Point
Word to Floating-Point
|0 0 0 1 1 0| VD128 | UIMM | VB128 |0 1 0 1 1 1 1|VDh|VBh|
vcuxwfp128 vr(VD128), vr(VB128), UIMM
=================================================================
vexptefp128 Vector128 2 Raised to the Exponent
Estimate Floating Point
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |1 1 0 1 0 1 1|VDh|VBh|
vexptefp128 vr(VD128), vr(VB128)
=================================================================
vlogefp128 Vector128 Log2 Estimate
Floating Point
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |1 1 0 1 1 1 1|VDh|VBh|
vlogefp128 vr(VD128), vr(VB128)
=================================================================
vmaddcfp128 Vector128 Multiply Add
Floating Point
|0 0 0 1 0 1| VDS128 | VA128 | VB128 |A|0 1 0 0|a|1|VDh|VBh|
vmaddcfp128 vr(VDS128), vr(VA128), vr(VSD128), vr(VB128)
=================================================================
vmaddfp128 Vector128 Multiply Add
Floating Point
|0 0 0 1 0 1| VDS128 | VA128 | VB128 |A|0 0 1 1|a|1|VDh|VBh|
vmaddfp128 vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)
=================================================================
vmaxfp128 Vector128 Maximum
Floating Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 0 1 0|a|0|VDh|VBh|
vmaxfp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vminfp128 Vector128 Minimum
Floating Point
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 0 1 1|a|0|VDh|VBh|
vminfp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vmrghw128 Vector128 Merge High Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 1 0 0|a|0|VDh|VBh|
vmrghw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vmrglw128 Vector128 Merge Low Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 1 0 1|a|0|VDh|VBh|
vmrglw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vmsum3fp128 Vector128 Multiply Sum 3-way
Floating Point
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 1 1 0|a|1|VDh|VBh|
vmsub3fp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vmsum4fp128 Vector128 Multiply Sum 4-way
Floating-Point
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 1 1 1|a|1|VDh|VBh|
vmsub4fp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vmulfp128 Vector128 Multiply
Floating-Point
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 0 1 0|a|1|VDh|VBh|
vmulfp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vnmsubfp128 Vector128 Negative Multiply-Subtract
Floating Point
|0 0 0 1 0 1| VDS128 | VA128 | VB128 |A|0 1 0 1|a|1|VDh|VBh|
vnmsubfp128 vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)
=================================================================
vnor128 Vector128 Logical NOR
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 0|a|1|VDh|VBh|
vnor128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vor128 Vector128 Logical OR
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 1|a|1|VDh|VBh|
vor128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vperm128 Vector128 Permutation
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0| VC |a|0|VDh|VBh|
vperm128 vr(VD128), vr(VA128), vr(VB128), vr(VC)
=================================================================
vpermwi128 Vector128 Permutate Word Immediate
|0 0 0 1 1 0| VD128 | PERMl | VB128 |0|1|PERMh|0|1|VDh|VBh|
vpermwi128 vr(VD128), vr(VB128), (PERMh << 5 | PERMl)
=================================================================
vpkd3d128 Vector128 Pack D3Dtype, Rotate Left
Immediate and Mask Insert
|0 0 0 1 1 0| VD128 | x | y | VB128 |1 1 0| z |0 1|VDh|VBh|
vpkd3d128 vr(VD128), vr(VB128), x, y, z
=================================================================
vpkshss128 Vector128 Pack Signed Half Word
Signed Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 0 0|a|0|VDh|VBh|
vpkshss128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkshus128 Vector128 Pack Signed Half Word
Unsigned Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 0 1|a|0|VDh|VBh|
vpkshus128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkswss128 Vector128 Pack Signed Word
Signed Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 0|a|0|VDh|VBh|
vpkswss128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkswus128 Vector128 Pack Signed Word
Unsigned Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 0 1 1|a|0|VDh|VBh|
vpkswus128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkuhum128 Vector128 Pack Unsigned Half Word
Unsigned Modulo
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 0 0|a|0|VDh|VBh|
vpkuhum128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkuhus128 Vector128 Pack Unsigned Half Word
Unsigned Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 0 1|a|0|VDh|VBh|
vpkuhus128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkuwum128 Vector128 Pack Unsigned Word
Unsigned Modulo
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 1 0|a|0|VDh|VBh|
vpkuwum128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vpkuwus128 Vector128 Pack Unsigned Word
Unsigned Saturate
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 1 1|a|0|VDh|VBh|
vpkuwus128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vrefp128 Vector128 Reciprocal Estimate
Floating Point
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |1 1 0 0 0 1 1|VDh|VBh|
vrefp128 vr(VD128), vr(VB128)
=================================================================
vrfim128 Vector128 Round to Floating-Point
Integer toward -oo
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 0 0 1 1|VDh|VBh|
vrfim128 vr(VD128), vr(VB128)
=================================================================
vrfin128 Vector128 Round to Floating-Point
Integer toward Nearest
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 0 1 1 1|VDh|VBh|
vrfin128 vr(VD128), vr(VB128)
=================================================================
vrfip128 Vector128 Round to Floating-Point
Integer toward +oo
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 1 0 1 1|VDh|VBh|
vrfip128 vr(VD128), vr(VB128)
=================================================================
vrfiz128 Vector128 Round to Floating-Point
Integer toward Zero
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 1 1 1 1|VDh|VBh|
vrfiz128 vr(VD128), vr(VB128)
=================================================================
vrlimi128 Vector128 Rotate Left Immediate
and Mask Insert
|0 0 0 1 1 0| VD128 | UIMM | VB128 |1 1 1| z |0 1|VDh|VBh|
vrlimi128 vr(VD128), vr(VB128), UIMM, z
=================================================================
vrlw128 Vector128 Rotate Left Word
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 0 0 1|a|1|VDh|VBh|
vrlw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vrsqrtefp128 Vector128 Reciprocal Square Root
Estimate Floating Point
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |1 1 0 0 1 1 1|VDh|VBh|
vrsqrtefp128 vr(VD128), vr(VB128)
=================================================================
vsel128 Vector128 Select
|0 0 0 1 0 1| VDS128 | VA128 | VB128 |A|1 1 0 1|a|1|VDh|VBh|
vsel128 vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)
=================================================================
vsldoi128 Vector128 Shift Left Double
by Octet Immediate
|0 0 0 1 0 0| VD128 | VA128 | VB128 |A| SHB |a|1|VDh|VBh|
vsldoi128 vr(VD128), vr(VA128), vr(VB128), SHB
=================================================================
vslo128 Vector128 Shift Left Octet
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 1 0|a|1|VDh|VBh|
vslo128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vslw128 Vector128 Shift Left Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 0 1 1|a|1|VDh|VBh|
vslw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vspltisw128 Vector128 Splat Immediate
Signed Word
|0 0 0 1 1 0| VD128 | SIMM | VB128 |1 1 1 0 1 1 1|VDh|VBh|
vspltisw128 vr(VD128), vr(VB128), SIMM
=================================================================
vspltw128 Vector128 Splat Word
|0 0 0 1 1 0| VD128 | UIMM | VB128 |1 1 1 0 0 1 1|VDh|VBh|
vspltw128 vr(VD128), vr(VB128), UIMM
=================================================================
vsraw128 Vector128 Shift Right
Arithmetic Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 1 0 1|a|1|VDh|VBh|
vsraw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vsro128 Vector128 Shift Right Octet
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|1 1 1 1|a|1|VDh|VBh|
vsro128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vsrw128 Vector128 Shift Right Word
|0 0 0 1 1 0| VD128 | VA128 | VB128 |A|0 1 1 1|a|1|VDh|VBh|
vsrw128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vsubfp128 Vector128 Subtract Floating Point
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|0 0 0 1|a|1|VDh|VBh|
vsubfp128 vr(VD128), vr(VA128), vr(VB128)
=================================================================
vupkd3d128 Vector128 Unpack D3Dtype
|0 0 0 1 1 0| VD128 | UIMM | VB128 |1 1 1 1 1 1 1|VDh|VBh|
vupkd3d128 vr(VD128), vr(VB128), UIMM
=================================================================
vupkhsb128 Vector128 Unpack
High Signed Byte
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 1 0 0 0|VDh|VBh|
vupkhsb128 vr(VD128), vr(VB128)
=================================================================
vupklsb128 Vector128 Unpack
Low Signed Byte
|0 0 0 1 1 0| VD128 |0 0 0 0 0| VB128 |0 1 1 1 1 0 0|VDh|VBh|
vupkhsb128 vr(VD128), vr(VB128)
=================================================================
vxor128 Vector128 Logical XOR
|0 0 0 1 0 1| VD128 | VA128 | VB128 |A|1 1 0 0|a|1|VDh|VBh|
vxor128 vr(VD128), vr(VA128), vr(VB128)
================================================
FILE: docs/style_guide.md
================================================
# C++ Style Guide
The style guide can be summed up as 'clang-format with the Google style set'.
In addition, the [Google Style Guide](https://google.github.io/styleguide/cppguide.html)
is followed and cpplint is the source of truth. When in doubt, defer to what
code in the project already does.
Base rules:
* 80 column line length max
* LF (Unix-style) line endings
* 2-space soft tabs, no TABs!
* [Google Style Guide](https://google.github.io/styleguide/cppguide.html) for naming/casing/etc
* Sort includes according to the [style guide rules](https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes)
* Comments are properly punctuated (that means capitalization and periods, etc)
* TODO's must be attributed like `// TODO(yourgithubname): foo.`
Code that really breaks from the formatting rules will not be accepted, as then
no one else can use clang-format on the code without also touching all your
lines.
### Why?
To quote the [Google Style Guide](https://google.github.io/styleguide/cppguide.html):
```
One way in which we keep the code base manageable is by enforcing consistency.
It is very important that any programmer be able to look at another's code and
quickly understand it. Maintaining a uniform style and following conventions
means that we can more easily use "pattern-matching" to infer what various
symbols are and what invariants are true about them. Creating common, required
idioms and patterns makes code much easier to understand. In some cases there
might be good arguments for changing certain style rules, but we nonetheless
keep things as they are in order to preserve consistency.
```
## Buildbot Verification
The buildbot runs `xb lint --all` on the master branch, and will run
`xb lint --origin` on pull requests. Run `xb format` before you commit each
local change so that you are consistently clean, otherwise you may have to
rebase. If you forget, run `xb format --origin` and rebase your changes (so you
don't end up with 5 changes and then a 6th 'whoops' one — that's nasty).
The buildbot is running LLVM 3.8.0. If you are noticing style differences
between your local lint/format and the buildbot, ensure you are running that
version.
## Tools
### clang-format
clang-format with the Google style is used to format all files. I recommend
installing/wiring it up to your editor of choice so that you don't even have to
think about tabs and wrapping and such.
#### Command Line
To use the `xb format` auto-formatter, you need to have a `clang-format` on your
PATH. If you're on Windows you can do this by installing an LLVM binary package
from [the LLVM downloads page](https://llvm.org/releases/download.html). If you
install it to the default location the `xb format` command will find it
automatically even if you don't choose to put all of LLVM onto your PATH.
#### Visual Studio
Grab the official [experimental Visual Studio plugin](https://llvm.org/builds/).
To switch to the Google style go Tools -> Options -> LLVM/Clang -> ClangFormat
and set Style to Google. Then use ctrl-r/ctrl-f to trigger the formatting.
Unfortunately it only does the cursor by default, so you'll have to select the
whole doc and invoke it to get it all done.
If you have a better option, let me know!
#### Xcode
Install [Alcatraz](https://github.com/alcatraz/Alcatraz) to get the [ClangFormat](https://github.com/travisjeffery/ClangFormat-Xcode)
package. Set it to use the Google style and format on save. Never think about
tabs or linefeeds or whatever again.
### cpplint
TODO(benvanik): write a cool script to do this/editor plugins.
In the future, the linter will run as a git commit hook and on travis.
# Android Style Guide
Android Java and Groovy code and XML files currently don't have automatic format
verification during builds, however, stick to the [AOSP Java Code Style Rules](https://source.android.com/setup/contribute/code-style),
which contain guidelines not only for code formatting, but for the usage of
language features as well.
The formatting rules used in Xenia match the default Android Studio settings.
They diverge from the C++ code style rules of Xenia in many areas, such as
indentation width and the maximum line length, however, the goal for Android
formatting in Xenia is to ensure quick development environment setup.
In Java code, limit the length of each line to 100 characters. If an assignment
doesn't fit in the limit, move the right-hand side of it to a separate line with
8-space indentation. Similarly, if the argument list of a method declaration or
a call is too long, start the entire argument list on a new line, also indented
with 8 spaces — this is one of the differences from the C++ code style in Xenia,
where arguments may be aligned with the opening bracket. In general, follow the
[rectangle rule](https://github.com/google/google-java-format/wiki/The-Rectangle-Rule)
so expressions in the code constitute a hierarchy of their bounding rectangles,
ensuring that with 4-space indentation for block contents and 8-space
indentation for subexpressions.
In XML files, if the width of the line with an element exceeds 100 characters,
or in most cases when there are multiple attributes, each attribute should be
placed on a separate line with 4-space indentation, with the exception of the
first `xmlns`, which should stay on the same line as the element name.
In Groovy, use 4-space indentation for blocks and 8-space indentation for
splitting arguments into multiple lines. String literals should be written in
single quotes unless string interpolation is used.
You can use the Code -> Reformat Code and Code -> Reformat File options in
Android Studio to apply coarse formatting rules for different kinds of files
supported by Android Studio, such as Java, XML and Groovy. While clang-format is
very strict and generates code with the single allowed way of formatting,
Android Studio, however, preserves many style choices in the original code, so
it's recommended to approximate the final style manually instead of relying
entirely on automatic formatting. Also use Code -> Rearrange Code to maintain a
consistent structure of Java class declarations.
================================================
FILE: premake5.lua
================================================
include("tools/build")
require("third_party/premake-export-compile-commands/export-compile-commands")
require("third_party/premake-androidndk/androidndk")
require("third_party/premake-cmake/cmake")
location(build_root)
targetdir(build_bin)
objdir(build_obj)
-- Define an ARCH variable
-- Only use this to enable architecture-specific functionality.
if os.istarget("linux") then
ARCH = os.outputof("uname -p")
else
ARCH = "unknown"
end
includedirs({
".",
"src",
"third_party",
})
defines({
"_UNICODE",
"UNICODE",
})
cppdialect("C++17")
exceptionhandling("On")
rtti("On")
symbols("On")
-- TODO(DrChat): Find a way to disable this on other architectures.
if ARCH ~= "ppc64" then
filter("architecture:x86_64")
vectorextensions("AVX")
filter({})
end
characterset("Unicode")
flags({
"FatalWarnings", -- Treat warnings as errors.
})
filter("kind:StaticLib")
defines({
"_LIB",
})
filter("configurations:Checked")
runtime("Debug")
optimize("Off")
defines({
"DEBUG",
})
filter({"configurations:Checked", "platforms:Windows"})
buildoptions({
"/RTCsu", -- Full Run-Time Checks.
})
filter({"configurations:Checked", "platforms:Linux"})
defines({
"_GLIBCXX_DEBUG", -- libstdc++ debug mode
})
filter("configurations:Debug")
runtime("Release")
optimize("Off")
defines({
"DEBUG",
"_NO_DEBUG_HEAP=1",
})
filter({"configurations:Debug", "platforms:Linux"})
defines({
"_GLIBCXX_DEBUG", -- make dbg symbols work on some distros
})
filter("configurations:Release")
runtime("Release")
defines({
"NDEBUG",
"_NO_DEBUG_HEAP=1",
})
optimize("Speed")
inlining("Auto")
flags({
"LinkTimeOptimization",
})
-- Not using floatingpoint("Fast") - NaN checks are used in some places
-- (though rarely), overall preferable to avoid any functional differences
-- between debug and release builds, and to have calculations involved in GPU
-- (especially anything that may affect vertex position invariance) and CPU
-- (such as constant propagation) emulation as predictable as possible,
-- including handling of specials since games make assumptions about them.
filter("platforms:Linux")
system("linux")
toolset("clang")
buildoptions({
-- "-mlzcnt", -- (don't) Assume lzcnt is supported.
})
pkg_config.all("gtk+-x11-3.0")
links({
"stdc++fs",
"dl",
"lz4",
"pthread",
"rt",
})
filter({"platforms:Linux", "kind:*App"})
linkgroups("On")
filter({"platforms:Linux", "language:C++", "toolset:gcc"})
disablewarnings({
"unused-result"
})
filter({"platforms:Linux", "toolset:gcc"})
if ARCH == "ppc64" then
buildoptions({
"-m32",
"-mpowerpc64"
})
linkoptions({
"-m32",
"-mpowerpc64"
})
end
filter({"platforms:Linux", "language:C++", "toolset:clang"})
disablewarnings({
"deprecated-register"
})
filter({"platforms:Linux", "language:C++", "toolset:clang", "files:*.cc or *.cpp"})
buildoptions({
"-stdlib=libstdc++",
})
filter("platforms:Android-*")
system("android")
systemversion("24")
cppstl("c++")
staticruntime("On")
-- Hidden visibility is needed to prevent dynamic relocations in FFmpeg
-- AArch64 Neon libavcodec assembly with PIC (accesses extern lookup tables
-- using `adrp` and `add`, without the Global Object Table, expecting that all
-- FFmpeg symbols that aren't a part of the FFmpeg API are hidden by FFmpeg's
-- original build system) by resolving those relocations at link time instead.
visibility("Hidden")
links({
"android",
"dl",
"log",
})
filter("platforms:Windows")
system("windows")
toolset("msc")
buildoptions({
"/utf-8", -- 'build correctly on systems with non-Latin codepages'.
-- Mark warnings as severe
"/w14839", -- non-standard use of class 'type' as an argument to a variadic function
"/w14840", -- non-portable use of class 'type' as an argument to a variadic function
-- Disable warnings
"/wd4100", -- Unreferenced parameters are ok.
"/wd4201", -- Nameless struct/unions are ok.
"/wd4512", -- 'assignment operator was implicitly defined as deleted'.
"/wd4127", -- 'conditional expression is constant'.
"/wd4324", -- 'structure was padded due to alignment specifier'.
"/wd4189", -- 'local variable is initialized but not referenced'.
})
flags({
"MultiProcessorCompile", -- Multiprocessor compilation.
"NoMinimalRebuild", -- Required for /MP above.
})
defines({
"_CRT_NONSTDC_NO_DEPRECATE",
"_CRT_SECURE_NO_WARNINGS",
"WIN32",
"_WIN64=1",
"_AMD64=1",
})
linkoptions({
"/ignore:4006", -- Ignores complaints about empty obj files.
"/ignore:4221",
})
links({
"ntdll",
"wsock32",
"ws2_32",
"xinput",
"comctl32",
"shcore",
"shlwapi",
"dxguid",
"bcrypt",
})
-- Embed the manifest for things like dependencies and DPI awareness.
filter({"platforms:Windows", "kind:ConsoleApp or WindowedApp"})
files({
"src/xenia/base/app_win32.manifest"
})
-- Create scratch/ path
if not os.isdir("scratch") then
os.mkdir("scratch")
end
workspace("xenia")
uuid("931ef4b0-6170-4f7a-aaf2-0fece7632747")
startproject("xenia-app")
if os.istarget("android") then
platforms({"Android-ARM64", "Android-x86_64"})
filter("platforms:Android-ARM64")
architecture("ARM64")
filter("platforms:Android-x86_64")
architecture("x86_64")
filter({})
else
architecture("x86_64")
if os.istarget("linux") then
platforms({"Linux"})
elseif os.istarget("macosx") then
platforms({"Mac"})
xcodebuildsettings({
["ARCHS"] = "x86_64"
})
elseif os.istarget("windows") then
platforms({"Windows"})
-- 10.0.15063.0: ID3D12GraphicsCommandList1::SetSamplePositions.
-- 10.0.19041.0: D3D12_HEAP_FLAG_CREATE_NOT_ZEROED.
-- 10.0.22000.0: DWMWA_WINDOW_CORNER_PREFERENCE.
filter("action:vs2017")
systemversion("10.0.22000.0")
filter("action:vs2019")
systemversion("10.0")
filter({})
end
end
configurations({"Checked", "Debug", "Release"})
include("third_party/aes_128.lua")
include("third_party/capstone.lua")
include("third_party/dxbc.lua")
include("third_party/discord-rpc.lua")
include("third_party/cxxopts.lua")
include("third_party/cpptoml.lua")
include("third_party/FFmpeg/premake5.lua")
include("third_party/fmt.lua")
include("third_party/glslang-spirv.lua")
include("third_party/imgui.lua")
include("third_party/mspack.lua")
include("third_party/snappy.lua")
include("third_party/xxhash.lua")
if not os.istarget("android") then
-- SDL2 requires sdl2-config, and as of November 2020 isn't high-quality on
-- Android yet, most importantly in game controllers - the keycode and axis
-- enums are being ruined during conversion to SDL2 enums resulting in only
-- one controller (Nvidia Shield) being supported, digital triggers are also
-- not supported; lifecycle management (especially surface loss) is also
-- complicated.
include("third_party/SDL2.lua")
end
-- Disable treating warnings as fatal errors for all third party projects, as
-- well as other things relevant only to Xenia itself.
for _, prj in ipairs(premake.api.scope.current.solution.projects) do
project(prj.name)
removefiles({
"src/xenia/base/app_win32.manifest"
})
removeflags({
"FatalWarnings",
})
end
include("src/xenia")
include("src/xenia/app")
include("src/xenia/app/discord")
include("src/xenia/apu")
include("src/xenia/apu/nop")
include("src/xenia/base")
include("src/xenia/cpu")
include("src/xenia/cpu/backend/x64")
include("src/xenia/debug/ui")
include("src/xenia/gpu")
include("src/xenia/gpu/null")
include("src/xenia/gpu/vulkan")
include("src/xenia/hid")
include("src/xenia/hid/nop")
include("src/xenia/kernel")
include("src/xenia/ui")
include("src/xenia/ui/vulkan")
include("src/xenia/vfs")
if not os.istarget("android") then
include("src/xenia/apu/sdl")
include("src/xenia/helper/sdl")
include("src/xenia/hid/sdl")
end
if os.istarget("windows") then
include("src/xenia/apu/xaudio2")
include("src/xenia/gpu/d3d12")
include("src/xenia/hid/winkey")
include("src/xenia/hid/xinput")
include("src/xenia/ui/d3d12")
end
================================================
FILE: src/xenia/app/discord/discord_presence.cc
================================================
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "discord_presence.h"
#include "third_party/discord-rpc/include/discord_rpc.h"
#include "xenia/base/string.h"
namespace xe {
namespace discord {
void HandleDiscordReady(const DiscordUser* request) {}
void HandleDiscordError(int errorCode, const char* message) {}
void HandleDiscordJoinGame(const char* joinSecret) {}
void HandleDiscordJoinRequest(const DiscordUser* request) {}
void HandleDiscordSpectateGame(const char* spectateSecret) {}
void DiscordPresence::Initialize() {
DiscordEventHandlers handlers = {};
handlers.ready = &HandleDiscordReady;
handlers.errored = &HandleDiscordError;
handlers.joinGame = &HandleDiscordJoinGame;
handlers.joinRequest = &HandleDiscordJoinRequest;
handlers.spectateGame = &HandleDiscordSpectateGame;
Discord_Initialize("606840046649081857", &handlers, 0, "");
}
void DiscordPresence::NotPlaying() {
DiscordRichPresence discordPresence = {};
discordPresence.state = "Idle";
discordPresence.details = "Standby";
discordPresence.largeImageKey = "app";
discordPresence.instance = 1;
Discord_UpdatePresence(&discordPresence);
}
void DiscordPresence::PlayingTitle(const std::string_view game_title) {
auto details = std::string(game_title);
DiscordRichPresence discordPresence = {};
discordPresence.state = "In Game";
discordPresence.details = details.c_str();
// TODO(gibbed): we don't have state icons yet.
// discordPresence.smallImageKey = "app";
// discordPresence.largeImageKey = "state_ingame";
discordPresence.largeImageKey = "app";
discordPresence.instance = 1;
Discord_UpdatePresence(&discordPresence);
}
void DiscordPresence::Shutdown() { Discord_Shutdown(); }
} // namespace discord
} // namespace xe
================================================
FILE: src/xenia/app/discord/discord_presence.h
================================================
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_DISCORD_DISCORD_PRESENCE_H_
#define XENIA_DISCORD_DISCORD_PRESENCE_H_
#include <string>
namespace xe {
namespace discord {
class DiscordPresence {
public:
static void Initialize();
static void NotPlaying();
static void PlayingTitle(const std::string_view game_title);
static void Shutdown();
};
} // namespace discord
} // namespace xe
#endif // XENIA_DISCORD_DISCORD_PRESENCE_H_
================================================
FILE: src/xenia/app/discord/premake5.lua
================================================
project_root = "../../../.."
include(project_root.."/tools/build")
group("src")
project("xenia-app-discord")
uuid("d14c0885-22d2-40de-ab28-7b234ef2b949")
kind("StaticLib")
language("C++")
links({
"discord-rpc"
})
defines({
})
includedirs({
project_root.."/third_party/discord-rpc/src"
})
files({
"discord_presence.cc",
"discord_presence.h"
})
================================================
FILE: src/xenia/app/emulator_window.cc
================================================
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/app/emulator_window.h"
#include <filesystem>
#include <functional>
#include <memory>
#include <mutex>
#include <string>
#include <utility>
#include "third_party/fmt/include/fmt/format.h"
#include "third_party/imgui/imgui.h"
#include "xenia/base/assert.h"
#include "xenia/base/clock.h"
#include "xenia/base/cvar.h"
#include "xenia/base/debugging.h"
#include "xenia/base/logging.h"
#include "xenia/base/platform.h"
#include "xenia/base/profiling.h"
#include "xenia/base/system.h"
#include "xenia/base/threading.h"
#include "xenia/cpu/processor.h"
#include "xenia/emulator.h"
#include "xenia/gpu/command_processor.h"
#include "xenia/gpu/graphics_system.h"
#include "xenia/ui/file_picker.h"
#include "xenia/ui/graphics_provider.h"
#include "xenia/ui/imgui_dialog.h"
#include "xenia/ui/imgui_drawer.h"
#include "xenia/ui/immediate_drawer.h"
#include "xenia/ui/presenter.h"
#include "xenia/ui/ui_event.h"
#include "xenia/ui/virtual_key.h"
// Autogenerated by `xb premake`.
#include "build/version.h"
DECLARE_bool(debug);
DEFINE_bool(fullscreen, false, "Whether to launch the emulator in fullscreen.",
"Display");
DEFINE_string(
postprocess_antialiasing, "",
"Post-processing anti-aliasing effect to apply to the image output of the "
"game.\n"
"Using post-process anti-aliasing is heavily recommended when AMD "
"FidelityFX Contrast Adaptive Sharpening or Super Resolution 1.0 is "
"active.\n"
"Use: [none, fxaa, fxaa_extreme]\n"
" none (or any value not listed here):\n"
" Don't alter the original image.\n"
" fxaa:\n"
" NVIDIA Fast Approximate Anti-Aliasing 3.11, normal quality preset (12)."
"\n"
" fxaa_extreme:\n"
" NVIDIA Fast Approximate Anti-Aliasing 3.11, extreme quality preset "
"(39).",
"Display");
DEFINE_string(
postprocess_scaling_and_sharpening, "",
"Post-processing effect to use for resampling and/or sharpening of the "
"final display output.\n"
"Use: [bilinear, cas, fsr]\n"
" bilinear (or any value not listed here):\n"
" Original image at 1:1, simple bilinear stretching for resampling.\n"
" cas:\n"
" Use AMD FidelityFX Contrast Adaptive Sharpening (CAS) for sharpening "
"at scaling factors of up to 2x2, with additional bilinear stretching for "
"larger factors.\n"
" fsr:\n"
" Use AMD FidelityFX Super Resolution 1.0 (FSR) for highest-quality "
"upscaling, or AMD FidelityFX Contrast Adaptive Sharpening for sharpening "
"while not scaling or downsampling.\n"
" For scaling by factors of more than 2x2, multiple FSR passes are done.",
"Display");
DEFINE_double(
postprocess_ffx_cas_additional_sharpness,
xe::ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessDefault,
"Additional sharpness for AMD FidelityFX Contrast Adaptive Sharpening "
"(CAS), from 0 to 1.\n"
"Higher is sharper.",
"Display");
DEFINE_uint32(
postprocess_ffx_fsr_max_upsampling_passes,
xe::ui::Presenter::GuestOutputPaintConfig::kFsrMaxUpscalingPassesMax,
"Maximum number of upsampling passes performed in AMD FidelityFX Super "
"Resolution 1.0 (FSR) before falling back to bilinear stretching after the "
"final pass.\n"
"Each pass upscales only to up to 2x2 the previous size. If the game "
"outputs a 1280x720 image, 1 pass will upscale it to up to 2560x1440 "
"(below 4K), after 2 passes it will be upscaled to a maximum of 5120x2880 "
"(including 3840x2160 for 4K), and so on.\n"
"This variable has no effect if the display resolution isn't very high, "
"but may be reduced on resolutions like 4K or 8K in case the performance "
"impact of multiple FSR upsampling passes is too high, or if softer edges "
"are desired.\n"
"The default value is the maximum internally supported by Xenia.",
"Display");
DEFINE_double(
postprocess_ffx_fsr_sharpness_reduction,
xe::ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionDefault,
"Sharpness reduction for AMD FidelityFX Super Resolution 1.0 (FSR), in "
"stops.\n"
"Lower is sharper.",
"Display");
// Dithering to 8bpc is enabled by default since the effect is minor, only
// effects what can't be shown normally by host displays, and nothing is changed
// by it for 8bpc source without resampling.
DEFINE_bool(
postprocess_dither, true,
"Dither the final image output from the internal precision to 8 bits per "
"channel so gradients are smoother.\n"
"On a 10bpc display, the lower 2 bits will still be kept, but noise will "
"be added to them - disabling may be recommended for 10bpc, but it "
"depends on the 10bpc displaying capabilities of the actual display used.",
"Display");
namespace xe {
namespace app {
using xe::ui::FileDropEvent;
using xe::ui::KeyEvent;
using xe::ui::MenuItem;
using xe::ui::UIEvent;
const std::string kBaseTitle = "Xenia";
EmulatorWindow::EmulatorWindow(Emulator* emulator,
ui::WindowedAppContext& app_context)
: emulator_(emulator),
app_context_(app_context),
window_listener_(*this),
window_(ui::Window::Create(app_context, kBaseTitle, 1280, 720)),
imgui_drawer_(
std::make_unique<ui::ImGuiDrawer>(window_.get(), kZOrderImGui)),
display_config_game_config_load_callback_(
new DisplayConfigGameConfigLoadCallback(*emulator, *this)) {
base_title_ = kBaseTitle +
#ifdef DEBUG
#if _NO_DEBUG_HEAP == 1
" DEBUG"
#else
" CHECKED"
#endif
#endif
" ("
#ifdef XE_BUILD_IS_PR
"PR#" XE_BUILD_PR_NUMBER " " XE_BUILD_PR_REPO
" " XE_BUILD_PR_BRANCH "@" XE_BUILD_PR_COMMIT_SHORT " against "
#endif
XE_BUILD_BRANCH "@" XE_BUILD_COMMIT_SHORT " on " XE_BUILD_DATE
")";
}
std::unique_ptr<EmulatorWindow> EmulatorWindow::Create(
Emulator* emulator, ui::WindowedAppContext& app_context) {
assert_true(app_context.IsInUIThread());
std::unique_ptr<EmulatorWindow> emulator_window(
new EmulatorWindow(emulator, app_context));
if (!emulator_window->Initialize()) {
return nullptr;
}
return emulator_window;
}
EmulatorWindow::~EmulatorWindow() {
// Notify the ImGui drawer that the immediate drawer is being destroyed.
ShutdownGraphicsSystemPresenterPainting();
}
ui::Presenter* EmulatorWindow::GetGraphicsSystemPresenter() const {
gpu::GraphicsSystem* graphics_system = emulator_->graphics_system();
return graphics_system ? graphics_system->presenter() : nullptr;
}
void EmulatorWindow::SetupGraphicsSystemPresenterPainting() {
ShutdownGraphicsSystemPresenterPainting();
if (!window_) {
return;
}
ui::Presenter* presenter = GetGraphicsSystemPresenter();
if (!presenter) {
return;
}
ApplyDisplayConfigForCvars();
window_->SetPresenter(presenter);
immediate_drawer_ =
emulator_->graphics_system()->provider()->CreateImmediateDrawer();
if (immediate_drawer_) {
immediate_drawer_->SetPresenter(presenter);
imgui_drawer_->SetPresenterAndImmediateDrawer(presenter,
immediate_drawer_.get());
Profiler::SetUserIO(kZOrderProfiler, window_.get(), presenter,
immediate_drawer_.get());
}
}
void EmulatorWindow::ShutdownGraphicsSystemPresenterPainting() {
Profiler::SetUserIO(kZOrderProfiler, window_.get(), nullptr, nullptr);
imgui_drawer_->SetPresenterAndImmediateDrawer(nullptr, nullptr);
immediate_drawer_.reset();
if (window_) {
window_->SetPresenter(nullptr);
}
}
void EmulatorWindow::OnEmulatorInitialized() {
emulator_initialized_ = true;
window_->SetMainMenuEnabled(true);
// When the user can see that the emulator isn't initializing anymore (the
// menu isn't disabled), enter fullscreen if requested.
if (cvars::fullscreen) {
SetFullscreen(true);
}
}
void EmulatorWindow::EmulatorWindowListener::OnClosing(ui::UIEvent& e) {
emulator_window_.app_context_.QuitFromUIThread();
}
void EmulatorWindow::EmulatorWindowListener::OnFileDrop(ui::FileDropEvent& e) {
emulator_window_.FileDrop(e.filename());
}
void EmulatorWindow::EmulatorWindowListener::OnKeyDown(ui::KeyEvent& e) {
emulator_window_.OnKeyDown(e);
}
void EmulatorWindow::DisplayConfigGameConfigLoadCallback::PostGameConfigLoad() {
emulator_window_.ApplyDisplayConfigForCvars();
}
void EmulatorWindow::DisplayConfigDialog::OnDraw(ImGuiIO& io) {
gpu::GraphicsSystem* graphics_system =
emulator_window_.emulator_->graphics_system();
if (!graphics_system) {
return;
}
// In the top-left corner so it's close to the menu bar from where it was
// opened.
// Origin Y coordinate 20 was taken from the Dear ImGui demo.
ImGui::SetNextWindowPos(ImVec2(20, 20), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(20, 20), ImGuiCond_FirstUseEver);
// Alpha from Dear ImGui tooltips (0.35 from the overlay provides too low
// visibility). Translucent so some effect of the changes can still be seen
// through it.
ImGui::SetNextWindowBgAlpha(0.6f);
bool dialog_open = true;
if (!ImGui::Begin("Post-processing", &dialog_open,
ImGuiWindowFlags_NoCollapse |
ImGuiWindowFlags_AlwaysAutoResize |
ImGuiWindowFlags_HorizontalScrollbar)) {
ImGui::End();
return;
}
// Even if the close button has been pressed, still paint everything not to
// have one frame with an empty window.
// Prevent user confusion which has been reported multiple times.
ImGui::TextUnformatted("All effects can be used on GPUs of any brand.");
ImGui::Spacing();
gpu::CommandProcessor* command_processor =
graphics_system->command_processor();
if (command_processor) {
if (ImGui::TreeNodeEx(
"Anti-aliasing",
ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {
gpu::CommandProcessor::SwapPostEffect current_swap_post_effect =
command_processor->GetDesiredSwapPostEffect();
int new_swap_post_effect_index = int(current_swap_post_effect);
ImGui::RadioButton("None", &new_swap_post_effect_index,
int(gpu::CommandProcessor::SwapPostEffect::kNone));
ImGui::RadioButton(
"NVIDIA Fast Approximate Anti-Aliasing 3.11 (FXAA), normal quality",
&new_swap_post_effect_index,
int(gpu::CommandProcessor::SwapPostEffect::kFxaa));
ImGui::RadioButton(
"NVIDIA Fast Approximate Anti-Aliasing 3.11 (FXAA), extreme quality",
&new_swap_post_effect_index,
int(gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme));
gpu::CommandProcessor::SwapPostEffect new_swap_post_effect =
gpu::CommandProcessor::SwapPostEffect(new_swap_post_effect_index);
if (current_swap_post_effect != new_swap_post_effect) {
command_processor->SetDesiredSwapPostEffect(new_swap_post_effect);
}
// Override the values in the cvars to save them to the config at exit if
// the user has set them to anything new.
if (GetSwapPostEffectForCvarValue(cvars::postprocess_antialiasing) !=
new_swap_post_effect) {
OVERRIDE_string(postprocess_antialiasing,
GetCvarValueForSwapPostEffect(new_swap_post_effect));
}
ImGui::TreePop();
}
}
ui::Presenter* presenter = graphics_system->presenter();
if (presenter) {
const ui::Presenter::GuestOutputPaintConfig& current_presenter_config =
presenter->GetGuestOutputPaintConfigFromUIThread();
ui::Presenter::GuestOutputPaintConfig new_presenter_config =
current_presenter_config;
if (ImGui::TreeNodeEx(
"Resampling and sharpening",
ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {
// Filtering effect.
int new_effect_index = int(new_presenter_config.GetEffect());
ImGui::RadioButton(
"None / bilinear", &new_effect_index,
int(ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear));
ImGui::RadioButton(
"AMD FidelityFX Contrast Adaptive Sharpening (CAS)",
&new_effect_index,
int(ui::Presenter::GuestOutputPaintConfig::Effect::kCas));
ImGui::RadioButton(
"AMD FidelityFX Super Resolution 1.0 (FSR)", &new_effect_index,
int(ui::Presenter::GuestOutputPaintConfig::Effect::kFsr));
new_presenter_config.SetEffect(
ui::Presenter::GuestOutputPaintConfig::Effect(new_effect_index));
// effect_description must be one complete, but short enough, sentence per
// line, as TextWrapped doesn't work correctly in auto-resizing windows
// (in the initial frames, the window becomes extremely tall, and widgets
// added after the wrapped text have no effect on the width of the text).
const char* effect_description = nullptr;
switch (new_presenter_config.GetEffect()) {
case ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear:
effect_description =
"Simple bilinear filtering is done if resampling is needed.\n"
"Otherwise, only anti-aliasing is done if enabled, or displaying "
"as is.";
break;
case ui::Presenter::GuestOutputPaintConfig::Effect::kCas:
effect_description =
"Sharpening and resampling to up to 2x2 to improve the fidelity "
"of details.\n"
"For scaling by more than 2x2, bilinear stretching is done "
"afterwards.";
break;
case ui::Presenter::GuestOutputPaintConfig::Effect::kFsr:
effect_description =
"High-quality edge-preserving upscaling to arbitrary target "
"resolutions.\n"
"For scaling by more than 2x2, multiple upsampling passes are "
"done.\n"
"If not upscaling, Contrast Adaptive Sharpening (CAS) is used "
"instead.";
break;
}
if (effect_description) {
ImGui::TextUnformatted(effect_description);
}
if (new_presenter_config.GetEffect() ==
ui::Presenter::GuestOutputPaintConfig::Effect::kCas ||
new_presenter_config.GetEffect() ==
ui::Presenter::GuestOutputPaintConfig::Effect::kFsr) {
if (effect_description) {
ImGui::Spacing();
}
ImGui::TextUnformatted(
"FXAA is highly recommended when using CAS or FSR.");
ImGui::Spacing();
// 2 decimal places is more or less enough precision for the sharpness
// given the minor visual effect of small changes, the width of the
// slider, and readability convenience (2 decimal places is like an
// integer percentage). However, because Dear ImGui parses the string
// representation of the number and snaps the value to it internally,
// 2 decimal places actually offer less precision than the slider itself
// does. This is especially prominent in the low range of the non-linear
// FSR sharpness reduction slider. 3 decimal places are optimal in this
// case.
if (new_presenter_config.GetEffect() ==
ui::Presenter::GuestOutputPaintConfig::Effect::kFsr) {
float fsr_sharpness_reduction =
new_presenter_config.GetFsrSharpnessReduction();
ImGui::TextUnformatted(
"FSR sharpness reduction when upscaling (lower is sharper):");
const auto label =
fmt::format("{:.3f} stops", fsr_sharpness_reduction);
// Power 2.0 scaling as the reduction is in stops, used in exp2.
fsr_sharpness_reduction = sqrt(2.f * fsr_sharpness_reduction);
ImGui::SliderFloat(
"##FSRSharpnessReduction", &fsr_sharpness_reduction,
ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionMin,
ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionMax,
label.c_str(), ImGuiSliderFlags_NoInput);
fsr_sharpness_reduction =
.5f * fsr_sharpness_reduction * fsr_sharpness_reduction;
ImGui::SameLine();
if (ImGui::Button("Reset##ResetFSRSharpnessReduction")) {
fsr_sharpness_reduction = ui::Presenter::GuestOutputPaintConfig ::
kFsrSharpnessReductionDefault;
}
new_presenter_config.SetFsrSharpnessReduction(
fsr_sharpness_reduction);
}
float cas_additional_sharpness =
new_presenter_config.GetCasAdditionalSharpness();
ImGui::TextUnformatted(
new_presenter_config.GetEffect() ==
ui::Presenter::GuestOutputPaintConfig::Effect::kFsr
? "CAS additional sharpness when not upscaling (higher is "
"sharper):"
: "CAS additional sharpness (higher is sharper):");
ImGui::SliderFloat(
"##CASAdditionalSharpness", &cas_additional_sharpness,
ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessMin,
ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessMax,
"%.3f");
ImGui::SameLine();
if (ImGui::Button("Reset##ResetCASAdditionalSharpness")) {
cas_additional_sharpness = ui::Presenter::GuestOutputPaintConfig ::
kCasAdditionalSharpnessDefault;
}
new_presenter_config.SetCasAdditionalSharpness(
cas_additional_sharpness);
// There's no need to expose the setting for the maximum number of FSR
// EASU passes as it's largely meaningless if the user doesn't have a
// very high-resolution monitor compared to the original image size as
// most of the values of the slider will have no effect, and that's just
// very fine-grained performance control for a fixed-overhead pass only
// for huge screen resolutions.
}
ImGui::TreePop();
}
if (ImGui::TreeNodeEx("Dithering", ImGuiTreeNodeFlags_Framed |
ImGuiTreeNodeFlags_DefaultOpen)) {
bool dither = current_presenter_config.GetDither();
ImGui::Checkbox(
"Dither the final output to 8bpc to make gradients smoother",
&dither);
new_presenter_config.SetDither(dither);
ImGui::TreePop();
}
presenter->SetGuestOutputPaintConfigFromUIThread(new_presenter_config);
// Override the values in the cvars to save them to the config at exit if
// the user has set them to anything new.
ui::Presenter::GuestOutputPaintConfig cvars_presenter_config =
GetGuestOutputPaintConfigForCvars();
if (cvars_presenter_config.GetEffect() !=
new_presenter_config.GetEffect()) {
OVERRIDE_string(postprocess_scaling_and_sharpening,
GetCvarValueForGuestOutputPaintEffect(
new_presenter_config.GetEffect()));
}
if (cvars_presenter_config.GetCasAdditionalSharpness() !=
new_presenter_config.GetCasAdditionalSharpness()) {
OVERRIDE_double(postprocess_ffx_cas_additional_sharpness,
new_presenter_config.GetCasAdditionalSharpness());
}
if (cvars_presenter_config.GetFsrSharpnessReduction() !=
new_presenter_config.GetFsrSharpnessReduction()) {
OVERRIDE_double(postprocess_ffx_fsr_sharpness_reduction,
new_presenter_config.GetFsrSharpnessReduction());
}
if (cvars_presenter_config.GetDither() !=
new_presenter_config.GetDither()) {
OVERRIDE_bool(postprocess_dither, new_presenter_config.GetDither());
}
}
ImGui::End();
if (!dialog_open) {
emulator_window_.ToggleDisplayConfigDialog();
// `this` might have been destroyed by ToggleDisplayConfigDialog.
return;
}
}
bool EmulatorWindow::Initialize() {
window_->AddListener(&window_listener_);
window_->AddInputListener(&window_listener_, kZOrderEmulatorWindowInput);
// Main menu.
// FIXME: This code is really messy.
auto main_menu = MenuItem::Create(MenuItem::Type::kNormal);
auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, "&File");
{
file_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "&Open...", "Ctrl+O",
std::bind(&EmulatorWindow::FileOpen, this)));
#ifdef DEBUG
file_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "Close",
std::bind(&EmulatorWindow::FileClose, this)));
#endif // #ifdef DEBUG
file_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
file_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "Show content directory...",
std::bind(&EmulatorWindow::ShowContentDirectory, this)));
file_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
file_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "E&xit", "Alt+F4",
[this]() { window_->RequestClose(); }));
}
main_menu->AddChild(std::move(file_menu));
// CPU menu.
auto cpu_menu = MenuItem::Create(MenuItem::Type::kPopup, "&CPU");
{
cpu_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "&Reset Time Scalar", "Numpad *",
std::bind(&EmulatorWindow::CpuTimeScalarReset, this)));
cpu_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "Time Scalar /= 2", "Numpad -",
std::bind(&EmulatorWindow::CpuTimeScalarSetHalf, this)));
cpu_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "Time Scalar *= 2", "Numpad +",
std::bind(&EmulatorWindow::CpuTimeScalarSetDouble, this)));
}
cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
{
cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,
"Toggle Profiler &Display", "F3",
[]() { Profiler::ToggleDisplay(); }));
cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,
"&Pause/Resume Profiler", "`",
[]() { Profiler::TogglePause(); }));
}
cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
{
cpu_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "&Break and Show Guest Debugger",
"Pause/Break", std::bind(&EmulatorWindow::CpuBreakIntoDebugger, this)));
cpu_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "&Break into Host Debugger",
"Ctrl+Pause/Break",
std::bind(&EmulatorWindow::CpuBreakIntoHostDebugger, this)));
}
main_menu->AddChild(std::move(cpu_menu));
// GPU menu.
auto gpu_menu = MenuItem::Create(MenuItem::Type::kPopup, "&GPU");
{
gpu_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "&Trace Frame", "F4",
std::bind(&EmulatorWindow::GpuTraceFrame, this)));
}
gpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
{
gpu_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "&Clear Runtime Caches", "F5",
std::bind(&EmulatorWindow::GpuClearCaches, this)));
}
main_menu->AddChild(std::move(gpu_menu));
// Display menu.
auto display_menu = MenuItem::Create(MenuItem::Type::kPopup, "&Display");
{
display_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "&Post-processing settings", "F6",
std::bind(&EmulatorWindow::ToggleDisplayConfigDialog, this)));
}
display_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
{
display_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "&Fullscreen", "F11",
std::bind(&EmulatorWindow::ToggleFullscreen, this)));
}
main_menu->AddChild(std::move(display_menu));
// Help menu.
auto help_menu = MenuItem::Create(MenuItem::Type::kPopup, "&Help");
{
help_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "FA&Q...", "F1",
std::bind(&EmulatorWindow::ShowFAQ, this)));
help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
help_menu->AddChild(
MenuItem::Create(MenuItem::Type::kString, "Game &compatibility...",
std::bind(&EmulatorWindow::ShowCompatibility, this)));
help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
help_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "Build commit on GitHub...", "F2",
std::bind(&EmulatorWindow::ShowBuildCommit, this)));
help_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "Recent changes on GitHub...", [this]() {
LaunchWebBrowser(
"https://github.com/xenia-project/xenia/compare/" XE_BUILD_COMMIT
"..." XE_BUILD_BRANCH);
}));
help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));
help_menu->AddChild(MenuItem::Create(
MenuItem::Type::kString, "&About...",
[this]() { LaunchWebBrowser("https://xenia.jp/about/"); }));
}
main_menu->AddChild(std::move(help_menu));
window_->SetMainMenu(std::move(main_menu));
window_->SetMainMenuEnabled(false);
UpdateTitle();
if (!window_->Open()) {
XELOGE("Failed to open the platform window");
return false;
}
Profiler::SetUserIO(kZOrderProfiler, window_.get(), nullptr, nullptr);
return true;
}
const char* EmulatorWindow::GetCvarValueForSwapPostEffect(
gpu::CommandProcessor::SwapPostEffect effect) {
switch (effect) {
case gpu::CommandProcessor::SwapPostEffect::kFxaa:
return "fxaa";
case gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme:
return "fxaa_extreme";
default:
return "";
}
}
gpu::CommandProcessor::SwapPostEffect
EmulatorWindow::GetSwapPostEffectForCvarValue(const std::string& cvar_value) {
if (cvar_value == GetCvarValueForSwapPostEffect(
gpu::CommandProcessor::SwapPostEffect::kFxaa)) {
return gpu::CommandProcessor::SwapPostEffect::kFxaa;
}
if (cvar_value == GetCvarValueForSwapPostEffect(
gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme)) {
return gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme;
}
return gpu::CommandProcessor::SwapPostEffect::kNone;
}
const char* EmulatorWindow::GetCvarValueForGuestOutputPaintEffect(
ui::Presenter::GuestOutputPaintConfig::Effect effect) {
switch (effect) {
case ui::Presenter::GuestOutputPaintConfig::Effect::kCas:
return "cas";
case ui::Presenter::GuestOutputPaintConfig::Effect::kFsr:
return "fsr";
default:
return "";
}
}
ui::Presenter::GuestOutputPaintConfig::Effect
EmulatorWindow::GetGuestOutputPaintEffectForCvarValue(
const std::string& cvar_value) {
if (cvar_value == GetCvarValueForGuestOutputPaintEffect(
ui::Presenter::GuestOutputPaintConfig::Effect::kCas)) {
return ui::Presenter::GuestOutputPaintConfig::Effect::kCas;
}
if (cvar_value == GetCvarValueForGuestOutputPaintEffect(
ui::Presenter::GuestOutputPaintConfig::Effect::kFsr)) {
return ui::Presenter::GuestOutputPaintConfig::Effect::kFsr;
}
return ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear;
}
ui::Presenter::GuestOutputPaintConfig
EmulatorWindow::GetGuestOutputPaintConfigForCvars() {
ui::Presenter::GuestOutputPaintConfig paint_config;
paint_config.SetAllowOverscanCutoff(true);
paint_config.SetEffect(GetGuestOutputPaintEffectForCvarValue(
cvars::postprocess_scaling_and_sharpening));
paint_config.SetCasAdditionalSharpness(
float(cvars::postprocess_ffx_cas_additional_sharpness));
paint_config.SetFsrMaxUpsamplingPasses(
cvars::postprocess_ffx_fsr_max_upsampling_passes);
paint_config.SetFsrSharpnessReduction(
float(cvars::postprocess_ffx_fsr_sharpness_reduction));
paint_config.SetDither(cvars::postprocess_dither);
return paint_config;
}
void EmulatorWindow::ApplyDisplayConfigForCvars() {
gpu::GraphicsSystem* graphics_system = emulator_->graphics_system();
if (!graphics_system) {
return;
}
gpu::CommandProcessor* command_processor =
graphics_system->command_processor();
if (command_processor) {
command_processor->SetDesiredSwapPostEffect(
GetSwapPo
gitextract_uybvm70e/ ├── .appveyor.yml ├── .clang-format ├── .drone.star ├── .gdbinit ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ └── ISSUE_TEMPLATE/ │ ├── bug_report.yaml │ └── config.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── android/ │ └── android_studio_project/ │ ├── .gitignore │ ├── app/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── jp/ │ │ │ └── xenia/ │ │ │ ├── XeniaRuntimeException.java │ │ │ └── emulator/ │ │ │ ├── GpuTraceViewerActivity.java │ │ │ ├── LauncherActivity.java │ │ │ ├── WindowDemoActivity.java │ │ │ ├── WindowSurfaceView.java │ │ │ └── WindowedAppActivity.java │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ ├── activity_gpu_trace_viewer.xml │ │ │ ├── activity_launcher.xml │ │ │ └── activity_window_demo.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ └── strings.xml │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle ├── assets/ │ └── icon/ │ └── LICENSE ├── docs/ │ ├── building.md │ ├── cpu.md │ ├── cpu_todo.md │ ├── gpu.md │ ├── instruction_tracing.md │ ├── kernel.md │ ├── ppc/ │ │ └── vmx128.txt │ └── style_guide.md ├── premake5.lua ├── src/ │ └── xenia/ │ ├── app/ │ │ ├── discord/ │ │ │ ├── discord_presence.cc │ │ │ ├── discord_presence.h │ │ │ └── premake5.lua │ │ ├── emulator_window.cc │ │ ├── emulator_window.h │ │ ├── main_resources.rc │ │ ├── premake5.lua │ │ └── xenia_main.cc │ ├── apu/ │ │ ├── apu_flags.cc │ │ ├── apu_flags.h │ │ ├── audio_driver.cc │ │ ├── audio_driver.h │ │ ├── audio_system.cc │ │ ├── audio_system.h │ │ ├── conversion.h │ │ ├── debug_visualizers.natvis │ │ ├── nop/ │ │ │ ├── nop_apu_flags.cc │ │ │ ├── nop_apu_flags.h │ │ │ ├── nop_audio_system.cc │ │ │ ├── nop_audio_system.h │ │ │ └── premake5.lua │ │ ├── premake5.lua │ │ ├── sdl/ │ │ │ ├── premake5.lua │ │ │ ├── sdl_audio_driver.cc │ │ │ ├── sdl_audio_driver.h │ │ │ ├── sdl_audio_system.cc │ │ │ └── sdl_audio_system.h │ │ ├── xaudio2/ │ │ │ ├── premake5.lua │ │ │ ├── xaudio2_api.h │ │ │ ├── xaudio2_apu_flags.cc │ │ │ ├── xaudio2_apu_flags.h │ │ │ ├── xaudio2_audio_driver.cc │ │ │ ├── xaudio2_audio_driver.h │ │ │ ├── xaudio2_audio_system.cc │ │ │ └── xaudio2_audio_system.h │ │ ├── xma_context.cc │ │ ├── xma_context.h │ │ ├── xma_decoder.cc │ │ ├── xma_decoder.h │ │ ├── xma_helpers.h │ │ ├── xma_register_file.cc │ │ ├── xma_register_file.h │ │ └── xma_register_table.inc │ ├── base/ │ │ ├── README.md │ │ ├── app_win32.manifest │ │ ├── arena.cc │ │ ├── arena.h │ │ ├── assert.h │ │ ├── atomic.h │ │ ├── bit_map.cc │ │ ├── bit_map.h │ │ ├── bit_range.h │ │ ├── bit_stream.cc │ │ ├── bit_stream.h │ │ ├── byte_order.h │ │ ├── byte_stream.cc │ │ ├── byte_stream.h │ │ ├── chrono.h │ │ ├── chrono_steady_cast.h │ │ ├── clock.cc │ │ ├── clock.h │ │ ├── clock_posix.cc │ │ ├── clock_win.cc │ │ ├── clock_x64.cc │ │ ├── console.h │ │ ├── console_app_main.h │ │ ├── console_app_main_android.cc │ │ ├── console_app_main_posix.cc │ │ ├── console_app_main_win.cc │ │ ├── console_posix.cc │ │ ├── console_win.cc │ │ ├── cvar.cc │ │ ├── cvar.h │ │ ├── cvar_android.cc │ │ ├── debug_visualizers.natvis │ │ ├── debugging.h │ │ ├── debugging_mac.cc │ │ ├── debugging_posix.cc │ │ ├── debugging_win.cc │ │ ├── delegate.h │ │ ├── exception_handler.cc │ │ ├── exception_handler.h │ │ ├── exception_handler_posix.cc │ │ ├── exception_handler_win.cc │ │ ├── filesystem.cc │ │ ├── filesystem.h │ │ ├── filesystem_android.cc │ │ ├── filesystem_posix.cc │ │ ├── filesystem_wildcard.cc │ │ ├── filesystem_wildcard.h │ │ ├── filesystem_win.cc │ │ ├── fuzzy.cc │ │ ├── fuzzy.h │ │ ├── hash.h │ │ ├── host_thread_context.cc │ │ ├── host_thread_context.h │ │ ├── literals.h │ │ ├── logging.cc │ │ ├── logging.h │ │ ├── main_android.cc │ │ ├── main_android.h │ │ ├── main_init_android.cc │ │ ├── main_init_posix.cc │ │ ├── main_init_win.cc │ │ ├── main_win.cc │ │ ├── main_win.h │ │ ├── mapped_memory.h │ │ ├── mapped_memory_posix.cc │ │ ├── mapped_memory_win.cc │ │ ├── math.h │ │ ├── memory.cc │ │ ├── memory.h │ │ ├── memory_posix.cc │ │ ├── memory_win.cc │ │ ├── mutex.cc │ │ ├── mutex.h │ │ ├── platform.h │ │ ├── platform_linux.h │ │ ├── platform_win.h │ │ ├── premake5.lua │ │ ├── profiling.cc │ │ ├── profiling.h │ │ ├── reset_scope.h │ │ ├── ring_buffer.cc │ │ ├── ring_buffer.h │ │ ├── socket.h │ │ ├── socket_win.cc │ │ ├── string.cc │ │ ├── string.h │ │ ├── string_buffer.cc │ │ ├── string_buffer.h │ │ ├── string_key.h │ │ ├── string_util.h │ │ ├── system.h │ │ ├── system_android.cc │ │ ├── system_gnulinux.cc │ │ ├── system_win.cc │ │ ├── testing/ │ │ │ ├── chrono_test.cc │ │ │ ├── memory_test.cc │ │ │ ├── premake5.lua │ │ │ ├── threading_test.cc │ │ │ └── utf8_test.cc │ │ ├── threading.cc │ │ ├── threading.h │ │ ├── threading_mac.cc │ │ ├── threading_posix.cc │ │ ├── threading_timer_queue.cc │ │ ├── threading_timer_queue.h │ │ ├── threading_win.cc │ │ ├── type_pool.h │ │ ├── utf8.cc │ │ ├── utf8.h │ │ ├── vec128.cc │ │ ├── vec128.h │ │ └── xxhash.h │ ├── config.cc │ ├── config.h │ ├── cpp.hint │ ├── cpu/ │ │ ├── backend/ │ │ │ ├── assembler.cc │ │ │ ├── assembler.h │ │ │ ├── backend.cc │ │ │ ├── backend.h │ │ │ ├── code_cache.h │ │ │ ├── machine_info.h │ │ │ ├── null_backend.cc │ │ │ ├── null_backend.h │ │ │ └── x64/ │ │ │ ├── premake5.lua │ │ │ ├── x64_assembler.cc │ │ │ ├── x64_assembler.h │ │ │ ├── x64_backend.cc │ │ │ ├── x64_backend.h │ │ │ ├── x64_code_cache.cc │ │ │ ├── x64_code_cache.h │ │ │ ├── x64_code_cache_posix.cc │ │ │ ├── x64_code_cache_win.cc │ │ │ ├── x64_emitter.cc │ │ │ ├── x64_emitter.h │ │ │ ├── x64_function.cc │ │ │ ├── x64_function.h │ │ │ ├── x64_op.h │ │ │ ├── x64_seq_control.cc │ │ │ ├── x64_seq_memory.cc │ │ │ ├── x64_seq_vector.cc │ │ │ ├── x64_sequences.cc │ │ │ ├── x64_sequences.h │ │ │ ├── x64_stack_layout.h │ │ │ ├── x64_tracers.cc │ │ │ ├── x64_tracers.h │ │ │ └── x64_util.h │ │ ├── breakpoint.cc │ │ ├── breakpoint.h │ │ ├── compiler/ │ │ │ ├── compiler.cc │ │ │ ├── compiler.h │ │ │ ├── compiler_pass.cc │ │ │ ├── compiler_pass.h │ │ │ ├── compiler_passes.h │ │ │ └── passes/ │ │ │ ├── conditional_group_pass.cc │ │ │ ├── conditional_group_pass.h │ │ │ ├── conditional_group_subpass.cc │ │ │ ├── conditional_group_subpass.h │ │ │ ├── constant_propagation_pass.cc │ │ │ ├── constant_propagation_pass.h │ │ │ ├── context_promotion_pass.cc │ │ │ ├── context_promotion_pass.h │ │ │ ├── control_flow_analysis_pass.cc │ │ │ ├── control_flow_analysis_pass.h │ │ │ ├── control_flow_simplification_pass.cc │ │ │ ├── control_flow_simplification_pass.h │ │ │ ├── data_flow_analysis_pass.cc │ │ │ ├── data_flow_analysis_pass.h │ │ │ ├── dead_code_elimination_pass.cc │ │ │ ├── dead_code_elimination_pass.h │ │ │ ├── finalization_pass.cc │ │ │ ├── finalization_pass.h │ │ │ ├── memory_sequence_combination_pass.cc │ │ │ ├── memory_sequence_combination_pass.h │ │ │ ├── register_allocation_pass.cc │ │ │ ├── register_allocation_pass.h │ │ │ ├── simplification_pass.cc │ │ │ ├── simplification_pass.h │ │ │ ├── validation_pass.cc │ │ │ ├── validation_pass.h │ │ │ ├── value_reduction_pass.cc │ │ │ └── value_reduction_pass.h │ │ ├── cpu_flags.cc │ │ ├── cpu_flags.h │ │ ├── debug_listener.h │ │ ├── elf_module.cc │ │ ├── elf_module.h │ │ ├── entry_table.cc │ │ ├── entry_table.h │ │ ├── export_resolver.cc │ │ ├── export_resolver.h │ │ ├── function.cc │ │ ├── function.h │ │ ├── function_debug_info.cc │ │ ├── function_debug_info.h │ │ ├── function_trace_data.h │ │ ├── hir/ │ │ │ ├── block.cc │ │ │ ├── block.h │ │ │ ├── hir_builder.cc │ │ │ ├── hir_builder.h │ │ │ ├── instr.cc │ │ │ ├── instr.h │ │ │ ├── label.h │ │ │ ├── opcodes.cc │ │ │ ├── opcodes.h │ │ │ ├── opcodes.inl │ │ │ ├── value.cc │ │ │ └── value.h │ │ ├── lzx.cc │ │ ├── lzx.h │ │ ├── mmio_handler.cc │ │ ├── mmio_handler.h │ │ ├── module.cc │ │ ├── module.h │ │ ├── ppc/ │ │ │ ├── ppc_context.cc │ │ │ ├── ppc_context.h │ │ │ ├── ppc_decode_data.h │ │ │ ├── ppc_emit-private.h │ │ │ ├── ppc_emit.h │ │ │ ├── ppc_emit_altivec.cc │ │ │ ├── ppc_emit_alu.cc │ │ │ ├── ppc_emit_control.cc │ │ │ ├── ppc_emit_fpu.cc │ │ │ ├── ppc_emit_memory.cc │ │ │ ├── ppc_frontend.cc │ │ │ ├── ppc_frontend.h │ │ │ ├── ppc_hir_builder.cc │ │ │ ├── ppc_hir_builder.h │ │ │ ├── ppc_instr.h │ │ │ ├── ppc_opcode.h │ │ │ ├── ppc_opcode_disasm.cc │ │ │ ├── ppc_opcode_disasm.h │ │ │ ├── ppc_opcode_disasm_gen.cc │ │ │ ├── ppc_opcode_info.cc │ │ │ ├── ppc_opcode_info.h │ │ │ ├── ppc_opcode_lookup_gen.cc │ │ │ ├── ppc_opcode_table_gen.cc │ │ │ ├── ppc_scanner.cc │ │ │ ├── ppc_scanner.h │ │ │ ├── ppc_translator.cc │ │ │ ├── ppc_translator.h │ │ │ └── testing/ │ │ │ ├── README.md │ │ │ ├── instr_add.s │ │ │ ├── instr_addc.s │ │ │ ├── instr_adde.s │ │ │ ├── instr_addic.s │ │ │ ├── instr_addis.s │ │ │ ├── instr_addme.s │ │ │ ├── instr_addze.s │ │ │ ├── instr_and.s │ │ │ ├── instr_andc.s │ │ │ ├── instr_andi.s │ │ │ ├── instr_andis.s │ │ │ ├── instr_cmp.s │ │ │ ├── instr_cmpi.s │ │ │ ├── instr_cmpl.s │ │ │ ├── instr_cmpli.s │ │ │ ├── instr_cntlzd.s │ │ │ ├── instr_cntlzw.s │ │ │ ├── instr_divd.s │ │ │ ├── instr_divdu.s │ │ │ ├── instr_divw.s │ │ │ ├── instr_divwu.s │ │ │ ├── instr_eqv.s │ │ │ ├── instr_extsb.s │ │ │ ├── instr_extsh.s │ │ │ ├── instr_extsw.s │ │ │ ├── instr_fabs.s │ │ │ ├── instr_fadd.s │ │ │ ├── instr_fctixz.s │ │ │ ├── instr_fmadd.s │ │ │ ├── instr_fmadds.s │ │ │ ├── instr_fmul.s │ │ │ ├── instr_fnabs.s │ │ │ ├── instr_frsqrte.s │ │ │ ├── instr_fsel.s │ │ │ ├── instr_fsqrt.s │ │ │ ├── instr_lvexx.s │ │ │ ├── instr_lvl.s │ │ │ ├── instr_lvr.s │ │ │ ├── instr_lvsl.s │ │ │ ├── instr_lvsr.s │ │ │ ├── instr_mulhd.s │ │ │ ├── instr_mulhdu.s │ │ │ ├── instr_mulhw.s │ │ │ ├── instr_mulhwu.s │ │ │ ├── instr_mulld.s │ │ │ ├── instr_mulli.s │ │ │ ├── instr_mullw.s │ │ │ ├── instr_neg.s │ │ │ ├── instr_nor.s │ │ │ ├── instr_ori.s │ │ │ ├── instr_rldicl.s │ │ │ ├── instr_rldicr.s │ │ │ ├── instr_rlwimi.s │ │ │ ├── instr_rlwinm.s │ │ │ ├── instr_rlwnm.s │ │ │ ├── instr_sld.s │ │ │ ├── instr_slw.s │ │ │ ├── instr_srad.s │ │ │ ├── instr_sradi.s │ │ │ ├── instr_sraw.s │ │ │ ├── instr_srawi.s │ │ │ ├── instr_srd.s │ │ │ ├── instr_srw.s │ │ │ ├── instr_stvew.s │ │ │ ├── instr_stvl.s │ │ │ ├── instr_stvr.s │ │ │ ├── instr_subf.s │ │ │ ├── instr_subfc.s │ │ │ ├── instr_subfe.s │ │ │ ├── instr_subfic.s │ │ │ ├── instr_subfme.s │ │ │ ├── instr_subfze.s │ │ │ ├── instr_td.s │ │ │ ├── instr_tdi.s │ │ │ ├── instr_tw.s │ │ │ ├── instr_twi.s │ │ │ ├── instr_vaddfp.s │ │ │ ├── instr_vaddfp128.s │ │ │ ├── instr_vaddshs.s │ │ │ ├── instr_vadduhm.s │ │ │ ├── instr_vand.s │ │ │ ├── instr_vand128.s │ │ │ ├── instr_vandc.s │ │ │ ├── instr_vandc128.s │ │ │ ├── instr_vavgsh.s │ │ │ ├── instr_vavguh.s │ │ │ ├── instr_vcfsx.s │ │ │ ├── instr_vcmpxxfp.s │ │ │ ├── instr_vcmpxxfp128.s │ │ │ ├── instr_vctsxs.s │ │ │ ├── instr_vctuxs.s │ │ │ ├── instr_vexptefp.s │ │ │ ├── instr_vmaddfp.s │ │ │ ├── instr_vmaxfp.s │ │ │ ├── instr_vmaxfp128.s │ │ │ ├── instr_vmaxsh.s │ │ │ ├── instr_vmaxuh.s │ │ │ ├── instr_vminfp.s │ │ │ ├── instr_vminfp128.s │ │ │ ├── instr_vminsh.s │ │ │ ├── instr_vminuh.s │ │ │ ├── instr_vmrghb.s │ │ │ ├── instr_vmrghh.s │ │ │ ├── instr_vmrghw.s │ │ │ ├── instr_vmrglb.s │ │ │ ├── instr_vmrglh.s │ │ │ ├── instr_vmrglw.s │ │ │ ├── instr_vmsum3fp128.s │ │ │ ├── instr_vmsum4fp128.s │ │ │ ├── instr_vor.s │ │ │ ├── instr_vor128.s │ │ │ ├── instr_vperm.s │ │ │ ├── instr_vpermwi128.s │ │ │ ├── instr_vpkd3d128.s │ │ │ ├── instr_vpkpx.s │ │ │ ├── instr_vpkshss.s │ │ │ ├── instr_vpkshss128.s │ │ │ ├── instr_vpkshus.s │ │ │ ├── instr_vpkshus128.s │ │ │ ├── instr_vpkswss.s │ │ │ ├── instr_vpkswss128.s │ │ │ ├── instr_vpkswus.s │ │ │ ├── instr_vpkswus128.s │ │ │ ├── instr_vpkuhum.s │ │ │ ├── instr_vpkuhum128.s │ │ │ ├── instr_vpkuhus.s │ │ │ ├── instr_vpkuhus128.s │ │ │ ├── instr_vpkuwum.s │ │ │ ├── instr_vpkuwum128.s │ │ │ ├── instr_vpkuwus.s │ │ │ ├── instr_vpkuwus128.s │ │ │ ├── instr_vrfin.s │ │ │ ├── instr_vrlh.s │ │ │ ├── instr_vrlimi128.s │ │ │ ├── instr_vsel.s │ │ │ ├── instr_vsl.s │ │ │ ├── instr_vslb.s │ │ │ ├── instr_vsldoi.s │ │ │ ├── instr_vslh.s │ │ │ ├── instr_vslo.s │ │ │ ├── instr_vslw.s │ │ │ ├── instr_vspltb.s │ │ │ ├── instr_vsplth.s │ │ │ ├── instr_vspltisb.s │ │ │ ├── instr_vspltish.s │ │ │ ├── instr_vspltisw.s │ │ │ ├── instr_vspltw.s │ │ │ ├── instr_vsr.s │ │ │ ├── instr_vsrah.s │ │ │ ├── instr_vsrh.s │ │ │ ├── instr_vsro.s │ │ │ ├── instr_vsubfp.s │ │ │ ├── instr_vsubfp128.s │ │ │ ├── instr_vsubshs.s │ │ │ ├── instr_vsubuhm.s │ │ │ ├── instr_vupkd3d128.s │ │ │ ├── instr_vupkhsb.s │ │ │ ├── instr_vupkhsb128.s │ │ │ ├── instr_vupkhsh.s │ │ │ ├── instr_vupklsb.s │ │ │ ├── instr_vupklsb128.s │ │ │ ├── instr_vupklsh.s │ │ │ ├── instr_vxor.s │ │ │ ├── instr_vxor128.s │ │ │ ├── ppc_testing_main.cc │ │ │ ├── ppc_testing_native_main.cc │ │ │ ├── ppc_testing_native_thunks.s │ │ │ ├── premake5.lua │ │ │ ├── seq_branch_carry.s │ │ │ └── seq_jumptable_constants.s │ │ ├── premake5.lua │ │ ├── processor.cc │ │ ├── processor.h │ │ ├── raw_module.cc │ │ ├── raw_module.h │ │ ├── stack_walker.h │ │ ├── stack_walker_posix.cc │ │ ├── stack_walker_win.cc │ │ ├── symbol.h │ │ ├── test_module.cc │ │ ├── test_module.h │ │ ├── testing/ │ │ │ ├── add_test.cc │ │ │ ├── byte_swap_test.cc │ │ │ ├── extract_test.cc │ │ │ ├── insert_test.cc │ │ │ ├── load_vector_shl_shr_test.cc │ │ │ ├── pack_test.cc │ │ │ ├── permute_test.cc │ │ │ ├── premake5.lua │ │ │ ├── sandbox_main.cc │ │ │ ├── sha_test.cc │ │ │ ├── shl_test.cc │ │ │ ├── shr_test.cc │ │ │ ├── swizzle_test.cc │ │ │ ├── unpack_test.cc │ │ │ ├── util.h │ │ │ ├── vector_add_test.cc │ │ │ ├── vector_max_test.cc │ │ │ ├── vector_min_test.cc │ │ │ ├── vector_rotate_left_test.cc │ │ │ ├── vector_sha_test.cc │ │ │ ├── vector_shl_test.cc │ │ │ └── vector_shr_test.cc │ │ ├── thread.cc │ │ ├── thread.h │ │ ├── thread_debug_info.h │ │ ├── thread_state.cc │ │ ├── thread_state.h │ │ ├── xex_module.cc │ │ └── xex_module.h │ ├── debug/ │ │ └── ui/ │ │ ├── debug_window.cc │ │ ├── debug_window.h │ │ └── premake5.lua │ ├── emulator.cc │ ├── emulator.h │ ├── gpu/ │ │ ├── command_processor.cc │ │ ├── command_processor.h │ │ ├── d3d12/ │ │ │ ├── d3d12_command_processor.cc │ │ │ ├── d3d12_command_processor.h │ │ │ ├── d3d12_graphics_system.cc │ │ │ ├── d3d12_graphics_system.h │ │ │ ├── d3d12_primitive_processor.cc │ │ │ ├── d3d12_primitive_processor.h │ │ │ ├── d3d12_render_target_cache.cc │ │ │ ├── d3d12_render_target_cache.h │ │ │ ├── d3d12_shader.cc │ │ │ ├── d3d12_shader.h │ │ │ ├── d3d12_shared_memory.cc │ │ │ ├── d3d12_shared_memory.h │ │ │ ├── d3d12_texture_cache.cc │ │ │ ├── d3d12_texture_cache.h │ │ │ ├── d3d12_trace_dump_main.cc │ │ │ ├── d3d12_trace_viewer_main.cc │ │ │ ├── deferred_command_list.cc │ │ │ ├── deferred_command_list.h │ │ │ ├── pipeline_cache.cc │ │ │ ├── pipeline_cache.h │ │ │ └── premake5.lua │ │ ├── draw_extent_estimator.cc │ │ ├── draw_extent_estimator.h │ │ ├── draw_util.cc │ │ ├── draw_util.h │ │ ├── dxbc.h │ │ ├── dxbc_shader.cc │ │ ├── dxbc_shader.h │ │ ├── dxbc_shader_translator.cc │ │ ├── dxbc_shader_translator.h │ │ ├── dxbc_shader_translator_alu.cc │ │ ├── dxbc_shader_translator_fetch.cc │ │ ├── dxbc_shader_translator_memexport.cc │ │ ├── dxbc_shader_translator_om.cc │ │ ├── gpu_flags.cc │ │ ├── gpu_flags.h │ │ ├── graphics_system.cc │ │ ├── graphics_system.h │ │ ├── null/ │ │ │ ├── null_command_processor.cc │ │ │ ├── null_command_processor.h │ │ │ ├── null_graphics_system.cc │ │ │ ├── null_graphics_system.h │ │ │ └── premake5.lua │ │ ├── packet_disassembler.cc │ │ ├── packet_disassembler.h │ │ ├── premake5.lua │ │ ├── primitive_processor.cc │ │ ├── primitive_processor.h │ │ ├── register_file.cc │ │ ├── register_file.h │ │ ├── register_table.inc │ │ ├── registers.cc │ │ ├── registers.h │ │ ├── render_target_cache.cc │ │ ├── render_target_cache.h │ │ ├── sampler_info.cc │ │ ├── sampler_info.h │ │ ├── shader.cc │ │ ├── shader.h │ │ ├── shader_compiler_main.cc │ │ ├── shader_interpreter.cc │ │ ├── shader_interpreter.h │ │ ├── shader_translator.cc │ │ ├── shader_translator.h │ │ ├── shader_translator_disasm.cc │ │ ├── shaders/ │ │ │ ├── adaptive_quad.hs.hlsl │ │ │ ├── adaptive_triangle.hs.hlsl │ │ │ ├── apply_gamma_pwl.cs.xesl │ │ │ ├── apply_gamma_pwl.ps.xesl │ │ │ ├── apply_gamma_pwl.xesli │ │ │ ├── apply_gamma_pwl_fxaa_luma.cs.xesl │ │ │ ├── apply_gamma_pwl_fxaa_luma.ps.xesl │ │ │ ├── apply_gamma_table.cs.xesl │ │ │ ├── apply_gamma_table.ps.xesl │ │ │ ├── apply_gamma_table.xesli │ │ │ ├── apply_gamma_table_fxaa_luma.cs.xesl │ │ │ ├── apply_gamma_table_fxaa_luma.ps.xesl │ │ │ ├── bytecode/ │ │ │ │ ├── .clang-format │ │ │ │ ├── d3d12_5_1/ │ │ │ │ │ ├── adaptive_quad_hs.h │ │ │ │ │ ├── adaptive_triangle_hs.h │ │ │ │ │ ├── apply_gamma_pwl_cs.h │ │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_cs.h │ │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_ps.h │ │ │ │ │ ├── apply_gamma_pwl_ps.h │ │ │ │ │ ├── apply_gamma_table_cs.h │ │ │ │ │ ├── apply_gamma_table_fxaa_luma_cs.h │ │ │ │ │ ├── apply_gamma_table_fxaa_luma_ps.h │ │ │ │ │ ├── apply_gamma_table_ps.h │ │ │ │ │ ├── clear_uint2_ps.h │ │ │ │ │ ├── continuous_quad_1cp_hs.h │ │ │ │ │ ├── continuous_quad_4cp_hs.h │ │ │ │ │ ├── continuous_triangle_1cp_hs.h │ │ │ │ │ ├── continuous_triangle_3cp_hs.h │ │ │ │ │ ├── discrete_quad_1cp_hs.h │ │ │ │ │ ├── discrete_quad_4cp_hs.h │ │ │ │ │ ├── discrete_triangle_1cp_hs.h │ │ │ │ │ ├── discrete_triangle_3cp_hs.h │ │ │ │ │ ├── float24_round_ps.h │ │ │ │ │ ├── float24_truncate_ps.h │ │ │ │ │ ├── fullscreen_cw_vs.h │ │ │ │ │ ├── fxaa_cs.h │ │ │ │ │ ├── fxaa_extreme_cs.h │ │ │ │ │ ├── host_depth_store_1xmsaa_cs.h │ │ │ │ │ ├── host_depth_store_2xmsaa_cs.h │ │ │ │ │ ├── host_depth_store_4xmsaa_cs.h │ │ │ │ │ ├── passthrough_position_xy_vs.h │ │ │ │ │ ├── resolve_clear_32bpp_cs.h │ │ │ │ │ ├── resolve_clear_32bpp_scaled_cs.h │ │ │ │ │ ├── resolve_clear_64bpp_cs.h │ │ │ │ │ ├── resolve_clear_64bpp_scaled_cs.h │ │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_cs.h │ │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled_cs.h │ │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_cs.h │ │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled_cs.h │ │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_cs.h │ │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled_cs.h │ │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_cs.h │ │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled_cs.h │ │ │ │ │ ├── resolve_full_128bpp_cs.h │ │ │ │ │ ├── resolve_full_128bpp_scaled_cs.h │ │ │ │ │ ├── resolve_full_16bpp_cs.h │ │ │ │ │ ├── resolve_full_16bpp_scaled_cs.h │ │ │ │ │ ├── resolve_full_32bpp_cs.h │ │ │ │ │ ├── resolve_full_32bpp_scaled_cs.h │ │ │ │ │ ├── resolve_full_64bpp_cs.h │ │ │ │ │ ├── resolve_full_64bpp_scaled_cs.h │ │ │ │ │ ├── resolve_full_8bpp_cs.h │ │ │ │ │ ├── resolve_full_8bpp_scaled_cs.h │ │ │ │ │ ├── tessellation_adaptive_vs.h │ │ │ │ │ ├── tessellation_indexed_vs.h │ │ │ │ │ ├── texture_load_128bpb_cs.h │ │ │ │ │ ├── texture_load_128bpb_scaled_cs.h │ │ │ │ │ ├── texture_load_16bpb_cs.h │ │ │ │ │ ├── texture_load_16bpb_scaled_cs.h │ │ │ │ │ ├── texture_load_32bpb_cs.h │ │ │ │ │ ├── texture_load_32bpb_scaled_cs.h │ │ │ │ │ ├── texture_load_64bpb_cs.h │ │ │ │ │ ├── texture_load_64bpb_scaled_cs.h │ │ │ │ │ ├── texture_load_8bpb_cs.h │ │ │ │ │ ├── texture_load_8bpb_scaled_cs.h │ │ │ │ │ ├── texture_load_bgrg8_rgb8_cs.h │ │ │ │ │ ├── texture_load_bgrg8_rgbg8_cs.h │ │ │ │ │ ├── texture_load_ctx1_cs.h │ │ │ │ │ ├── texture_load_depth_float_cs.h │ │ │ │ │ ├── texture_load_depth_float_scaled_cs.h │ │ │ │ │ ├── texture_load_depth_unorm_cs.h │ │ │ │ │ ├── texture_load_depth_unorm_scaled_cs.h │ │ │ │ │ ├── texture_load_dxn_rg8_cs.h │ │ │ │ │ ├── texture_load_dxt1_rgba8_cs.h │ │ │ │ │ ├── texture_load_dxt3_rgba8_cs.h │ │ │ │ │ ├── texture_load_dxt3a_cs.h │ │ │ │ │ ├── texture_load_dxt3aas1111_argb4_cs.h │ │ │ │ │ ├── texture_load_dxt3aas1111_bgra4_cs.h │ │ │ │ │ ├── texture_load_dxt5_rgba8_cs.h │ │ │ │ │ ├── texture_load_dxt5a_r8_cs.h │ │ │ │ │ ├── texture_load_gbgr8_grgb8_cs.h │ │ │ │ │ ├── texture_load_gbgr8_rgb8_cs.h │ │ │ │ │ ├── texture_load_r10g11b11_rgba16_cs.h │ │ │ │ │ ├── texture_load_r10g11b11_rgba16_scaled_cs.h │ │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_cs.h │ │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled_cs.h │ │ │ │ │ ├── texture_load_r11g11b10_rgba16_cs.h │ │ │ │ │ ├── texture_load_r11g11b10_rgba16_scaled_cs.h │ │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_cs.h │ │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled_cs.h │ │ │ │ │ ├── texture_load_r16_snorm_float_cs.h │ │ │ │ │ ├── texture_load_r16_snorm_float_scaled_cs.h │ │ │ │ │ ├── texture_load_r16_unorm_float_cs.h │ │ │ │ │ ├── texture_load_r16_unorm_float_scaled_cs.h │ │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_cs.h │ │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h │ │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_cs.h │ │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h │ │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_cs.h │ │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h │ │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h │ │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h │ │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_cs.h │ │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled_cs.h │ │ │ │ │ ├── texture_load_rg16_snorm_float_cs.h │ │ │ │ │ ├── texture_load_rg16_snorm_float_scaled_cs.h │ │ │ │ │ ├── texture_load_rg16_unorm_float_cs.h │ │ │ │ │ ├── texture_load_rg16_unorm_float_scaled_cs.h │ │ │ │ │ ├── texture_load_rgba16_snorm_float_cs.h │ │ │ │ │ ├── texture_load_rgba16_snorm_float_scaled_cs.h │ │ │ │ │ ├── texture_load_rgba16_unorm_float_cs.h │ │ │ │ │ └── texture_load_rgba16_unorm_float_scaled_cs.h │ │ │ │ └── vulkan_spirv/ │ │ │ │ ├── apply_gamma_pwl_cs.h │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_cs.h │ │ │ │ ├── apply_gamma_pwl_fxaa_luma_ps.h │ │ │ │ ├── apply_gamma_pwl_ps.h │ │ │ │ ├── apply_gamma_table_cs.h │ │ │ │ ├── apply_gamma_table_fxaa_luma_cs.h │ │ │ │ ├── apply_gamma_table_fxaa_luma_ps.h │ │ │ │ ├── apply_gamma_table_ps.h │ │ │ │ ├── fullscreen_cw_vs.h │ │ │ │ ├── host_depth_store_1xmsaa_cs.h │ │ │ │ ├── host_depth_store_2xmsaa_cs.h │ │ │ │ ├── host_depth_store_4xmsaa_cs.h │ │ │ │ ├── passthrough_position_xy_vs.h │ │ │ │ ├── resolve_clear_32bpp_cs.h │ │ │ │ ├── resolve_clear_32bpp_scaled_cs.h │ │ │ │ ├── resolve_clear_64bpp_cs.h │ │ │ │ ├── resolve_clear_64bpp_scaled_cs.h │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_cs.h │ │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled_cs.h │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_cs.h │ │ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled_cs.h │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_cs.h │ │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled_cs.h │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_cs.h │ │ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled_cs.h │ │ │ │ ├── resolve_full_128bpp_cs.h │ │ │ │ ├── resolve_full_128bpp_scaled_cs.h │ │ │ │ ├── resolve_full_16bpp_cs.h │ │ │ │ ├── resolve_full_16bpp_scaled_cs.h │ │ │ │ ├── resolve_full_32bpp_cs.h │ │ │ │ ├── resolve_full_32bpp_scaled_cs.h │ │ │ │ ├── resolve_full_64bpp_cs.h │ │ │ │ ├── resolve_full_64bpp_scaled_cs.h │ │ │ │ ├── resolve_full_8bpp_cs.h │ │ │ │ ├── resolve_full_8bpp_scaled_cs.h │ │ │ │ ├── texture_load_128bpb_cs.h │ │ │ │ ├── texture_load_128bpb_scaled_cs.h │ │ │ │ ├── texture_load_16bpb_cs.h │ │ │ │ ├── texture_load_16bpb_scaled_cs.h │ │ │ │ ├── texture_load_32bpb_cs.h │ │ │ │ ├── texture_load_32bpb_scaled_cs.h │ │ │ │ ├── texture_load_64bpb_cs.h │ │ │ │ ├── texture_load_64bpb_scaled_cs.h │ │ │ │ ├── texture_load_8bpb_cs.h │ │ │ │ ├── texture_load_8bpb_scaled_cs.h │ │ │ │ ├── texture_load_bgrg8_rgb8_cs.h │ │ │ │ ├── texture_load_bgrg8_rgbg8_cs.h │ │ │ │ ├── texture_load_ctx1_cs.h │ │ │ │ ├── texture_load_depth_float_cs.h │ │ │ │ ├── texture_load_depth_float_scaled_cs.h │ │ │ │ ├── texture_load_depth_unorm_cs.h │ │ │ │ ├── texture_load_depth_unorm_scaled_cs.h │ │ │ │ ├── texture_load_dxn_rg8_cs.h │ │ │ │ ├── texture_load_dxt1_rgba8_cs.h │ │ │ │ ├── texture_load_dxt3_rgba8_cs.h │ │ │ │ ├── texture_load_dxt3a_cs.h │ │ │ │ ├── texture_load_dxt3aas1111_argb4_cs.h │ │ │ │ ├── texture_load_dxt3aas1111_bgra4_cs.h │ │ │ │ ├── texture_load_dxt5_rgba8_cs.h │ │ │ │ ├── texture_load_dxt5a_r8_cs.h │ │ │ │ ├── texture_load_gbgr8_grgb8_cs.h │ │ │ │ ├── texture_load_gbgr8_rgb8_cs.h │ │ │ │ ├── texture_load_r10g11b11_rgba16_cs.h │ │ │ │ ├── texture_load_r10g11b11_rgba16_scaled_cs.h │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_cs.h │ │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled_cs.h │ │ │ │ ├── texture_load_r11g11b10_rgba16_cs.h │ │ │ │ ├── texture_load_r11g11b10_rgba16_scaled_cs.h │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_cs.h │ │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled_cs.h │ │ │ │ ├── texture_load_r16_snorm_float_cs.h │ │ │ │ ├── texture_load_r16_snorm_float_scaled_cs.h │ │ │ │ ├── texture_load_r16_unorm_float_cs.h │ │ │ │ ├── texture_load_r16_unorm_float_scaled_cs.h │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_cs.h │ │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_cs.h │ │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_cs.h │ │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h │ │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_cs.h │ │ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled_cs.h │ │ │ │ ├── texture_load_rg16_snorm_float_cs.h │ │ │ │ ├── texture_load_rg16_snorm_float_scaled_cs.h │ │ │ │ ├── texture_load_rg16_unorm_float_cs.h │ │ │ │ ├── texture_load_rg16_unorm_float_scaled_cs.h │ │ │ │ ├── texture_load_rgba16_snorm_float_cs.h │ │ │ │ ├── texture_load_rgba16_snorm_float_scaled_cs.h │ │ │ │ ├── texture_load_rgba16_unorm_float_cs.h │ │ │ │ └── texture_load_rgba16_unorm_float_scaled_cs.h │ │ │ ├── clear_uint2.ps.hlsl │ │ │ ├── continuous_quad.hlsli │ │ │ ├── continuous_quad_1cp.hs.hlsl │ │ │ ├── continuous_quad_4cp.hs.hlsl │ │ │ ├── continuous_triangle.hlsli │ │ │ ├── continuous_triangle_1cp.hs.hlsl │ │ │ ├── continuous_triangle_3cp.hs.hlsl │ │ │ ├── discrete_quad.hlsli │ │ │ ├── discrete_quad_1cp.hs.hlsl │ │ │ ├── discrete_quad_4cp.hs.hlsl │ │ │ ├── discrete_triangle.hlsli │ │ │ ├── discrete_triangle_1cp.hs.hlsl │ │ │ ├── discrete_triangle_3cp.hs.hlsl │ │ │ ├── edram.xesli │ │ │ ├── endian.xesli │ │ │ ├── float24_round.ps.hlsl │ │ │ ├── float24_truncate.ps.hlsl │ │ │ ├── fullscreen_cw.vs.xesl │ │ │ ├── fxaa.cs.hlsl │ │ │ ├── fxaa.hlsli │ │ │ ├── fxaa_extreme.cs.hlsl │ │ │ ├── host_depth_store.xesli │ │ │ ├── host_depth_store_1xmsaa.cs.xesl │ │ │ ├── host_depth_store_2xmsaa.cs.xesl │ │ │ ├── host_depth_store_4xmsaa.cs.xesl │ │ │ ├── passthrough_position_xy.vs.xesl │ │ │ ├── pixel_formats.xesli │ │ │ ├── resolve.xesli │ │ │ ├── resolve_clear_32bpp.cs.xesl │ │ │ ├── resolve_clear_32bpp.xesli │ │ │ ├── resolve_clear_32bpp_scaled.cs.xesl │ │ │ ├── resolve_clear_64bpp.cs.xesl │ │ │ ├── resolve_clear_64bpp.xesli │ │ │ ├── resolve_clear_64bpp_scaled.cs.xesl │ │ │ ├── resolve_fast_32bpp_1x2xmsaa.cs.xesl │ │ │ ├── resolve_fast_32bpp_1x2xmsaa.xesli │ │ │ ├── resolve_fast_32bpp_1x2xmsaa_scaled.cs.xesl │ │ │ ├── resolve_fast_32bpp_4xmsaa.cs.xesl │ │ │ ├── resolve_fast_32bpp_4xmsaa.xesli │ │ │ ├── resolve_fast_32bpp_4xmsaa_scaled.cs.xesl │ │ │ ├── resolve_fast_64bpp_1x2xmsaa.cs.xesl │ │ │ ├── resolve_fast_64bpp_1x2xmsaa.xesli │ │ │ ├── resolve_fast_64bpp_1x2xmsaa_scaled.cs.xesl │ │ │ ├── resolve_fast_64bpp_4xmsaa.cs.xesl │ │ │ ├── resolve_fast_64bpp_4xmsaa.xesli │ │ │ ├── resolve_fast_64bpp_4xmsaa_scaled.cs.xesl │ │ │ ├── resolve_full_128bpp.cs.xesl │ │ │ ├── resolve_full_128bpp.xesli │ │ │ ├── resolve_full_128bpp_scaled.cs.xesl │ │ │ ├── resolve_full_16bpp.cs.xesl │ │ │ ├── resolve_full_16bpp.xesli │ │ │ ├── resolve_full_16bpp_scaled.cs.xesl │ │ │ ├── resolve_full_32bpp.cs.xesl │ │ │ ├── resolve_full_32bpp.xesli │ │ │ ├── resolve_full_32bpp_scaled.cs.xesl │ │ │ ├── resolve_full_64bpp.cs.xesl │ │ │ ├── resolve_full_64bpp.xesli │ │ │ ├── resolve_full_64bpp_scaled.cs.xesl │ │ │ ├── resolve_full_8bpp.cs.xesl │ │ │ ├── resolve_full_8bpp.xesli │ │ │ ├── resolve_full_8bpp_scaled.cs.xesl │ │ │ ├── tessellation_adaptive.vs.hlsl │ │ │ ├── tessellation_indexed.vs.hlsl │ │ │ ├── texture_address.xesli │ │ │ ├── texture_load.xesli │ │ │ ├── texture_load_128bpb.cs.xesl │ │ │ ├── texture_load_128bpb.xesli │ │ │ ├── texture_load_128bpb_scaled.cs.xesl │ │ │ ├── texture_load_16bpb.cs.xesl │ │ │ ├── texture_load_16bpb.xesli │ │ │ ├── texture_load_16bpb_scaled.cs.xesl │ │ │ ├── texture_load_32bpb.cs.xesl │ │ │ ├── texture_load_32bpb.xesli │ │ │ ├── texture_load_32bpb_64bpb.xesli │ │ │ ├── texture_load_32bpb_scaled.cs.xesl │ │ │ ├── texture_load_64bpb.cs.xesl │ │ │ ├── texture_load_64bpb.xesli │ │ │ ├── texture_load_64bpb_scaled.cs.xesl │ │ │ ├── texture_load_8bpb.cs.xesl │ │ │ ├── texture_load_8bpb.xesli │ │ │ ├── texture_load_8bpb_scaled.cs.xesl │ │ │ ├── texture_load_bgrg8_rgb8.cs.xesl │ │ │ ├── texture_load_bgrg8_rgbg8.cs.xesl │ │ │ ├── texture_load_ctx1.cs.xesl │ │ │ ├── texture_load_depth_float.cs.xesl │ │ │ ├── texture_load_depth_float_scaled.cs.xesl │ │ │ ├── texture_load_depth_unorm.cs.xesl │ │ │ ├── texture_load_depth_unorm_scaled.cs.xesl │ │ │ ├── texture_load_dxn_rg8.cs.xesl │ │ │ ├── texture_load_dxt1_rgba8.cs.xesl │ │ │ ├── texture_load_dxt3_rgba8.cs.xesl │ │ │ ├── texture_load_dxt3a.cs.xesl │ │ │ ├── texture_load_dxt3aas1111.xesli │ │ │ ├── texture_load_dxt3aas1111_argb4.cs.xesl │ │ │ ├── texture_load_dxt3aas1111_bgra4.cs.xesl │ │ │ ├── texture_load_dxt5_rgba8.cs.xesl │ │ │ ├── texture_load_dxt5a_r8.cs.xesl │ │ │ ├── texture_load_gbgr8_grgb8.cs.xesl │ │ │ ├── texture_load_gbgr8_rgb8.cs.xesl │ │ │ ├── texture_load_r10g11b11_rgba16.cs.xesl │ │ │ ├── texture_load_r10g11b11_rgba16_scaled.cs.xesl │ │ │ ├── texture_load_r10g11b11_rgba16_snorm.cs.xesl │ │ │ ├── texture_load_r10g11b11_rgba16_snorm_scaled.cs.xesl │ │ │ ├── texture_load_r11g11b10_rgba16.cs.xesl │ │ │ ├── texture_load_r11g11b10_rgba16_scaled.cs.xesl │ │ │ ├── texture_load_r11g11b10_rgba16_snorm.cs.xesl │ │ │ ├── texture_load_r11g11b10_rgba16_snorm_scaled.cs.xesl │ │ │ ├── texture_load_r16_snorm_float.cs.xesl │ │ │ ├── texture_load_r16_snorm_float_scaled.cs.xesl │ │ │ ├── texture_load_r16_unorm_float.cs.xesl │ │ │ ├── texture_load_r16_unorm_float_scaled.cs.xesl │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4.cs.xesl │ │ │ ├── texture_load_r4g4b4a4_a4r4g4b4_scaled.cs.xesl │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4.cs.xesl │ │ │ ├── texture_load_r4g4b4a4_b4g4r4a4_scaled.cs.xesl │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1.cs.xesl │ │ │ ├── texture_load_r5g5b5a1_b5g5r5a1_scaled.cs.xesl │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga.cs.xesl │ │ │ ├── texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled.cs.xesl │ │ │ ├── texture_load_r5g6b5_b5g6r5.cs.xesl │ │ │ ├── texture_load_r5g6b5_b5g6r5_scaled.cs.xesl │ │ │ ├── texture_load_rg16_snorm_float.cs.xesl │ │ │ ├── texture_load_rg16_snorm_float_scaled.cs.xesl │ │ │ ├── texture_load_rg16_unorm_float.cs.xesl │ │ │ ├── texture_load_rg16_unorm_float_scaled.cs.xesl │ │ │ ├── texture_load_rgba16_snorm_float.cs.xesl │ │ │ ├── texture_load_rgba16_snorm_float_scaled.cs.xesl │ │ │ ├── texture_load_rgba16_unorm_float.cs.xesl │ │ │ ├── texture_load_rgba16_unorm_float_scaled.cs.xesl │ │ │ └── xenos_draw.hlsli │ │ ├── shared_memory.cc │ │ ├── shared_memory.h │ │ ├── spirv_builder.cc │ │ ├── spirv_builder.h │ │ ├── spirv_shader.cc │ │ ├── spirv_shader.h │ │ ├── spirv_shader_translator.cc │ │ ├── spirv_shader_translator.h │ │ ├── spirv_shader_translator_alu.cc │ │ ├── spirv_shader_translator_fetch.cc │ │ ├── spirv_shader_translator_memexport.cc │ │ ├── spirv_shader_translator_rb.cc │ │ ├── texture_address.h │ │ ├── texture_cache.cc │ │ ├── texture_cache.h │ │ ├── texture_dump.cc │ │ ├── texture_extent.cc │ │ ├── texture_info.cc │ │ ├── texture_info.h │ │ ├── texture_info_formats.cc │ │ ├── texture_util.cc │ │ ├── texture_util.h │ │ ├── trace_dump.cc │ │ ├── trace_dump.h │ │ ├── trace_player.cc │ │ ├── trace_player.h │ │ ├── trace_protocol.h │ │ ├── trace_reader.cc │ │ ├── trace_reader.h │ │ ├── trace_viewer.cc │ │ ├── trace_viewer.h │ │ ├── trace_writer.cc │ │ ├── trace_writer.h │ │ ├── ucode.cc │ │ ├── ucode.h │ │ ├── vulkan/ │ │ │ ├── deferred_command_buffer.cc │ │ │ ├── deferred_command_buffer.h │ │ │ ├── premake5.lua │ │ │ ├── vulkan_command_processor.cc │ │ │ ├── vulkan_command_processor.h │ │ │ ├── vulkan_graphics_system.cc │ │ │ ├── vulkan_graphics_system.h │ │ │ ├── vulkan_pipeline_cache.cc │ │ │ ├── vulkan_pipeline_cache.h │ │ │ ├── vulkan_primitive_processor.cc │ │ │ ├── vulkan_primitive_processor.h │ │ │ ├── vulkan_render_target_cache.cc │ │ │ ├── vulkan_render_target_cache.h │ │ │ ├── vulkan_shader.cc │ │ │ ├── vulkan_shader.h │ │ │ ├── vulkan_shared_memory.cc │ │ │ ├── vulkan_shared_memory.h │ │ │ ├── vulkan_texture_cache.cc │ │ │ ├── vulkan_texture_cache.h │ │ │ ├── vulkan_trace_dump_main.cc │ │ │ └── vulkan_trace_viewer_main.cc │ │ ├── xenos.cc │ │ └── xenos.h │ ├── helper/ │ │ └── sdl/ │ │ ├── premake5.lua │ │ ├── sdl_helper.cc │ │ └── sdl_helper.h │ ├── hid/ │ │ ├── hid_demo.cc │ │ ├── hid_flags.cc │ │ ├── hid_flags.h │ │ ├── input.h │ │ ├── input_driver.h │ │ ├── input_system.cc │ │ ├── input_system.h │ │ ├── nop/ │ │ │ ├── nop_hid.cc │ │ │ ├── nop_hid.h │ │ │ ├── nop_input_driver.cc │ │ │ ├── nop_input_driver.h │ │ │ └── premake5.lua │ │ ├── premake5.lua │ │ ├── sdl/ │ │ │ ├── premake5.lua │ │ │ ├── sdl_hid.cc │ │ │ ├── sdl_hid.h │ │ │ ├── sdl_input_driver.cc │ │ │ └── sdl_input_driver.h │ │ ├── winkey/ │ │ │ ├── premake5.lua │ │ │ ├── winkey_binding_table.inc │ │ │ ├── winkey_hid.cc │ │ │ ├── winkey_hid.h │ │ │ ├── winkey_input_driver.cc │ │ │ └── winkey_input_driver.h │ │ └── xinput/ │ │ ├── premake5.lua │ │ ├── xinput_hid.cc │ │ ├── xinput_hid.h │ │ ├── xinput_input_driver.cc │ │ └── xinput_input_driver.h │ ├── kernel/ │ │ ├── debug_visualizers.natvis │ │ ├── info/ │ │ │ ├── file.h │ │ │ └── volume.h │ │ ├── kernel_flags.cc │ │ ├── kernel_flags.h │ │ ├── kernel_module.cc │ │ ├── kernel_module.h │ │ ├── kernel_state.cc │ │ ├── kernel_state.h │ │ ├── premake5.lua │ │ ├── user_module.cc │ │ ├── user_module.h │ │ ├── util/ │ │ │ ├── export_table_post.inc │ │ │ ├── export_table_pre.inc │ │ │ ├── gameinfo_utils.cc │ │ │ ├── gameinfo_utils.h │ │ │ ├── native_list.cc │ │ │ ├── native_list.h │ │ │ ├── object_table.cc │ │ │ ├── object_table.h │ │ │ ├── ordinal_table_post.inc │ │ │ ├── ordinal_table_pre.inc │ │ │ ├── shim_utils.cc │ │ │ ├── shim_utils.h │ │ │ ├── xdbf_utils.cc │ │ │ ├── xdbf_utils.h │ │ │ └── xex2_info.h │ │ ├── xam/ │ │ │ ├── app_manager.cc │ │ │ ├── app_manager.h │ │ │ ├── apps/ │ │ │ │ ├── xam_app.cc │ │ │ │ ├── xam_app.h │ │ │ │ ├── xgi_app.cc │ │ │ │ ├── xgi_app.h │ │ │ │ ├── xlivebase_app.cc │ │ │ │ ├── xlivebase_app.h │ │ │ │ ├── xmp_app.cc │ │ │ │ └── xmp_app.h │ │ │ ├── content_manager.cc │ │ │ ├── content_manager.h │ │ │ ├── user_profile.cc │ │ │ ├── user_profile.h │ │ │ ├── xam_avatar.cc │ │ │ ├── xam_content.cc │ │ │ ├── xam_content_aggregate.cc │ │ │ ├── xam_content_device.cc │ │ │ ├── xam_content_device.h │ │ │ ├── xam_enum.cc │ │ │ ├── xam_info.cc │ │ │ ├── xam_input.cc │ │ │ ├── xam_locale.cc │ │ │ ├── xam_module.cc │ │ │ ├── xam_module.h │ │ │ ├── xam_module_export_groups.inc │ │ │ ├── xam_msg.cc │ │ │ ├── xam_net.cc │ │ │ ├── xam_notify.cc │ │ │ ├── xam_nui.cc │ │ │ ├── xam_ordinals.h │ │ │ ├── xam_party.cc │ │ │ ├── xam_private.h │ │ │ ├── xam_table.inc │ │ │ ├── xam_task.cc │ │ │ ├── xam_ui.cc │ │ │ ├── xam_user.cc │ │ │ ├── xam_video.cc │ │ │ └── xam_voice.cc │ │ ├── xbdm/ │ │ │ ├── xbdm_misc.cc │ │ │ ├── xbdm_module.cc │ │ │ ├── xbdm_module.h │ │ │ ├── xbdm_module_export_groups.inc │ │ │ ├── xbdm_ordinals.h │ │ │ ├── xbdm_private.h │ │ │ └── xbdm_table.inc │ │ ├── xboxkrnl/ │ │ │ ├── cert_monitor.cc │ │ │ ├── cert_monitor.h │ │ │ ├── debug_monitor.cc │ │ │ ├── debug_monitor.h │ │ │ ├── xboxkrnl_audio.cc │ │ │ ├── xboxkrnl_audio_xma.cc │ │ │ ├── xboxkrnl_crypt.cc │ │ │ ├── xboxkrnl_debug.cc │ │ │ ├── xboxkrnl_error.cc │ │ │ ├── xboxkrnl_error.h │ │ │ ├── xboxkrnl_hal.cc │ │ │ ├── xboxkrnl_hid.cc │ │ │ ├── xboxkrnl_io.cc │ │ │ ├── xboxkrnl_io_info.cc │ │ │ ├── xboxkrnl_memory.cc │ │ │ ├── xboxkrnl_misc.cc │ │ │ ├── xboxkrnl_module.cc │ │ │ ├── xboxkrnl_module.h │ │ │ ├── xboxkrnl_module_export_groups.inc │ │ │ ├── xboxkrnl_modules.cc │ │ │ ├── xboxkrnl_ob.cc │ │ │ ├── xboxkrnl_ordinals.h │ │ │ ├── xboxkrnl_private.h │ │ │ ├── xboxkrnl_rtl.cc │ │ │ ├── xboxkrnl_rtl.h │ │ │ ├── xboxkrnl_strings.cc │ │ │ ├── xboxkrnl_table.inc │ │ │ ├── xboxkrnl_threading.cc │ │ │ ├── xboxkrnl_threading.h │ │ │ ├── xboxkrnl_usbcam.cc │ │ │ ├── xboxkrnl_video.cc │ │ │ ├── xboxkrnl_video.h │ │ │ └── xboxkrnl_xconfig.cc │ │ ├── xenumerator.cc │ │ ├── xenumerator.h │ │ ├── xevent.cc │ │ ├── xevent.h │ │ ├── xfile.cc │ │ ├── xfile.h │ │ ├── xiocompletion.cc │ │ ├── xiocompletion.h │ │ ├── xmodule.cc │ │ ├── xmodule.h │ │ ├── xmutant.cc │ │ ├── xmutant.h │ │ ├── xnotifylistener.cc │ │ ├── xnotifylistener.h │ │ ├── xobject.cc │ │ ├── xobject.h │ │ ├── xsemaphore.cc │ │ ├── xsemaphore.h │ │ ├── xsocket.cc │ │ ├── xsocket.h │ │ ├── xsymboliclink.cc │ │ ├── xsymboliclink.h │ │ ├── xthread.cc │ │ ├── xthread.h │ │ ├── xtimer.cc │ │ └── xtimer.h │ ├── memory.cc │ ├── memory.h │ ├── premake5.lua │ ├── tools/ │ │ └── api-scanner/ │ │ ├── README.md │ │ ├── api_scanner_loader.cc │ │ ├── api_scanner_loader.h │ │ └── api_scanner_main.cc │ ├── ui/ │ │ ├── d3d12/ │ │ │ ├── d3d12_api.h │ │ │ ├── d3d12_cpu_descriptor_pool.cc │ │ │ ├── d3d12_cpu_descriptor_pool.h │ │ │ ├── d3d12_descriptor_heap_pool.cc │ │ │ ├── d3d12_descriptor_heap_pool.h │ │ │ ├── d3d12_gpu_completion_timeline.cc │ │ │ ├── d3d12_gpu_completion_timeline.h │ │ │ ├── d3d12_immediate_drawer.cc │ │ │ ├── d3d12_immediate_drawer.h │ │ │ ├── d3d12_presenter.cc │ │ │ ├── d3d12_presenter.h │ │ │ ├── d3d12_provider.cc │ │ │ ├── d3d12_provider.h │ │ │ ├── d3d12_upload_buffer_pool.cc │ │ │ ├── d3d12_upload_buffer_pool.h │ │ │ ├── d3d12_util.cc │ │ │ ├── d3d12_util.h │ │ │ ├── d3d12_window_demo.cc │ │ │ └── premake5.lua │ │ ├── dxgi_include_win.h │ │ ├── file_picker.h │ │ ├── file_picker_android.cc │ │ ├── file_picker_gtk.cc │ │ ├── file_picker_win.cc │ │ ├── gpu_completion_timeline.h │ │ ├── graphics_provider.h │ │ ├── graphics_upload_buffer_pool.cc │ │ ├── graphics_upload_buffer_pool.h │ │ ├── graphics_util.cc │ │ ├── graphics_util.h │ │ ├── imgui_dialog.cc │ │ ├── imgui_dialog.h │ │ ├── imgui_drawer.cc │ │ ├── imgui_drawer.h │ │ ├── immediate_drawer.cc │ │ ├── immediate_drawer.h │ │ ├── menu_item.cc │ │ ├── menu_item.h │ │ ├── microprofile_drawer.cc │ │ ├── microprofile_drawer.h │ │ ├── premake5.lua │ │ ├── presenter.cc │ │ ├── presenter.h │ │ ├── renderdoc_api.cc │ │ ├── renderdoc_api.h │ │ ├── shaders/ │ │ │ ├── amd_language.xesli │ │ │ ├── bytecode/ │ │ │ │ ├── .clang-format │ │ │ │ ├── d3d12_5_1/ │ │ │ │ │ ├── guest_output_bilinear_dither_ps.h │ │ │ │ │ ├── guest_output_bilinear_ps.h │ │ │ │ │ ├── guest_output_ffx_cas_resample_dither_ps.h │ │ │ │ │ ├── guest_output_ffx_cas_resample_ps.h │ │ │ │ │ ├── guest_output_ffx_cas_sharpen_dither_ps.h │ │ │ │ │ ├── guest_output_ffx_cas_sharpen_ps.h │ │ │ │ │ ├── guest_output_ffx_fsr_easu_ps.h │ │ │ │ │ ├── guest_output_ffx_fsr_rcas_dither_ps.h │ │ │ │ │ ├── guest_output_ffx_fsr_rcas_ps.h │ │ │ │ │ ├── guest_output_triangle_strip_rect_vs.h │ │ │ │ │ ├── immediate_ps.h │ │ │ │ │ └── immediate_vs.h │ │ │ │ └── vulkan_spirv/ │ │ │ │ ├── guest_output_bilinear_dither_ps.h │ │ │ │ ├── guest_output_bilinear_ps.h │ │ │ │ ├── guest_output_ffx_cas_resample_dither_ps.h │ │ │ │ ├── guest_output_ffx_cas_resample_ps.h │ │ │ │ ├── guest_output_ffx_cas_sharpen_dither_ps.h │ │ │ │ ├── guest_output_ffx_cas_sharpen_ps.h │ │ │ │ ├── guest_output_ffx_fsr_easu_ps.h │ │ │ │ ├── guest_output_ffx_fsr_rcas_dither_ps.h │ │ │ │ ├── guest_output_ffx_fsr_rcas_ps.h │ │ │ │ ├── guest_output_triangle_strip_rect_vs.h │ │ │ │ ├── immediate_ps.h │ │ │ │ └── immediate_vs.h │ │ │ ├── dither_8bpc.xesli │ │ │ ├── guest_output_bilinear.ps.xesl │ │ │ ├── guest_output_bilinear.xesli │ │ │ ├── guest_output_bilinear_dither.ps.xesl │ │ │ ├── guest_output_ffx_cas_resample.ps.xesl │ │ │ ├── guest_output_ffx_cas_resample.xesli │ │ │ ├── guest_output_ffx_cas_resample_dither.ps.xesl │ │ │ ├── guest_output_ffx_cas_sharpen.ps.xesl │ │ │ ├── guest_output_ffx_cas_sharpen.xesli │ │ │ ├── guest_output_ffx_cas_sharpen_dither.ps.xesl │ │ │ ├── guest_output_ffx_fsr_easu.ps.xesl │ │ │ ├── guest_output_ffx_fsr_rcas.ps.xesl │ │ │ ├── guest_output_ffx_fsr_rcas.xesli │ │ │ ├── guest_output_ffx_fsr_rcas_dither.ps.xesl │ │ │ ├── guest_output_triangle_strip_rect.vs.xesl │ │ │ ├── immediate.ps.xesl │ │ │ ├── immediate.vs.xesl │ │ │ ├── noise.xesli │ │ │ └── xesl.xesli │ │ ├── surface.h │ │ ├── surface_android.cc │ │ ├── surface_android.h │ │ ├── surface_gnulinux.cc │ │ ├── surface_gnulinux.h │ │ ├── surface_win.cc │ │ ├── surface_win.h │ │ ├── ui_drawer.h │ │ ├── ui_event.h │ │ ├── virtual_key.h │ │ ├── vulkan/ │ │ │ ├── functions/ │ │ │ │ ├── device_1_0.inc │ │ │ │ ├── device_1_1_khr_bind_memory2.inc │ │ │ │ ├── device_1_1_khr_get_memory_requirements2.inc │ │ │ │ ├── device_1_3_khr_maintenance4.inc │ │ │ │ ├── device_khr_swapchain.inc │ │ │ │ ├── instance_1_0.inc │ │ │ │ ├── instance_1_1_khr_get_physical_device_properties2.inc │ │ │ │ ├── instance_ext_debug_utils.inc │ │ │ │ ├── instance_khr_android_surface.inc │ │ │ │ ├── instance_khr_surface.inc │ │ │ │ ├── instance_khr_win32_surface.inc │ │ │ │ └── instance_khr_xcb_surface.inc │ │ │ ├── linked_type_descriptor_set_allocator.cc │ │ │ ├── linked_type_descriptor_set_allocator.h │ │ │ ├── premake5.lua │ │ │ ├── single_layout_descriptor_set_pool.cc │ │ │ ├── single_layout_descriptor_set_pool.h │ │ │ ├── spirv_tools_context.cc │ │ │ ├── spirv_tools_context.h │ │ │ ├── ui_samplers.cc │ │ │ ├── ui_samplers.h │ │ │ ├── vulkan_api.h │ │ │ ├── vulkan_device.cc │ │ │ ├── vulkan_device.h │ │ │ ├── vulkan_gpu_completion_timeline.cc │ │ │ ├── vulkan_gpu_completion_timeline.h │ │ │ ├── vulkan_immediate_drawer.cc │ │ │ ├── vulkan_immediate_drawer.h │ │ │ ├── vulkan_instance.cc │ │ │ ├── vulkan_instance.h │ │ │ ├── vulkan_mem_alloc.cc │ │ │ ├── vulkan_mem_alloc.h │ │ │ ├── vulkan_presenter.cc │ │ │ ├── vulkan_presenter.h │ │ │ ├── vulkan_provider.cc │ │ │ ├── vulkan_provider.h │ │ │ ├── vulkan_upload_buffer_pool.cc │ │ │ ├── vulkan_upload_buffer_pool.h │ │ │ ├── vulkan_util.cc │ │ │ ├── vulkan_util.h │ │ │ └── vulkan_window_demo.cc │ │ ├── window.cc │ │ ├── window.h │ │ ├── window_android.cc │ │ ├── window_android.h │ │ ├── window_demo.cc │ │ ├── window_demo.h │ │ ├── window_gtk.cc │ │ ├── window_gtk.h │ │ ├── window_listener.h │ │ ├── window_win.cc │ │ ├── window_win.h │ │ ├── windowed_app.cc │ │ ├── windowed_app.h │ │ ├── windowed_app_context.cc │ │ ├── windowed_app_context.h │ │ ├── windowed_app_context_android.cc │ │ ├── windowed_app_context_android.h │ │ ├── windowed_app_context_gtk.cc │ │ ├── windowed_app_context_gtk.h │ │ ├── windowed_app_context_win.cc │ │ ├── windowed_app_context_win.h │ │ ├── windowed_app_main_android.cc │ │ ├── windowed_app_main_posix.cc │ │ └── windowed_app_main_win.cc │ ├── vfs/ │ │ ├── device.cc │ │ ├── device.h │ │ ├── devices/ │ │ │ ├── disc_image_device.cc │ │ │ ├── disc_image_device.h │ │ │ ├── disc_image_entry.cc │ │ │ ├── disc_image_entry.h │ │ │ ├── disc_image_file.cc │ │ │ ├── disc_image_file.h │ │ │ ├── host_path_device.cc │ │ │ ├── host_path_device.h │ │ │ ├── host_path_entry.cc │ │ │ ├── host_path_entry.h │ │ │ ├── host_path_file.cc │ │ │ ├── host_path_file.h │ │ │ ├── null_device.cc │ │ │ ├── null_device.h │ │ │ ├── null_entry.cc │ │ │ ├── null_entry.h │ │ │ ├── null_file.cc │ │ │ ├── null_file.h │ │ │ ├── stfs_container_device.cc │ │ │ ├── stfs_container_device.h │ │ │ ├── stfs_container_entry.cc │ │ │ ├── stfs_container_entry.h │ │ │ ├── stfs_container_file.cc │ │ │ ├── stfs_container_file.h │ │ │ └── stfs_xbox.h │ │ ├── entry.cc │ │ ├── entry.h │ │ ├── file.h │ │ ├── premake5.lua │ │ ├── testing/ │ │ │ ├── premake5.lua │ │ │ └── vfs_test.cc │ │ ├── vfs_dump.cc │ │ ├── virtual_file_system.cc │ │ └── virtual_file_system.h │ └── xbox.h ├── third_party/ │ ├── .clang-format │ ├── SDL2-static.lua │ ├── SDL2.lua │ ├── aes_128.lua │ ├── binutils/ │ │ ├── README.md │ │ └── build.sh │ ├── capstone.lua │ ├── clang-format/ │ │ ├── LICENSE.TXT │ │ ├── clang-format-bbedit.applescript │ │ ├── clang-format-diff.py │ │ ├── clang-format-sublime.py │ │ ├── clang-format.el │ │ ├── clang-format.py │ │ └── git-clang-format │ ├── cpptoml.lua │ ├── crypto/ │ │ ├── TinySHA1.hpp │ │ ├── des/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── des.cpp │ │ │ ├── des.h │ │ │ ├── des3.h │ │ │ ├── des_data.h │ │ │ ├── des_key.h │ │ │ ├── des_lookup.h │ │ │ └── descbc.h │ │ ├── rc4.c │ │ ├── rc4.h │ │ ├── rijndael-alg-fst.c │ │ ├── rijndael-alg-fst.h │ │ ├── sha256.cpp │ │ └── sha256.h │ ├── cxxopts.lua │ ├── discord-rpc.lua │ ├── dxbc/ │ │ ├── DXBCChecksum.cpp │ │ └── DXBCChecksum.h │ ├── dxbc.lua │ ├── fmt.lua │ ├── fxaa/ │ │ ├── FXAA3_11.h │ │ └── LICENSE │ ├── glslang-spirv.lua │ ├── google-styleguide/ │ │ └── cpplint/ │ │ ├── README │ │ └── cpplint.py │ ├── half/ │ │ ├── ChangeLog.txt │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ └── include/ │ │ └── half.hpp │ ├── imgui.lua │ ├── llvm/ │ │ ├── LICENSE.txt │ │ ├── dummy.cc │ │ └── include/ │ │ └── llvm/ │ │ ├── ADT/ │ │ │ └── BitVector.h │ │ └── Support/ │ │ ├── Compiler.h │ │ ├── MathExtras.h │ │ └── type_traits.h │ ├── microprofile/ │ │ ├── README.md │ │ ├── microprofile.h │ │ ├── microprofiledraw.h │ │ ├── microprofilehtml.h │ │ └── microprofileui.h │ ├── mspack/ │ │ ├── COPYING.LIB │ │ ├── config.h │ │ ├── logging.cc │ │ ├── lzx.h │ │ ├── lzxd.c │ │ ├── mspack.h │ │ ├── readbits.h │ │ ├── readhuff.h │ │ ├── system.c │ │ └── system.h │ ├── mspack.lua │ ├── pe/ │ │ └── pe_image.h │ ├── renderdoc/ │ │ └── renderdoc_app.h │ ├── snappy.lua │ ├── stb/ │ │ ├── stb_image.h │ │ └── stb_image_write.h │ └── xxhash.lua ├── tools/ │ ├── build/ │ │ ├── premake │ │ ├── premake5.lua │ │ ├── scripts/ │ │ │ ├── build_paths.lua │ │ │ ├── force_compile_as_c.lua │ │ │ ├── force_compile_as_cc.lua │ │ │ ├── pkg_config.lua │ │ │ ├── platform_files.lua │ │ │ ├── single_library.lua │ │ │ ├── test_suite.lua │ │ │ └── util.lua │ │ └── src/ │ │ └── test_suite_main.cc │ ├── diff.py │ ├── generate_map.idc │ ├── gpu-trace-diff │ ├── ppc-instructions.xml │ ├── ppc-table-gen │ ├── shader-playground/ │ │ ├── App.config │ │ ├── Editor.Designer.cs │ │ ├── Editor.cs │ │ ├── Editor.resx │ │ ├── Program.cs │ │ ├── README.md │ │ ├── shader-playground.csproj │ │ └── shader-playground.sln │ ├── vswhere/ │ │ └── LICENSE.txt │ └── xenosci/ │ └── local_runner.py ├── xb.bat ├── xb.ps1 ├── xenia-build └── xeniarc
Copy disabled (too large)
Download .json
Condensed preview — 1494 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (27,280K chars).
[
{
"path": ".appveyor.yml",
"chars": 2882,
"preview": "version: 1.0.{build}-{branch}\n\nbranches:\n except:\n - gh-pages\n\nskip_tags: true\n\nskip_commits:\n files:\n - .drone."
},
{
"path": ".clang-format",
"chars": 242,
"preview": "---\nBasedOnStyle: Google\nDerivePointerAlignment: false\nPointerAlignment: Left\nSortIncludes: true\n\n# Regroup causes unnec"
},
{
"path": ".drone.star",
"chars": 12589,
"preview": "def main(ctx):\n return [\n pipeline_lint(),\n pipeline_linux_desktop('x86_64-linux-clang', image_linux_x8"
},
{
"path": ".gdbinit",
"chars": 323,
"preview": "# Ignore HighResolutionTimer custom event\nhandle SIG34 nostop noprint\n# Ignore PosixTimer custom event\nhandle SIG35 nost"
},
{
"path": ".gitattributes",
"chars": 378,
"preview": "* text=auto whitespace=blank-at-eol,tab-in-indent,trailing-space,tabwidth=2\n\n*.bat text eol=crlf\n*.sh "
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 7289,
"preview": "# Content Guidelines\n\nThe issue tracker is exclusively for filing and discussing bugs, feature\nrequests, and tracking wo"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
"chars": 2318,
"preview": "name: Bug report\ndescription: Template for bug reports.\nlabels: bug\nbody:\n - id: disclaimer\n type: markdown\n attr"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 130,
"preview": "contact_links:\n - name: Xenia Discord server\n url: https://discord.gg/Q9mxZf9\n about: Tech support for Xenia belo"
},
{
"path": ".gitignore",
"chars": 1917,
"preview": "# ==============================================================================\n# Misc system junk\n# =================="
},
{
"path": ".gitmodules",
"chars": 3702,
"preview": "[submodule \"third_party/xbyak\"]\n\tpath = third_party/xbyak\n\turl = https://github.com/xenia-project/xbyak.git\n[submodule \""
},
{
"path": "LICENSE",
"chars": 1481,
"preview": "Copyright (c) 2015, Ben Vanik.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\n"
},
{
"path": "README.md",
"chars": 3719,
"preview": "<p align=\"center\">\n <a href=\"https://github.com/xenia-project/xenia/tree/master/assets/icon\">\n <img height=\"12"
},
{
"path": "android/android_studio_project/.gitignore",
"chars": 225,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
},
{
"path": "android/android_studio_project/app/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "android/android_studio_project/app/build.gradle",
"chars": 2723,
"preview": "plugins {\n id 'com.android.application'\n}\n\nandroid {\n compileSdkVersion 33\n ndkVersion '25.0.8775105'\n\n defa"
},
{
"path": "android/android_studio_project/app/proguard-rules.pro",
"chars": 750,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "android/android_studio_project/app/src/main/AndroidManifest.xml",
"chars": 1787,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/XeniaRuntimeException.java",
"chars": 498,
"preview": "package jp.xenia;\n\n/**\n * Base class for all unchecked exceptions thrown by the Xenia project components.\n */\npublic cla"
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/GpuTraceViewerActivity.java",
"chars": 510,
"preview": "package jp.xenia.emulator;\n\nimport android.os.Bundle;\n\npublic class GpuTraceViewerActivity extends WindowedAppActivity {"
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/LauncherActivity.java",
"chars": 1692,
"preview": "package jp.xenia.emulator;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport a"
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowDemoActivity.java",
"chars": 494,
"preview": "package jp.xenia.emulator;\n\nimport android.os.Bundle;\n\npublic class WindowDemoActivity extends WindowedAppActivity {\n "
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowSurfaceView.java",
"chars": 1301,
"preview": "package jp.xenia.emulator;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.util.Attribut"
},
{
"path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowedAppActivity.java",
"chars": 6531,
"preview": "package jp.xenia.emulator;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content."
},
{
"path": "android/android_studio_project/app/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "android/android_studio_project/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1702,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:aapt=\"http://schemas.android.com/aapt\"\n "
},
{
"path": "android/android_studio_project/app/src/main/res/layout/activity_gpu_trace_viewer.xml",
"chars": 383,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<jp.xenia.emulator.WindowSurfaceView xmlns:android=\"http://schemas.android.com/ap"
},
{
"path": "android/android_studio_project/app/src/main/res/layout/activity_launcher.xml",
"chars": 957,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:"
},
{
"path": "android/android_studio_project/app/src/main/res/layout/activity_window_demo.xml",
"chars": 374,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<jp.xenia.emulator.WindowSurfaceView xmlns:android=\"http://schemas.android.com/ap"
},
{
"path": "android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "android/android_studio_project/app/src/main/res/values/strings.xml",
"chars": 211,
"preview": "<resources>\n <string name=\"app_name\">Xenia</string>\n <string name=\"activity_label_gpu_trace_viewer\">GPU Trace View"
},
{
"path": "android/android_studio_project/build.gradle",
"chars": 540,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n re"
},
{
"path": "android/android_studio_project/gradle/wrapper/gradle-wrapper.properties",
"chars": 232,
"preview": "#Mon Nov 01 23:19:20 MSK 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributio"
},
{
"path": "android/android_studio_project/gradle.properties",
"chars": 1093,
"preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
},
{
"path": "android/android_studio_project/gradlew",
"chars": 5296,
"preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n## Gradle start up"
},
{
"path": "android/android_studio_project/gradlew.bat",
"chars": 2260,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
},
{
"path": "android/android_studio_project/settings.gradle",
"chars": 41,
"preview": "include ':app'\nrootProject.name = \"Xenia\""
},
{
"path": "assets/icon/LICENSE",
"chars": 20129,
"preview": "Attribution-ShareAlike 4.0 International\n\n=======================================================================\n\nCreat"
},
{
"path": "docs/building.md",
"chars": 3597,
"preview": "# Building\n\nYou must have a 64-bit machine for building and running the project. Always\nrun your system updater before b"
},
{
"path": "docs/cpu.md",
"chars": 6123,
"preview": "# CPU Documentation\n\n## The JIT\n\n\n\nThe JIT is the core of Xenia. It translate"
},
{
"path": "docs/cpu_todo.md",
"chars": 11799,
"preview": "# CPU TODO\n\nThere are many improvements that can be done under `xe::cpu` to improve\ndebugging, performance (both to JIT "
},
{
"path": "docs/gpu.md",
"chars": 5570,
"preview": "# GPU Documentation\n\n## The Xenos Chip\n\nThe [Xenos](https://en.wikipedia.org/wiki/Xenos_\\(graphics_chip\\)) is a graphics"
},
{
"path": "docs/instruction_tracing.md",
"chars": 697,
"preview": "In x64_tracers.cc:\n\nEnable tracing:\n```\n#define ITRACE 1 <--- for only ppc instructions\n#define DTRACE 1 <--- add HIR "
},
{
"path": "docs/kernel.md",
"chars": 1753,
"preview": "# Kernel Documentation\n\n## Kernel shims\nXenia implements all kernel APIs as native functions under the host.\n\nWhen a mod"
},
{
"path": "docs/ppc/vmx128.txt",
"chars": 22943,
"preview": " 2006/09/01 Revision 1.2\n-------------------------------------------------------"
},
{
"path": "docs/style_guide.md",
"chars": 6170,
"preview": "# C++ Style Guide\n\nThe style guide can be summed up as 'clang-format with the Google style set'.\nIn addition, the [Googl"
},
{
"path": "premake5.lua",
"chars": 8431,
"preview": "include(\"tools/build\")\nrequire(\"third_party/premake-export-compile-commands/export-compile-commands\")\nrequire(\"third_par"
},
{
"path": "src/xenia/app/discord/discord_presence.cc",
"chars": 2189,
"preview": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research "
},
{
"path": "src/xenia/app/discord/discord_presence.h",
"chars": 893,
"preview": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research "
},
{
"path": "src/xenia/app/discord/premake5.lua",
"chars": 382,
"preview": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-app-discord\")\n uuid(\"d1"
},
{
"path": "src/xenia/app/emulator_window.cc",
"chars": 37264,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/app/emulator_window.h",
"chars": 5528,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/app/main_resources.rc",
"chars": 107,
"preview": "//{{NO_DEPENDENCIES}}\n\nMAINICON ICON \"..\\\\..\\\\..\\\\assets\\\\icon\\\\icon.ico\"\n"
},
{
"path": "src/xenia/app/premake5.lua",
"chars": 2965,
"preview": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-app\")\n uuid(\"d7e98620-d007"
},
{
"path": "src/xenia/app/xenia_main.cc",
"chars": 26156,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/apu_flags.cc",
"chars": 582,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/apu_flags.h",
"chars": 635,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/audio_driver.cc",
"chars": 700,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/audio_driver.h",
"chars": 1041,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/audio_system.cc",
"chars": 9420,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/audio_system.h",
"chars": 3079,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/conversion.h",
"chars": 5323,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/debug_visualizers.natvis",
"chars": 299,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\""
},
{
"path": "src/xenia/apu/nop/nop_apu_flags.cc",
"chars": 530,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/nop/nop_apu_flags.h",
"chars": 610,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/nop/nop_audio_system.cc",
"chars": 1259,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/nop/nop_audio_system.h",
"chars": 1213,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/nop/premake5.lua",
"chars": 283,
"preview": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-nop\")\n uuid(\"f37dbf"
},
{
"path": "src/xenia/apu/premake5.lua",
"chars": 357,
"preview": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu\")\n uuid(\"f4df01f0-50e4"
},
{
"path": "src/xenia/apu/sdl/premake5.lua",
"chars": 336,
"preview": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-sdl\")\n uuid(\"153b4e"
},
{
"path": "src/xenia/apu/sdl/sdl_audio_driver.cc",
"chars": 5162,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/sdl/sdl_audio_driver.h",
"chars": 1765,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/sdl/sdl_audio_system.cc",
"chars": 1701,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/sdl/sdl_audio_system.h",
"chars": 1256,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/premake5.lua",
"chars": 287,
"preview": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-xaudio2\")\n uuid(\"7a"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_api.h",
"chars": 13128,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_apu_flags.cc",
"chars": 538,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_apu_flags.h",
"chars": 634,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_audio_driver.cc",
"chars": 12784,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_audio_driver.h",
"chars": 3865,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_audio_system.cc",
"chars": 1773,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xaudio2/xaudio2_audio_system.h",
"chars": 1300,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_context.cc",
"chars": 29902,
"preview": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research "
},
{
"path": "src/xenia/apu/xma_context.h",
"chars": 8962,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_decoder.cc",
"chars": 11887,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_decoder.h",
"chars": 2685,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_helpers.h",
"chars": 1504,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_register_file.cc",
"chars": 1228,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_register_file.h",
"chars": 1280,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/apu/xma_register_table.inc",
"chars": 2828,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/README.md",
"chars": 879,
"preview": "A lightweight cross-platform/compiler compatibility library.\n\nThis library presupposes C++11/14 support. As more compile"
},
{
"path": "src/xenia/base/app_win32.manifest",
"chars": 1744,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" xmlns:asmv3=\""
},
{
"path": "src/xenia/base/arena.cc",
"chars": 3740,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/arena.h",
"chars": 1684,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/assert.h",
"chars": 3071,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/atomic.h",
"chars": 5445,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/bit_map.cc",
"chars": 2440,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/bit_map.h",
"chars": 1674,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/bit_range.h",
"chars": 3628,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/bit_stream.cc",
"chars": 4412,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/bit_stream.h",
"chars": 1410,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/byte_order.h",
"chars": 3683,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/byte_stream.cc",
"chars": 1613,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/byte_stream.h",
"chars": 2047,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/chrono.h",
"chars": 6218,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/chrono_steady_cast.h",
"chars": 3001,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/clock.cc",
"chars": 8070,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/clock.h",
"chars": 3429,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/clock_posix.cc",
"chars": 1816,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/clock_win.cc",
"chars": 1200,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/clock_x64.cc",
"chars": 3772,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console.h",
"chars": 751,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_app_main.h",
"chars": 2106,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_app_main_android.cc",
"chars": 1393,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_app_main_posix.cc",
"chars": 1209,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_app_main_win.cc",
"chars": 1263,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_posix.cc",
"chars": 690,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/console_win.cc",
"chars": 1849,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/cvar.cc",
"chars": 6403,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/cvar.h",
"chars": 24958,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/cvar_android.cc",
"chars": 7732,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/debug_visualizers.natvis",
"chars": 2810,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\""
},
{
"path": "src/xenia/base/debugging.h",
"chars": 1527,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/debugging_mac.cc",
"chars": 1117,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/debugging_posix.cc",
"chars": 1619,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/debugging_win.cc",
"chars": 896,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/delegate.h",
"chars": 1855,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/exception_handler.cc",
"chars": 3792,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/exception_handler.h",
"chars": 8391,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/exception_handler_posix.cc",
"chars": 11681,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/exception_handler_win.cc",
"chars": 5722,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem.cc",
"chars": 908,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem.h",
"chars": 4740,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem_android.cc",
"chars": 10162,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem_posix.cc",
"chars": 6995,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem_wildcard.cc",
"chars": 3340,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem_wildcard.h",
"chars": 1628,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/filesystem_win.cc",
"chars": 7994,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/fuzzy.cc",
"chars": 1977,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/fuzzy.h",
"chars": 1772,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/hash.h",
"chars": 1264,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/host_thread_context.cc",
"chars": 4063,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/host_thread_context.h",
"chars": 3514,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/literals.h",
"chars": 1091,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/logging.cc",
"chars": 15847,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/logging.h",
"chars": 5114,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_android.cc",
"chars": 5606,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_android.h",
"chars": 2669,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_init_android.cc",
"chars": 507,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_init_posix.cc",
"chars": 507,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_init_win.cc",
"chars": 1478,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_win.cc",
"chars": 4654,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/main_win.h",
"chars": 1083,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/mapped_memory.h",
"chars": 3052,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/mapped_memory_posix.cc",
"chars": 3852,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/mapped_memory_win.cc",
"chars": 12011,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/math.h",
"chars": 14957,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/memory.cc",
"chars": 14034,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/memory.h",
"chars": 16230,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/memory_posix.cc",
"chars": 5810,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/memory_win.cc",
"chars": 7625,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/mutex.cc",
"chars": 681,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/mutex.h",
"chars": 3613,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/platform.h",
"chars": 3254,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/platform_linux.h",
"chars": 849,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/platform_win.h",
"chars": 1149,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/premake5.lua",
"chars": 382,
"preview": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\nproject(\"xenia-base\")\n uuid(\"aeadaf22-2b20-4941-b05f-a"
},
{
"path": "src/xenia/base/profiling.cc",
"chars": 11727,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/profiling.h",
"chars": 8302,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/reset_scope.h",
"chars": 1070,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/ring_buffer.cc",
"chars": 3526,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/ring_buffer.h",
"chars": 3465,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/socket.h",
"chars": 4598,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/socket_win.cc",
"chars": 9647,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string.cc",
"chars": 1595,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string.h",
"chars": 952,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string_buffer.cc",
"chars": 3078,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string_buffer.h",
"chars": 1630,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string_key.h",
"chars": 2834,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/string_util.h",
"chars": 10947,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/system.h",
"chars": 1212,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/system_android.cc",
"chars": 11309,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/system_gnulinux.cc",
"chars": 2291,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/system_win.cc",
"chars": 1761,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/testing/chrono_test.cc",
"chars": 4894,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/testing/memory_test.cc",
"chars": 21426,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/testing/premake5.lua",
"chars": 169,
"preview": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ntest_suite(\"xenia-base-tests\", project_root, \".\", {\n"
},
{
"path": "src/xenia/base/testing/threading_test.cc",
"chars": 36650,
"preview": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research "
},
{
"path": "src/xenia/base/testing/utf8_test.cc",
"chars": 27926,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Resear"
},
{
"path": "src/xenia/base/threading.cc",
"chars": 1050,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading.h",
"chars": 19262,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading_mac.cc",
"chars": 1196,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading_posix.cc",
"chars": 36134,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading_timer_queue.cc",
"chars": 7962,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading_timer_queue.h",
"chars": 3011,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/threading_win.cc",
"chars": 16083,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/type_pool.h",
"chars": 1378,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/utf8.cc",
"chars": 19426,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/utf8.h",
"chars": 5604,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
},
{
"path": "src/xenia/base/vec128.cc",
"chars": 1014,
"preview": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Researc"
}
]
// ... and 1294 more files (download for full content)
About this extraction
This page contains the full source code of the xenia-project/xenia GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1494 files (25.2 MB), approximately 6.7M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.