Seems we need high precision for fog on PowerVR. #4287 might be fixed by this.

This commit is contained in:
Henrik Rydgard 2013-10-22 19:54:43 +02:00
parent 1595ac3386
commit 5d47aabb08
2 changed files with 11 additions and 10 deletions

View file

@ -195,7 +195,6 @@ void ComputeFragmentShaderID(FragmentShaderID *id) {
} }
// Missing: Z depth range // Missing: Z depth range
// Also, logic ops etc, of course. Urgh.
void GenerateFragmentShader(char *buffer) { void GenerateFragmentShader(char *buffer) {
char *p = buffer; char *p = buffer;
@ -235,7 +234,7 @@ void GenerateFragmentShader(char *buffer) {
if (enableAlphaTest || enableColorTest) { if (enableAlphaTest || enableColorTest) {
WRITE(p, "uniform vec4 u_alphacolorref;\n"); WRITE(p, "uniform vec4 u_alphacolorref;\n");
} }
if (gstate.isTextureMapEnabled()) if (gstate.isTextureMapEnabled() && gstate.getTextureFunction() == GE_TEXFUNC_BLEND)
WRITE(p, "uniform lowp vec3 u_texenv;\n"); WRITE(p, "uniform lowp vec3 u_texenv;\n");
WRITE(p, "varying lowp vec4 v_color0;\n"); WRITE(p, "varying lowp vec4 v_color0;\n");
@ -243,7 +242,7 @@ void GenerateFragmentShader(char *buffer) {
WRITE(p, "varying lowp vec3 v_color1;\n"); WRITE(p, "varying lowp vec3 v_color1;\n");
if (enableFog) { if (enableFog) {
WRITE(p, "uniform lowp vec3 u_fogcolor;\n"); WRITE(p, "uniform lowp vec3 u_fogcolor;\n");
WRITE(p, "varying mediump float v_fogdepth;\n"); WRITE(p, "varying highp float v_fogdepth;\n");
} }
if (doTexture) if (doTexture)
{ {
@ -356,9 +355,9 @@ void GenerateFragmentShader(char *buffer) {
u32 colorTestMask = gstate.getColorTestMask(); u32 colorTestMask = gstate.getColorTestMask();
if (colorTestFuncs[colorTestFunc][0] != '#') { if (colorTestFuncs[colorTestFunc][0] != '#') {
if (gl_extensions.gpuVendor == GPU_VENDOR_POWERVR) if (gl_extensions.gpuVendor == GPU_VENDOR_POWERVR)
WRITE(p, "if (roundTo255thv(v.rgb) %s u_alphacolorref.rgb) discard;\n", colorTestFuncs[colorTestFunc]); WRITE(p, " if (roundTo255thv(v.rgb) %s u_alphacolorref.rgb) discard;\n", colorTestFuncs[colorTestFunc]);
else else
WRITE(p, "if (roundAndScaleTo255v(v.rgb) %s u_alphacolorref.rgb) discard;\n", colorTestFuncs[colorTestFunc]); WRITE(p, " if (roundAndScaleTo255v(v.rgb) %s u_alphacolorref.rgb) discard;\n", colorTestFuncs[colorTestFunc]);
} }
} }

View file

@ -143,10 +143,12 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
// Remove lowp/mediump in non-mobile implementations // Remove lowp/mediump in non-mobile implementations
WRITE(p, "#define lowp\n"); WRITE(p, "#define lowp\n");
WRITE(p, "#define mediump\n"); WRITE(p, "#define mediump\n");
WRITE(p, "#define highp\n");
#else #else
// Need to remove lowp/mediump for Mac // Need to remove lowp/mediump for Mac
WRITE(p, "#define lowp\n"); WRITE(p, "#define lowp\n");
WRITE(p, "#define mediump\n"); WRITE(p, "#define mediump\n");
WRITE(p, "#define highp\n");
#endif #endif
int lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled(); int lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled();
@ -203,6 +205,8 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
// Add all the uniforms we'll need to transform properly. // Add all the uniforms we'll need to transform properly.
} }
bool prescale = g_Config.bPrescaleUV && !throughmode && gstate.getTextureFunction() == 0;
if (useHWTransform) { if (useHWTransform) {
// When transforming by hardware, we need a great deal more uniforms... // When transforming by hardware, we need a great deal more uniforms...
WRITE(p, "uniform mat4 u_world;\n"); WRITE(p, "uniform mat4 u_world;\n");
@ -219,7 +223,7 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
} }
#endif #endif
} }
if (doTexture) { if (doTexture && (!prescale || gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP)) {
WRITE(p, "uniform vec4 u_uvscaleoffset;\n"); WRITE(p, "uniform vec4 u_uvscaleoffset;\n");
} }
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
@ -259,7 +263,7 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
WRITE(p, "uniform lowp vec4 u_matambientalpha;\n"); // matambient + matalpha WRITE(p, "uniform lowp vec4 u_matambientalpha;\n"); // matambient + matalpha
if (enableFog) { if (enableFog) {
WRITE(p, "uniform mediump vec2 u_fogcoef;\n"); WRITE(p, "uniform highp vec2 u_fogcoef;\n");
} }
WRITE(p, "varying lowp vec4 v_color0;\n"); WRITE(p, "varying lowp vec4 v_color0;\n");
@ -270,7 +274,7 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
else else
WRITE(p, "varying mediump vec2 v_texcoord;\n"); WRITE(p, "varying mediump vec2 v_texcoord;\n");
} }
if (enableFog) WRITE(p, "varying mediump float v_fogdepth;\n"); if (enableFog) WRITE(p, "varying highp float v_fogdepth;\n");
WRITE(p, "void main() {\n"); WRITE(p, "void main() {\n");
@ -518,8 +522,6 @@ void GenerateVertexShader(int prim, u32 vertType, char *buffer, bool useHWTransf
// Step 3: UV generation // Step 3: UV generation
if (doTexture) { if (doTexture) {
bool prescale = g_Config.bPrescaleUV && !throughmode && gstate.getTextureFunction() == 0;
switch (gstate.getUVGenMode()) { switch (gstate.getUVGenMode()) {
case GE_TEXMAP_TEXTURE_COORDS: // 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. case GE_TEXMAP_UNKNOWN: // Not sure what this is, but Riviera uses it. Treating as coords works.