summaryrefslogtreecommitdiff
path: root/src/video_core/shader/shader.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2016-04-13 23:36:39 -0400
committerGravatar bunnei2016-04-13 23:36:39 -0400
commitd89e48679e93f8a6242d9c8d0837053f5aa708d0 (patch)
tree7bb6c9fd8e9a659369e92661478925512ac8eddd /src/video_core/shader/shader.cpp
parentMerge pull request #1660 from MerryMage/file_util (diff)
parentshader_jit_x64: Rename RuntimeAssert to Compile_Assert. (diff)
downloadyuzu-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.cpp34
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 {
28namespace Shader { 28namespace Shader {
29 29
30#ifdef ARCHITECTURE_x86_64 30#ifdef ARCHITECTURE_x86_64
31static std::unordered_map<u64, CompiledShader*> shader_map; 31static std::unordered_map<u64, std::unique_ptr<JitShader>> shader_map;
32static JitCompiler jit; 32static const JitShader* jit_shader;
33static CompiledShader* jit_shader;
34
35static 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
42void Setup(UnitState<false>& state) { 35void 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
66void Shutdown() { 54void 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