summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
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/video_core/renderer_vulkan
parentAddress Feedback. (diff)
downloadyuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.tar.gz
yuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.tar.xz
yuzu-644588fd883fb45bf6d1cb7895e98ec65120c7f1.zip
ShaderCache/PipelineCache: Cache null shaders.
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp16
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.h3
2 files changed, 15 insertions, 4 deletions
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;