diff options
| author | 2016-04-13 23:36:39 -0400 | |
|---|---|---|
| committer | 2016-04-13 23:36:39 -0400 | |
| commit | d89e48679e93f8a6242d9c8d0837053f5aa708d0 (patch) | |
| tree | 7bb6c9fd8e9a659369e92661478925512ac8eddd /src/video_core/shader/shader.cpp | |
| parent | Merge pull request #1660 from MerryMage/file_util (diff) | |
| parent | shader_jit_x64: Rename RuntimeAssert to Compile_Assert. (diff) | |
| download | yuzu-d89e48679e93f8a6242d9c8d0837053f5aa708d0.tar.gz yuzu-d89e48679e93f8a6242d9c8d0837053f5aa708d0.tar.xz yuzu-d89e48679e93f8a6242d9c8d0837053f5aa708d0.zip | |
Merge pull request #1546 from bunnei/refactor-shader-jit
Shader JIT Part 2
Diffstat (limited to 'src/video_core/shader/shader.cpp')
| -rw-r--r-- | src/video_core/shader/shader.cpp | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp index 78d295c76..75301accd 100644 --- a/src/video_core/shader/shader.cpp +++ b/src/video_core/shader/shader.cpp | |||
| @@ -28,36 +28,24 @@ namespace Pica { | |||
| 28 | namespace Shader { | 28 | namespace Shader { |
| 29 | 29 | ||
| 30 | #ifdef ARCHITECTURE_x86_64 | 30 | #ifdef ARCHITECTURE_x86_64 |
| 31 | static std::unordered_map<u64, CompiledShader*> shader_map; | 31 | static std::unordered_map<u64, std::unique_ptr<JitShader>> shader_map; |
| 32 | static JitCompiler jit; | 32 | static const JitShader* jit_shader; |
| 33 | static CompiledShader* jit_shader; | ||
| 34 | |||
| 35 | static void ClearCache() { | ||
| 36 | shader_map.clear(); | ||
| 37 | jit.Clear(); | ||
| 38 | LOG_INFO(HW_GPU, "Shader JIT cache cleared"); | ||
| 39 | } | ||
| 40 | #endif // ARCHITECTURE_x86_64 | 33 | #endif // ARCHITECTURE_x86_64 |
| 41 | 34 | ||
| 42 | void Setup(UnitState<false>& state) { | 35 | void Setup() { |
| 43 | #ifdef ARCHITECTURE_x86_64 | 36 | #ifdef ARCHITECTURE_x86_64 |
| 44 | if (VideoCore::g_shader_jit_enabled) { | 37 | if (VideoCore::g_shader_jit_enabled) { |
| 45 | u64 cache_key = (Common::ComputeHash64(&g_state.vs.program_code, sizeof(g_state.vs.program_code)) ^ | 38 | u64 cache_key = (Common::ComputeHash64(&g_state.vs.program_code, sizeof(g_state.vs.program_code)) ^ |
| 46 | Common::ComputeHash64(&g_state.vs.swizzle_data, sizeof(g_state.vs.swizzle_data)) ^ | 39 | Common::ComputeHash64(&g_state.vs.swizzle_data, sizeof(g_state.vs.swizzle_data))); |
| 47 | g_state.regs.vs.main_offset); | ||
| 48 | 40 | ||
| 49 | auto iter = shader_map.find(cache_key); | 41 | auto iter = shader_map.find(cache_key); |
| 50 | if (iter != shader_map.end()) { | 42 | if (iter != shader_map.end()) { |
| 51 | jit_shader = iter->second; | 43 | jit_shader = iter->second.get(); |
| 52 | } else { | 44 | } else { |
| 53 | // Check if remaining JIT code space is enough for at least one more (massive) shader | 45 | auto shader = std::make_unique<JitShader>(); |
| 54 | if (jit.GetSpaceLeft() < jit_shader_size) { | 46 | shader->Compile(); |
| 55 | // If not, clear the cache of all previously compiled shaders | 47 | jit_shader = shader.get(); |
| 56 | ClearCache(); | 48 | shader_map[cache_key] = std::move(shader); |
| 57 | } | ||
| 58 | |||
| 59 | jit_shader = jit.Compile(); | ||
| 60 | shader_map.emplace(cache_key, jit_shader); | ||
| 61 | } | 49 | } |
| 62 | } | 50 | } |
| 63 | #endif // ARCHITECTURE_x86_64 | 51 | #endif // ARCHITECTURE_x86_64 |
| @@ -65,7 +53,7 @@ void Setup(UnitState<false>& state) { | |||
| 65 | 53 | ||
| 66 | void Shutdown() { | 54 | void Shutdown() { |
| 67 | #ifdef ARCHITECTURE_x86_64 | 55 | #ifdef ARCHITECTURE_x86_64 |
| 68 | ClearCache(); | 56 | shader_map.clear(); |
| 69 | #endif // ARCHITECTURE_x86_64 | 57 | #endif // ARCHITECTURE_x86_64 |
| 70 | } | 58 | } |
| 71 | 59 | ||
| @@ -109,7 +97,7 @@ OutputVertex Run(UnitState<false>& state, const InputVertex& input, int num_attr | |||
| 109 | 97 | ||
| 110 | #ifdef ARCHITECTURE_x86_64 | 98 | #ifdef ARCHITECTURE_x86_64 |
| 111 | if (VideoCore::g_shader_jit_enabled) | 99 | if (VideoCore::g_shader_jit_enabled) |
| 112 | jit_shader(&state.registers); | 100 | jit_shader->Run(&state.registers, g_state.regs.vs.main_offset); |
| 113 | else | 101 | else |
| 114 | RunInterpreter(state); | 102 | RunInterpreter(state); |
| 115 | #else | 103 | #else |