summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-05-05 21:33:32 -0700
committerGravatar GitHub2017-05-05 21:33:32 -0700
commit2a01a03375401f4110a3a80de8ebf9bd48e46bc7 (patch)
tree91c3dd5e60e0d977406b8e39adc1732d09a9d1ce /src/video_core/renderer_opengl
parentCreate a random console_unique_id (#2668) (diff)
parentpica: shader_dirty if texture2 coord changed (diff)
downloadyuzu-2a01a03375401f4110a3a80de8ebf9bd48e46bc7.tar.gz
yuzu-2a01a03375401f4110a3a80de8ebf9bd48e46bc7.tar.xz
yuzu-2a01a03375401f4110a3a80de8ebf9bd48e46bc7.zip
Merge pull request #2686 from wwylele/tex-coord-reg
pica: use correct coordinates for texture 2
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp17
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.h1
3 files changed, 19 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index a47307099..12ac9bbd9 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -402,6 +402,10 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
402 SyncLogicOp(); 402 SyncLogicOp();
403 break; 403 break;
404 404
405 case PICA_REG_INDEX(texturing.main_config):
406 shader_dirty = true;
407 break;
408
405 // Texture 0 type 409 // Texture 0 type
406 case PICA_REG_INDEX(texturing.texture0.type): 410 case PICA_REG_INDEX(texturing.texture0.type):
407 shader_dirty = true; 411 shader_dirty = true;
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index 0f889b172..7b44dade8 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -40,6 +40,8 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
40 40
41 state.texture0_type = regs.texturing.texture0.type; 41 state.texture0_type = regs.texturing.texture0.type;
42 42
43 state.texture2_use_coord1 = regs.texturing.main_config.texture2_use_coord1 != 0;
44
43 // Copy relevant tev stages fields. 45 // Copy relevant tev stages fields.
44 // We don't sync const_color here because of the high variance, it is a 46 // We don't sync const_color here because of the high variance, it is a
45 // shader uniform instead. 47 // shader uniform instead.
@@ -126,6 +128,15 @@ static bool IsPassThroughTevStage(const TevStageConfig& stage) {
126 stage.GetColorMultiplier() == 1 && stage.GetAlphaMultiplier() == 1); 128 stage.GetColorMultiplier() == 1 && stage.GetAlphaMultiplier() == 1);
127} 129}
128 130
131static std::string TexCoord(const PicaShaderConfig& config, int texture_unit) {
132 if (texture_unit == 2 && config.state.texture2_use_coord1) {
133 return "texcoord[1]";
134 }
135 // TODO: if texture unit 3 (procedural texture) implementation also uses this function,
136 // config.state.texture3_coordinates should be repected here.
137 return "texcoord[" + std::to_string(texture_unit) + "]";
138}
139
129/// Writes the specified TEV stage source component(s) 140/// Writes the specified TEV stage source component(s)
130static void AppendSource(std::string& out, const PicaShaderConfig& config, 141static void AppendSource(std::string& out, const PicaShaderConfig& config,
131 TevStageConfig::Source source, const std::string& index_name) { 142 TevStageConfig::Source source, const std::string& index_name) {
@@ -162,7 +173,7 @@ static void AppendSource(std::string& out, const PicaShaderConfig& config,
162 out += "texture(tex[1], texcoord[1])"; 173 out += "texture(tex[1], texcoord[1])";
163 break; 174 break;
164 case Source::Texture2: 175 case Source::Texture2:
165 out += "texture(tex[2], texcoord[2])"; 176 out += "texture(tex[2], " + TexCoord(config, 2) + ")";
166 break; 177 break;
167 case Source::PreviousBuffer: 178 case Source::PreviousBuffer:
168 out += "combiner_buffer"; 179 out += "combiner_buffer";
@@ -473,8 +484,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
473 // Bump mapping is enabled using a normal map, read perturbation vector from the selected 484 // Bump mapping is enabled using a normal map, read perturbation vector from the selected
474 // texture 485 // texture
475 std::string bump_selector = std::to_string(lighting.bump_selector); 486 std::string bump_selector = std::to_string(lighting.bump_selector);
476 out += "vec3 surface_normal = 2.0 * texture(tex[" + bump_selector + "], texcoord[" + 487 out += "vec3 surface_normal = 2.0 * texture(tex[" + bump_selector + "], " +
477 bump_selector + "]).rgb - 1.0;\n"; 488 TexCoord(config, lighting.bump_selector) + ").rgb - 1.0;\n";
478 489
479 // Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher 490 // Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher
480 // precision result 491 // precision result
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.h b/src/video_core/renderer_opengl/gl_shader_gen.h
index 921d976a1..3fb046b76 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.h
+++ b/src/video_core/renderer_opengl/gl_shader_gen.h
@@ -79,6 +79,7 @@ union PicaShaderConfig {
79 Pica::FramebufferRegs::CompareFunc alpha_test_func; 79 Pica::FramebufferRegs::CompareFunc alpha_test_func;
80 Pica::RasterizerRegs::ScissorMode scissor_test_mode; 80 Pica::RasterizerRegs::ScissorMode scissor_test_mode;
81 Pica::TexturingRegs::TextureConfig::TextureType texture0_type; 81 Pica::TexturingRegs::TextureConfig::TextureType texture0_type;
82 bool texture2_use_coord1;
82 std::array<TevStageConfigRaw, 6> tev_stages; 83 std::array<TevStageConfigRaw, 6> tev_stages;
83 u8 combiner_buffer_input; 84 u8 combiner_buffer_input;
84 85