summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-04-16 13:50:12 -0400
committerGravatar Fernando Sahmkow2020-04-22 11:36:25 -0400
commit644588fd883fb45bf6d1cb7895e98ec65120c7f1 (patch)
treebba62ddc70e779d34591d5c37746dcc38238c8b1 /src
parentAddress Feedback. (diff)
downloadyuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.tar.gz
yuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.tar.xz
yuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.zip
ShaderCache/PipelineCache: Cache null shaders.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp17
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.h3
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp16
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.h3
4 files changed, 31 insertions, 8 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 6d2ff20f9..f63156b8d 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -448,7 +448,7 @@ Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
448 448
449 // Look up shader in the cache based on address 449 // Look up shader in the cache based on address
450 const auto cpu_addr{memory_manager.GpuToCpuAddress(address)}; 450 const auto cpu_addr{memory_manager.GpuToCpuAddress(address)};
451 Shader shader{cpu_addr ? TryGet(*cpu_addr) : nullptr}; 451 Shader shader{cpu_addr ? TryGet(*cpu_addr) : null_shader};
452 if (shader) { 452 if (shader) {
453 return last_shaders[static_cast<std::size_t>(program)] = shader; 453 return last_shaders[static_cast<std::size_t>(program)] = shader;
454 } 454 }
@@ -477,7 +477,12 @@ Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
477 const std::size_t size_in_bytes = code.size() * sizeof(u64); 477 const std::size_t size_in_bytes = code.size() * sizeof(u64);
478 shader = CachedShader::CreateFromCache(params, found->second, size_in_bytes); 478 shader = CachedShader::CreateFromCache(params, found->second, size_in_bytes);
479 } 479 }
480 Register(shader); 480
481 if (cpu_addr) {
482 Register(shader);
483 } else {
484 null_shader = shader;
485 }
481 486
482 return last_shaders[static_cast<std::size_t>(program)] = shader; 487 return last_shaders[static_cast<std::size_t>(program)] = shader;
483} 488}
@@ -486,7 +491,7 @@ Shader ShaderCacheOpenGL::GetComputeKernel(GPUVAddr code_addr) {
486 auto& memory_manager{system.GPU().MemoryManager()}; 491 auto& memory_manager{system.GPU().MemoryManager()};
487 const auto cpu_addr{memory_manager.GpuToCpuAddress(code_addr)}; 492 const auto cpu_addr{memory_manager.GpuToCpuAddress(code_addr)};
488 493
489 auto kernel = cpu_addr ? TryGet(*cpu_addr) : nullptr; 494 auto kernel = cpu_addr ? TryGet(*cpu_addr) : null_kernel;
490 if (kernel) { 495 if (kernel) {
491 return kernel; 496 return kernel;
492 } 497 }
@@ -507,7 +512,11 @@ Shader ShaderCacheOpenGL::GetComputeKernel(GPUVAddr code_addr) {
507 kernel = CachedShader::CreateFromCache(params, found->second, size_in_bytes); 512 kernel = CachedShader::CreateFromCache(params, found->second, size_in_bytes);
508 } 513 }
509 514
510 Register(kernel); 515 if (cpu_addr) {
516 Register(kernel);
517 } else {
518 null_kernel = kernel;
519 }
511 return kernel; 520 return kernel;
512} 521}
513 522
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h
index c836df5bd..91690b470 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_cache.h
@@ -125,6 +125,9 @@ private:
125 ShaderDiskCacheOpenGL disk_cache; 125 ShaderDiskCacheOpenGL disk_cache;
126 std::unordered_map<u64, PrecompiledShader> runtime_cache; 126 std::unordered_map<u64, PrecompiledShader> runtime_cache;
127 127
128 Shader null_shader{};
129 Shader null_kernel{};
130
128 std::array<Shader, Maxwell::MaxShaderProgram> last_shaders; 131 std::array<Shader, Maxwell::MaxShaderProgram> last_shaders;
129}; 132};
130 133
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 8fdc6400d..c4b3bc6c8 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -207,7 +207,7 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() {
207 const GPUVAddr program_addr{GetShaderAddress(system, program)}; 207 const GPUVAddr program_addr{GetShaderAddress(system, program)};
208 const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr); 208 const std::optional cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
209 ASSERT(cpu_addr); 209 ASSERT(cpu_addr);
210 auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr; 210 auto shader = cpu_addr ? TryGet(*cpu_addr) : null_shader;
211 if (!shader) { 211 if (!shader) {
212 const auto host_ptr{memory_manager.GetPointer(program_addr)}; 212 const auto host_ptr{memory_manager.GetPointer(program_addr)};
213 213
@@ -218,7 +218,11 @@ std::array<Shader, Maxwell::MaxShaderProgram> VKPipelineCache::GetShaders() {
218 218
219 shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr, 219 shader = std::make_shared<CachedShader>(system, stage, program_addr, *cpu_addr,
220 std::move(code), stage_offset); 220 std::move(code), stage_offset);
221 Register(shader); 221 if (cpu_addr) {
222 Register(shader);
223 } else {
224 null_shader = shader;
225 }
222 } 226 }
223 shaders[index] = std::move(shader); 227 shaders[index] = std::move(shader);
224 } 228 }
@@ -261,7 +265,7 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach
261 const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr); 265 const auto cpu_addr = memory_manager.GpuToCpuAddress(program_addr);
262 ASSERT(cpu_addr); 266 ASSERT(cpu_addr);
263 267
264 auto shader = cpu_addr ? TryGet(*cpu_addr) : nullptr; 268 auto shader = cpu_addr ? TryGet(*cpu_addr) : null_kernel;
265 if (!shader) { 269 if (!shader) {
266 // No shader found - create a new one 270 // No shader found - create a new one
267 const auto host_ptr = memory_manager.GetPointer(program_addr); 271 const auto host_ptr = memory_manager.GetPointer(program_addr);
@@ -271,7 +275,11 @@ VKComputePipeline& VKPipelineCache::GetComputePipeline(const ComputePipelineCach
271 shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute, 275 shader = std::make_shared<CachedShader>(system, Tegra::Engines::ShaderType::Compute,
272 program_addr, *cpu_addr, std::move(code), 276 program_addr, *cpu_addr, std::move(code),
273 kernel_main_offset); 277 kernel_main_offset);
274 Register(shader); 278 if (cpu_addr) {
279 Register(shader);
280 } else {
281 null_kernel = shader;
282 }
275 } 283 }
276 284
277 Specialization specialization; 285 Specialization specialization;
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
index 7ccdb7083..602a0a340 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h
@@ -182,6 +182,9 @@ private:
182 VKUpdateDescriptorQueue& update_descriptor_queue; 182 VKUpdateDescriptorQueue& update_descriptor_queue;
183 VKRenderPassCache& renderpass_cache; 183 VKRenderPassCache& renderpass_cache;
184 184
185 Shader null_shader{};
186 Shader null_kernel{};
187
185 std::array<Shader, Maxwell::MaxShaderProgram> last_shaders; 188 std::array<Shader, Maxwell::MaxShaderProgram> last_shaders;
186 189
187 GraphicsPipelineCacheKey last_graphics_key; 190 GraphicsPipelineCacheKey last_graphics_key;