summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2015-10-05 20:52:04 -0400
committerGravatar bunnei2015-10-21 21:53:05 -0400
commit3c057bd3d80b049720b11d0b44391c18870c28e8 (patch)
treea5c141dc0b3ff15d30e3bbd962d08826bbd26b42 /src
parentgl_shader_util: Use vec3 constants for AppendColorCombiner. (diff)
downloadyuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.tar.gz
yuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.tar.xz
yuzu-3c057bd3d80b049720b11d0b44391c18870c28e8.zip
gl_rasterizer: Move logic for creating ShaderCacheKey to a static function.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/pica.h8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp19
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h45
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
147void RasterizerOpenGL::RegenerateShaders() { 147void 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
52namespace std { 95namespace std {