diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index cf5684af1d..a16b636147 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -117,7 +117,7 @@ void ComputeFragmentShaderID(FragmentShaderID *id) { bool enableColorDoubling = gstate.isColorDoublingEnabled(); // This isn't really correct, but it's a hack to get doubled blend modes to work more correctly. bool enableAlphaDoubling = CanDoubleSrcBlendMode(); - bool doTextureProjection = gstate.getUVGenMode() == 1; + bool doTextureProjection = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; bool doTextureAlpha = (gstate.texfunc & 0x100) != 0; // All texfuncs except replace are the same for RGB as for RGBA with full alpha. @@ -164,7 +164,7 @@ void GenerateFragmentShader(char *buffer) { bool enableColorDoubling = gstate.isColorDoublingEnabled(); // This isn't really correct, but it's a hack to get doubled blend modes to work more correctly. bool enableAlphaDoubling = CanDoubleSrcBlendMode(); - bool doTextureProjection = gstate.getUVGenMode() == 1; + bool doTextureProjection = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; bool doTextureAlpha = (gstate.texfunc & 0x100) != 0; if (gstate_c.textureFullAlpha && gstate.getTextureFunction() != GE_TEXFUNC_REPLACE) diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index b21bf1b02c..37b5b7d0a8 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -335,7 +335,8 @@ void LinkedShader::updateUniforms() { int h = gstate.getTextureHeight(0); float widthFactor = (float)w / (float)gstate_c.curTextureWidth; float heightFactor = (float)h / (float)gstate_c.curTextureHeight; - if (gstate.getUVGenMode() == 0) { + // Not sure what GE_TEXMAP_UNKNOWN is, but seen in Riviera. Treating the same as GE_TEXMAP_TEXTURE_COORDS works. + if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_COORDS || gstate.getUVGenMode() == GE_TEXMAP_UNKNOWN) { static const float rescale[4] = {1.0f, 2*127.5f/128.f, 2*32767.5f/32768.f, 1.0f}; float factor = rescale[(gstate.vertType & GE_VTYPE_TC_MASK) >> GE_VTYPE_TC_SHIFT]; uvscaleoff[0] = gstate_c.uv.uScale * factor * widthFactor; diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 4a111ddd5c..9b05431ddb 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -859,7 +859,7 @@ void TransformDrawEngine::SoftwareTransformAndDraw( // these spam the gDebugger log. const int vertexSize = sizeof(transformed[0]); - bool doTextureProjection = gstate.getUVGenMode() == 1; + bool doTextureProjection = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; glBindBuffer(GL_ARRAY_BUFFER, 0); glVertexAttribPointer(program->a_position, 4, GL_FLOAT, GL_FALSE, vertexSize, drawBuffer); if (program->a_texcoord != -1) glVertexAttribPointer(program->a_texcoord, doTextureProjection ? 3 : 2, GL_FLOAT, GL_FALSE, vertexSize, ((uint8_t*)drawBuffer) + 4 * 4); @@ -909,7 +909,7 @@ int TransformDrawEngine::EstimatePerVertexCost() { if (gstate.isLightChanEnabled(i)) cost += 10; } - if (gstate.getUVGenMode() != 0) { + if (gstate.getUVGenMode() != GE_TEXMAP_TEXTURE_COORDS) { cost += 20; } if (dec_ && dec_->morphcount > 1) { diff --git a/GPU/GLES/VertexShaderGenerator.cpp b/GPU/GLES/VertexShaderGenerator.cpp index cd35d4da3c..f4dace2e4b 100644 --- a/GPU/GLES/VertexShaderGenerator.cpp +++ b/GPU/GLES/VertexShaderGenerator.cpp @@ -56,7 +56,7 @@ int TranslateNumBones(int bones) { void ComputeVertexShaderID(VertexShaderID *id, int prim, bool useHWTransform) { const u32 vertType = gstate.vertType; int doTexture = gstate.isTextureMapEnabled() && !gstate.isModeClear(); - bool doTextureProjection = gstate.getUVGenMode() == 1; + bool doTextureProjection = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; bool hasColor = (vertType & GE_VTYPE_COL_MASK) != 0; bool hasNormal = (vertType & GE_VTYPE_NRM_MASK) != 0; @@ -83,9 +83,9 @@ void ComputeVertexShaderID(VertexShaderID *id, int prim, bool useHWTransform) { id->d[0] |= gstate.getUVGenMode() << 16; // The next bits are used differently depending on UVgen mode - if (gstate.getUVGenMode() == 1) { + if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX) { id->d[0] |= gstate.getUVProjMode() << 18; - } else if (gstate.getUVGenMode() == 2) { + } else if (gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP) { id->d[0] |= gstate.getUVLS0() << 18; id->d[0] |= gstate.getUVLS1() << 20; } @@ -96,7 +96,7 @@ void ComputeVertexShaderID(VertexShaderID *id, int prim, bool useHWTransform) { // Okay, d[1] coming up. ============== - if (gstate.isLightingEnabled() || gstate.getUVGenMode() == 2) { + if (gstate.isLightingEnabled() || gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP) { // Light bits for (int i = 0; i < 4; i++) { id->d[1] |= gstate.getLightComputation(i) << (i * 4); @@ -159,12 +159,12 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { bool enableFog = gstate.isFogEnabled() && !gstate.isModeThrough() && !gstate.isModeClear(); bool throughmode = (vertType & GE_VTYPE_THROUGH_MASK) != 0; bool flipV = gstate_c.flipTexture; - bool doTextureProjection = gstate.getUVGenMode() == 1; + bool doTextureProjection = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; DoLightComputation doLight[4] = {LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF}; if (useHWTransform) { - int shadeLight0 = gstate.getUVGenMode() == 2 ? gstate.getUVLS0() : -1; - int shadeLight1 = gstate.getUVGenMode() == 2 ? gstate.getUVLS1() : -1; + int shadeLight0 = gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP ? gstate.getUVLS0() : -1; + int shadeLight1 = gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP ? gstate.getUVLS1() : -1; for (int i = 0; i < 4; i++) { if (i == shadeLight0 || i == shadeLight1) doLight[i] = LIGHT_SHADE; @@ -208,7 +208,7 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { // When transforming by hardware, we need a great deal more uniforms... WRITE(p, "uniform mat4 u_world;\n"); WRITE(p, "uniform mat4 u_view;\n"); - if (gstate.getUVGenMode() == 1) + if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX) WRITE(p, "uniform mediump mat4 u_texmtx;\n"); if (gstate.getWeightMask() != GE_VTYPE_WEIGHT_NONE) { int numBones = TranslateNumBones(gstate.getNumBoneWeights()); @@ -518,7 +518,8 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { bool prescale = g_Config.bPrescaleUV && !throughmode && gstate.getTextureFunction() == 0; switch (gstate.getUVGenMode()) { - case 0: // Scale-offset. Easy. + case GE_TEXMAP_TEXTURE_COORDS: // Scale-offset. Easy. + case GE_TEXMAP_UNKNOWN: // Not sure what this is, but Riviera uses it. Treating as coords works. if (prescale) { WRITE(p, " v_texcoord = a_texcoord;\n"); } else { @@ -526,7 +527,7 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { } break; - case 1: // Projection mapping. + case GE_TEXMAP_TEXTURE_MATRIX: // Projection mapping. { std::string temp_tc; switch (gstate.getUVProjMode()) { @@ -558,7 +559,7 @@ void GenerateVertexShader(int prim, char *buffer, bool useHWTransform) { // Transform by texture matrix. XYZ as we are doing projection mapping. break; - case 2: // Shade mapping - use dots from light sources. + case GE_TEXMAP_ENVIRONMENT_MAP: // Shade mapping - use dots from light sources. WRITE(p, " v_texcoord = u_uvscaleoffset.xy * vec2(1.0 + dot(normalize(u_lightpos%i), worldnormal), 1.0 - dot(normalize(u_lightpos%i), worldnormal)) * 0.5;\n", gstate.getUVLS0(), gstate.getUVLS1()); break; diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index c7741663de..62a9137d12 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -130,7 +130,7 @@ static inline void GetTexelCoordinates(int level, float s, float t, unsigned int static inline void GetTextureCoordinates(const VertexData& v0, const VertexData& v1, const VertexData& v2, int w0, int w1, int w2, float& s, float& t) { - if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_COORDS || gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP) { + if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_COORDS || gstate.getUVGenMode() == GE_TEXMAP_UNKNOWN || gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP) { // TODO: What happens if vertex has no texture coordinates? // Note that for environment mapping, texture coordinates have been calculated during lighting float q0 = 1.f / v0.clippos.w;