diff options
| author | 2015-10-05 20:52:04 -0400 | |
|---|---|---|
| committer | 2015-10-21 21:53:05 -0400 | |
| commit | 3c057bd3d80b049720b11d0b44391c18870c28e8 (patch) | |
| tree | a5c141dc0b3ff15d30e3bbd962d08826bbd26b42 | |
| parent | gl_shader_util: Use vec3 constants for AppendColorCombiner. (diff) | |
| download | yuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.tar.gz yuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.tar.xz yuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.zip | |
gl_rasterizer: Move logic for creating ShaderCacheKey to a static function.
| -rw-r--r-- | src/video_core/pica.h | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 45 |
3 files changed, 50 insertions, 22 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h index 18fdc8c85..2f1b2dec4 100644 --- a/src/video_core/pica.h +++ b/src/video_core/pica.h | |||
| @@ -317,7 +317,7 @@ struct Regs { | |||
| 317 | }; | 317 | }; |
| 318 | 318 | ||
| 319 | union { | 319 | union { |
| 320 | u32 source_raw; | 320 | u32 sources_raw; |
| 321 | BitField< 0, 4, Source> color_source1; | 321 | BitField< 0, 4, Source> color_source1; |
| 322 | BitField< 4, 4, Source> color_source2; | 322 | BitField< 4, 4, Source> color_source2; |
| 323 | BitField< 8, 4, Source> color_source3; | 323 | BitField< 8, 4, Source> color_source3; |
| @@ -327,7 +327,7 @@ struct Regs { | |||
| 327 | }; | 327 | }; |
| 328 | 328 | ||
| 329 | union { | 329 | union { |
| 330 | u32 modifier_raw; | 330 | u32 modifiers_raw; |
| 331 | BitField< 0, 4, ColorModifier> color_modifier1; | 331 | BitField< 0, 4, ColorModifier> color_modifier1; |
| 332 | BitField< 4, 4, ColorModifier> color_modifier2; | 332 | BitField< 4, 4, ColorModifier> color_modifier2; |
| 333 | BitField< 8, 4, ColorModifier> color_modifier3; | 333 | BitField< 8, 4, ColorModifier> color_modifier3; |
| @@ -337,7 +337,7 @@ struct Regs { | |||
| 337 | }; | 337 | }; |
| 338 | 338 | ||
| 339 | union { | 339 | union { |
| 340 | u32 op_raw; | 340 | u32 ops_raw; |
| 341 | BitField< 0, 4, Operation> color_op; | 341 | BitField< 0, 4, Operation> color_op; |
| 342 | BitField<16, 4, Operation> alpha_op; | 342 | BitField<16, 4, Operation> alpha_op; |
| 343 | }; | 343 | }; |
| @@ -351,7 +351,7 @@ struct Regs { | |||
| 351 | }; | 351 | }; |
| 352 | 352 | ||
| 353 | union { | 353 | union { |
| 354 | u32 scale_raw; | 354 | u32 scales_raw; |
| 355 | BitField< 0, 2, u32> color_scale; | 355 | BitField< 0, 2, u32> color_scale; |
| 356 | BitField<16, 2, u32> alpha_scale; | 356 | BitField<16, 2, u32> alpha_scale; |
| 357 | }; | 357 | }; |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index a69e09188..01b9c91c6 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -145,21 +145,7 @@ extern std::string GenerateFragmentShader(const ShaderCacheKey& config); | |||
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | void RasterizerOpenGL::RegenerateShaders() { | 147 | void RasterizerOpenGL::RegenerateShaders() { |
| 148 | const auto& regs = Pica::g_state.regs; | 148 | ShaderCacheKey config = ShaderCacheKey::CurrentShaderConfig(); |
| 149 | |||
| 150 | ShaderCacheKey config; | ||
| 151 | config.alpha_test_func = regs.output_merger.alpha_test.enable ? | ||
| 152 | regs.output_merger.alpha_test.func.Value() : Pica::Regs::CompareFunc::Always; | ||
| 153 | config.tev_stages = regs.GetTevStages(); | ||
| 154 | for (auto& tev : config.tev_stages) { | ||
| 155 | tev.const_r = 0; | ||
| 156 | tev.const_g = 0; | ||
| 157 | tev.const_b = 0; | ||
| 158 | tev.const_a = 0; | ||
| 159 | } | ||
| 160 | config.combiner_buffer_input = | ||
| 161 | regs.tev_combiner_buffer_input.update_mask_rgb.Value() | | ||
| 162 | regs.tev_combiner_buffer_input.update_mask_a.Value() << 4; | ||
| 163 | 149 | ||
| 164 | auto cached_shader = shader_cache.find(config); | 150 | auto cached_shader = shader_cache.find(config); |
| 165 | if (cached_shader != shader_cache.end()) { | 151 | if (cached_shader != shader_cache.end()) { |
| @@ -192,10 +178,9 @@ void RasterizerOpenGL::RegenerateShaders() { | |||
| 192 | } | 178 | } |
| 193 | } | 179 | } |
| 194 | 180 | ||
| 195 | |||
| 196 | // Sync alpha reference | 181 | // Sync alpha reference |
| 197 | if (current_shader->uniform_alphatest_ref != -1) | 182 | if (current_shader->uniform_alphatest_ref != -1) |
| 198 | glUniform1i(current_shader->uniform_alphatest_ref, regs.output_merger.alpha_test.ref); | 183 | glUniform1i(current_shader->uniform_alphatest_ref, Pica::g_state.regs.output_merger.alpha_test.ref); |
| 199 | 184 | ||
| 200 | // Sync combiner buffer color | 185 | // Sync combiner buffer color |
| 201 | if (current_shader->uniform_tev_combiner_buffer_color != -1) { | 186 | if (current_shader->uniform_tev_combiner_buffer_color != -1) { |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 19e8db69a..5bc4a319f 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | 11 | ||
| 12 | #include "video_core/pica.h" | ||
| 12 | #include "video_core/hwrasterizer_base.h" | 13 | #include "video_core/hwrasterizer_base.h" |
| 13 | #include "video_core/renderer_opengl/gl_rasterizer_cache.h" | 14 | #include "video_core/renderer_opengl/gl_rasterizer_cache.h" |
| 14 | #include "video_core/renderer_opengl/gl_state.h" | 15 | #include "video_core/renderer_opengl/gl_state.h" |
| @@ -37,7 +38,7 @@ struct ShaderCacheKey { | |||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | Regs::CompareFunc alpha_test_func; | 40 | Regs::CompareFunc alpha_test_func; |
| 40 | std::array<Regs::TevStageConfig, 6> tev_stages; | 41 | std::array<Regs::TevStageConfig, 6> tev_stages = {}; |
| 41 | u8 combiner_buffer_input; | 42 | u8 combiner_buffer_input; |
| 42 | 43 | ||
| 43 | bool TevStageUpdatesCombinerBufferColor(unsigned stage_index) const { | 44 | bool TevStageUpdatesCombinerBufferColor(unsigned stage_index) const { |
| @@ -47,6 +48,48 @@ struct ShaderCacheKey { | |||
| 47 | bool TevStageUpdatesCombinerBufferAlpha(unsigned stage_index) const { | 48 | bool TevStageUpdatesCombinerBufferAlpha(unsigned stage_index) const { |
| 48 | return (stage_index < 4) && ((combiner_buffer_input >> 4) & (1 << stage_index)); | 49 | return (stage_index < 4) && ((combiner_buffer_input >> 4) & (1 << stage_index)); |
| 49 | } | 50 | } |
| 51 | |||
| 52 | static ShaderCacheKey CurrentShaderConfig() { | ||
| 53 | const auto& regs = Pica::g_state.regs; | ||
| 54 | ShaderCacheKey config; | ||
| 55 | |||
| 56 | config.alpha_test_func = regs.output_merger.alpha_test.enable ? | ||
| 57 | regs.output_merger.alpha_test.func.Value() : Pica::Regs::CompareFunc::Always; | ||
| 58 | |||
| 59 | config.tev_stages[0].source_raw = regs.tev_stage0.source_raw; | ||
| 60 | config.tev_stages[1].source_raw = regs.tev_stage1.source_raw; | ||
| 61 | config.tev_stages[2].source_raw = regs.tev_stage2.source_raw; | ||
| 62 | config.tev_stages[3].source_raw = regs.tev_stage3.source_raw; | ||
| 63 | config.tev_stages[4].source_raw = regs.tev_stage4.source_raw; | ||
| 64 | config.tev_stages[5].source_raw = regs.tev_stage5.source_raw; | ||
| 65 | |||
| 66 | config.tev_stages[0].modifier_raw = regs.tev_stage0.modifier_raw; | ||
| 67 | config.tev_stages[1].modifier_raw = regs.tev_stage1.modifier_raw; | ||
| 68 | config.tev_stages[2].modifier_raw = regs.tev_stage2.modifier_raw; | ||
| 69 | config.tev_stages[3].modifier_raw = regs.tev_stage3.modifier_raw; | ||
| 70 | config.tev_stages[4].modifier_raw = regs.tev_stage4.modifier_raw; | ||
| 71 | config.tev_stages[5].modifier_raw = regs.tev_stage5.modifier_raw; | ||
| 72 | |||
| 73 | config.tev_stages[0].op_raw = regs.tev_stage0.op_raw; | ||
| 74 | config.tev_stages[1].op_raw = regs.tev_stage1.op_raw; | ||
| 75 | config.tev_stages[2].op_raw = regs.tev_stage2.op_raw; | ||
| 76 | config.tev_stages[3].op_raw = regs.tev_stage3.op_raw; | ||
| 77 | config.tev_stages[4].op_raw = regs.tev_stage4.op_raw; | ||
| 78 | config.tev_stages[5].op_raw = regs.tev_stage5.op_raw; | ||
| 79 | |||
| 80 | config.tev_stages[0].scale_raw = regs.tev_stage0.scale_raw; | ||
| 81 | config.tev_stages[1].scale_raw = regs.tev_stage1.scale_raw; | ||
| 82 | config.tev_stages[2].scale_raw = regs.tev_stage2.scale_raw; | ||
| 83 | config.tev_stages[3].scale_raw = regs.tev_stage3.scale_raw; | ||
| 84 | config.tev_stages[4].scale_raw = regs.tev_stage4.scale_raw; | ||
| 85 | config.tev_stages[5].scale_raw = regs.tev_stage5.scale_raw; | ||
| 86 | |||
| 87 | config.combiner_buffer_input = | ||
| 88 | regs.tev_combiner_buffer_input.update_mask_rgb.Value() | | ||
| 89 | regs.tev_combiner_buffer_input.update_mask_a.Value() << 4; | ||
| 90 | |||
| 91 | return config; | ||
| 92 | } | ||
| 50 | }; | 93 | }; |
| 51 | 94 | ||
| 52 | namespace std { | 95 | namespace std { |