summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar FernandoS272021-05-01 14:56:25 +0200
committerGravatar ameerj2021-07-22 21:51:29 -0400
commitc49d56c931471f21d475a31272164fbfae5ea64a (patch)
tree71642406f4df7963ea78c55acf622bdf5b85a595 /src/video_core/renderer_vulkan
parentshader: Implement VertexA stage (diff)
downloadyuzu-c49d56c931471f21d475a31272164fbfae5ea64a.tar.gz
yuzu-c49d56c931471f21d475a31272164fbfae5ea64a.tar.xz
yuzu-c49d56c931471f21d475a31272164fbfae5ea64a.zip
shader: Address feedback
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 638475251..634bbb450 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -288,32 +288,32 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
288 LOG_INFO(Render_Vulkan, "0x{:016x}", key.Hash()); 288 LOG_INFO(Render_Vulkan, "0x{:016x}", key.Hash());
289 size_t env_index{0}; 289 size_t env_index{0};
290 std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs; 290 std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs;
291 bool uses_vertex_a{}; 291 const bool uses_vertex_a{key.unique_hashes[0] != 0};
292 std::size_t start_value_processing{}; 292 const bool uses_vertex_b{key.unique_hashes[1] != 0};
293 for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) { 293 for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
294 if (key.unique_hashes[index] == 0) { 294 if (key.unique_hashes[index] == 0) {
295 continue; 295 continue;
296 } 296 }
297 uses_vertex_a |= index == 0;
298 Shader::Environment& env{*envs[env_index]}; 297 Shader::Environment& env{*envs[env_index]};
299 ++env_index; 298 ++env_index;
300 299
301 const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))}; 300 const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))};
302 Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0); 301 Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
303 if (!uses_vertex_a || index != 1) { 302 if (!uses_vertex_a || index != 1) {
303 // Normal path
304 programs[index] = TranslateProgram(pools.inst, pools.block, env, cfg); 304 programs[index] = TranslateProgram(pools.inst, pools.block, env, cfg);
305 continue; 305 } else {
306 // VertexB path when VertexA is present.
307 Shader::IR::Program& program_va{programs[0]};
308 Shader::IR::Program program_vb{TranslateProgram(pools.inst, pools.block, env, cfg)};
309 programs[index] = MergeDualVertexPrograms(program_va, program_vb, env);
306 } 310 }
307 Shader::IR::Program& program_va{programs[0]};
308 Shader::IR::Program program_vb{TranslateProgram(pools.inst, pools.block, env, cfg)};
309 programs[index] = MergeDualVertexPrograms(program_va, program_vb, env);
310 start_value_processing = 1;
311 } 311 }
312 std::array<const Shader::Info*, Maxwell::MaxShaderStage> infos{}; 312 std::array<const Shader::Info*, Maxwell::MaxShaderStage> infos{};
313 std::array<vk::ShaderModule, Maxwell::MaxShaderStage> modules; 313 std::array<vk::ShaderModule, Maxwell::MaxShaderStage> modules;
314 314
315 u32 binding{0}; 315 u32 binding{0};
316 for (size_t index = start_value_processing; index < Maxwell::MaxShaderProgram; ++index) { 316 for (size_t index = uses_vertex_a && uses_vertex_b ? 1 : 0; index < Maxwell::MaxShaderProgram; ++index) {
317 if (key.unique_hashes[index] == 0) { 317 if (key.unique_hashes[index] == 0) {
318 continue; 318 continue;
319 } 319 }