diff options
Diffstat (limited to 'src')
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; |