From 61cf550d0c951d02db7b347ffcee82e34a3e5160 Mon Sep 17 00:00:00 2001 From: GPUCode <47210458+GPUCode@users.noreply.github.com> Date: Sun, 27 Aug 2023 01:48:45 +0300 Subject: [PATCH] video_core: Avoid setting alpha tev with Dot3_RGBA8 color op (#6907) * Further reduces unnecessary shader regenerations --- src/video_core/renderer_opengl/gl_shader_gen.cpp | 10 ++++++++-- src/video_core/renderer_vulkan/vk_shader_gen.cpp | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index d8a1ed1145..6f860fc248 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp @@ -99,6 +99,11 @@ PicaFSConfig PicaFSConfig::BuildFromRegs(const Pica::Regs& regs, bool use_normal state.tev_stages[i].modifiers_raw = tev_stage.modifiers_raw; state.tev_stages[i].ops_raw = tev_stage.ops_raw; state.tev_stages[i].scales_raw = tev_stage.scales_raw; + if (tev_stage.color_op == TevStageConfig::Operation::Dot3_RGBA) { + state.tev_stages[i].sources_raw &= 0xFFF; + state.tev_stages[i].modifiers_raw &= 0xFFF; + state.tev_stages[i].ops_raw &= 0xF; + } } state.fog_mode = regs.texturing.fog_mode; @@ -226,8 +231,9 @@ PicaFSConfig PicaFSConfig::BuildFromRegs(const Pica::Regs& regs, bool use_normal state.shadow_rendering = regs.framebuffer.output_merger.fragment_operation_mode == FramebufferRegs::FragmentOperationMode::Shadow; - - state.shadow_texture_orthographic = regs.texturing.shadow.orthographic != 0; + if (state.shadow_rendering) { + state.shadow_texture_orthographic = regs.texturing.shadow.orthographic != 0; + } state.use_custom_normal_map = use_normal; diff --git a/src/video_core/renderer_vulkan/vk_shader_gen.cpp b/src/video_core/renderer_vulkan/vk_shader_gen.cpp index 6f1dc412b3..5beeee0259 100644 --- a/src/video_core/renderer_vulkan/vk_shader_gen.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_gen.cpp @@ -102,6 +102,11 @@ PicaFSConfig::PicaFSConfig(const Pica::Regs& regs, const Instance& instance) { state.tev_stages[i].modifiers_raw = tev_stage.modifiers_raw; state.tev_stages[i].ops_raw = tev_stage.ops_raw; state.tev_stages[i].scales_raw = tev_stage.scales_raw; + if (tev_stage.color_op == TevStageConfig::Operation::Dot3_RGBA) { + state.tev_stages[i].sources_raw &= 0xFFF; + state.tev_stages[i].modifiers_raw &= 0xFFF; + state.tev_stages[i].ops_raw &= 0xF; + } } state.fog_mode.Assign(regs.texturing.fog_mode); @@ -230,8 +235,9 @@ PicaFSConfig::PicaFSConfig(const Pica::Regs& regs, const Instance& instance) { state.shadow_rendering.Assign(regs.framebuffer.output_merger.fragment_operation_mode == FramebufferRegs::FragmentOperationMode::Shadow); - - state.shadow_texture_orthographic.Assign(regs.texturing.shadow.orthographic != 0); + if (state.shadow_rendering) { + state.shadow_texture_orthographic.Assign(regs.texturing.shadow.orthographic != 0); + } } void PicaShaderConfigCommon::Init(const Pica::RasterizerRegs& rasterizer,