diff --git a/Source/Android/res/values/strings.xml b/Source/Android/res/values/strings.xml index c3f7322c95..4364116167 100644 --- a/Source/Android/res/values/strings.xml +++ b/Source/Android/res/values/strings.xml @@ -78,7 +78,7 @@ <string name="fastmem_desc">Uses potentially unsafe optimizations for memory access.</string> <string name="video_settings">Video</string> <string name="software_renderer">Software Renderer</string> - <string name="opengl_es3">OpenGL ES 3</string> + <string name="opengl_es3">OpenGL ES</string> <string name="video_backend">Video Backend</string> <string name="video_backend_to_use">Video backend to use</string> <string name="show_fps">Show FPS</string> diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java index 95cddc0a30..572ba53393 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java @@ -76,7 +76,6 @@ public final class EmulationActivity extends Activity NativeLibrary.SetDimensions((int)screenHeight, (int)screenWidth); else NativeLibrary.SetDimensions((int)screenWidth, (int)screenHeight); - NativeLibrary.SetFilename(gameToEmulate.getStringExtra("SelectedGame")); Running = true; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java index 498e6607b1..7120742471 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java @@ -27,6 +27,7 @@ public final class VideoSettingsFragment extends PreferenceFragment public static String m_GLVersion; public static String m_GLVendor; public static String m_GLRenderer; + public static String m_GLExtensions; private Activity m_activity; /** @@ -104,6 +105,16 @@ public final class VideoSettingsFragment extends PreferenceFragment return mGL.glGetString(GL10.GL_RENDERER); } + /** + * Gets the extension that the device supports + * + * @return String containing the extensions + */ + public String getExtensions() + { + return mGL.glGetString(GL10.GL_EXTENSIONS); + } + private EGLConfig chooseConfig() { int[] attribList = new int[] { @@ -139,6 +150,7 @@ public final class VideoSettingsFragment extends PreferenceFragment m_GLVersion = mbuffer.getVersion(); m_GLVendor = mbuffer.getVendor(); m_GLRenderer = mbuffer.getRenderer(); + m_GLExtensions = mbuffer.getExtensions(); boolean mSupportsGLES3 = false; @@ -170,6 +182,14 @@ public final class VideoSettingsFragment extends PreferenceFragment mSupportsGLES3 = true; } } + if (!mSupportsGLES3 && + m_GLVendor != null && m_GLVendor.equals("NVIDIA Corporation") && + m_GLRenderer != null && m_GLRenderer.equals("NVIDIA Tegra") && + m_GLExtensions != null && m_GLExtensions.contains("GL_OES_depth24")) + { + // Is a Tegra 4 since it supports 24bit depth + mSupportsGLES3 = true; + } return mSupportsGLES3; } diff --git a/Source/Core/VideoCommon/Src/DriverDetails.cpp b/Source/Core/VideoCommon/Src/DriverDetails.cpp index 779edf91e8..1f7e43cca6 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.cpp +++ b/Source/Core/VideoCommon/Src/DriverDetails.cpp @@ -37,7 +37,8 @@ namespace DriverDetails {VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true}, {VENDOR_ATI, DRIVER_ATI, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true}, {VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true}, - {VENDOR_ATI, DRIVER_ATI, BUG_BROKENPINNEDMEMORY, -1.0, -1.0, true} + {VENDOR_ATI, DRIVER_ATI, BUG_BROKENPINNEDMEMORY, -1.0, -1.0, true}, + {VENDOR_TEGRA, DRIVER_NVIDIA, BUG_ISTEGRA, -1.0, -1.0, true}, }; std::map<Bug, BugInfo> m_bugs; diff --git a/Source/Core/VideoCommon/Src/DriverDetails.h b/Source/Core/VideoCommon/Src/DriverDetails.h index a9a9b40f54..6006feb336 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.h +++ b/Source/Core/VideoCommon/Src/DriverDetails.h @@ -115,6 +115,13 @@ namespace DriverDetails // Drawing on screen text causes the whole screen to swizzle in a terrible fashion // Clearing the framebuffer causes one to never see a frame. BUG_BROKENSWAP, + // Bug: Running on a Tegra 4 device + // Affected devices: Nvidia Tegra + // Started Version: 4 + // Ended Version: 5 + // Tegra 4 hardware limitations don't allow it to support OpenGL ES 3 + // This is fixed in Tegra 5 + BUG_ISTEGRA, }; // Initializes our internal vendor, device family, and driver version diff --git a/Source/Core/VideoCommon/Src/LightingShaderGen.h b/Source/Core/VideoCommon/Src/LightingShaderGen.h index 17dd0a6273..d50716cfcd 100644 --- a/Source/Core/VideoCommon/Src/LightingShaderGen.h +++ b/Source/Core/VideoCommon/Src/LightingShaderGen.h @@ -63,7 +63,7 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, case LIGHTDIF_CLAMP: object.Write("ldir = normalize(" LIGHT_POS".xyz - pos.xyz);\n", LIGHT_POS_PARAMS(lightsName, index)); object.Write("lacc.%s += %sdot(ldir, _norm0)) * " LIGHT_COL";\n", - swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); + swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); break; default: _assert_(0); } @@ -76,18 +76,18 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, object.Write("dist2 = dot(ldir, ldir);\n" "dist = sqrt(dist2);\n" "ldir = ldir / dist;\n" - "attn = max(0.0f, dot(ldir, " LIGHT_DIR".xyz));\n", + "attn = max(0.0, dot(ldir, " LIGHT_DIR".xyz));\n", LIGHT_DIR_PARAMS(lightsName, index)); // attn*attn may overflow - object.Write("attn = max(0.0f, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / dot(" LIGHT_DISTATT".xyz, float3(1.0f,dist,dist2));\n", + object.Write("attn = max(0.0, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / dot(" LIGHT_DISTATT".xyz, float3(1.0,dist,dist2));\n", LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); } else if (chan.attnfunc == 1) { // specular object.Write("ldir = normalize(" LIGHT_POS".xyz);\n", LIGHT_POS_PARAMS(lightsName, index)); - object.Write("attn = (dot(_norm0,ldir) >= 0.0f) ? max(0.0f, dot(_norm0, " LIGHT_DIR".xyz)) : 0.0f;\n", LIGHT_DIR_PARAMS(lightsName, index)); + object.Write("attn = (dot(_norm0,ldir) >= 0.0) ? max(0.0, dot(_norm0, " LIGHT_DIR".xyz)) : 0.0;\n", LIGHT_DIR_PARAMS(lightsName, index)); // attn*attn may overflow - object.Write("attn = max(0.0f, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / (" LIGHT_DISTATT".x + " LIGHT_DISTATT".y*attn + " LIGHT_DISTATT".z*attn*attn);\n", + object.Write("attn = max(0.0, " LIGHT_COSATT".x + " LIGHT_COSATT".y*attn + " LIGHT_COSATT".z*attn*attn) / (" LIGHT_DISTATT".x + " LIGHT_DISTATT".y*attn + " LIGHT_DISTATT".z*attn*attn);\n", LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_COSATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index), LIGHT_DISTATT_PARAMS(lightsName, index)); } @@ -101,7 +101,7 @@ static void GenerateLightShader(T& object, LightingUidData& uid_data, int index, case LIGHTDIF_CLAMP: object.Write("lacc.%s += attn * %sdot(ldir, _norm0)) * " LIGHT_COL";\n", swizzle, - chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", + chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0," :"(", LIGHT_COL_PARAMS(lightsName, index, swizzle)); break; default: _assert_(0); @@ -133,7 +133,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com else if (components & VB_HAS_COL0) object.Write("mat = %s0;\n", inColorName); else - object.Write("mat = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("mat = float4(1.0, 1.0, 1.0, 1.0);\n"); } else // from color { @@ -154,7 +154,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com // TODO: this isn't verified. Here we want to read the ambient from the vertex, // but the vertex itself has no color. So we don't know which value to read. // Returing 1.0 is the same as disabled lightning, so this could be fine - object.Write("lacc = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("lacc = float4(1.0, 1.0, 1.0, 1.0);\n"); } else // from color { @@ -163,7 +163,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com } else { - object.Write("lacc = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + object.Write("lacc = float4(1.0, 1.0, 1.0, 1.0);\n"); } // check if alpha is different @@ -176,7 +176,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com object.Write("mat.w = %s%d.w;\n", inColorName, j); else if (components & VB_HAS_COL0) object.Write("mat.w = %s0.w;\n", inColorName); - else object.Write("mat.w = 1.0f;\n"); + else object.Write("mat.w = 1.0;\n"); } else // from color { @@ -196,7 +196,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com object.Write("lacc.w = %s0.w;\n", inColorName); else // TODO: The same for alpha: We want to read from vertex, but the vertex has no color - object.Write("lacc.w = 1.0f;\n"); + object.Write("lacc.w = 1.0;\n"); } else // from color { @@ -205,7 +205,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com } else { - object.Write("lacc.w = 1.0f;\n"); + object.Write("lacc.w = 1.0;\n"); } if(color.enablelighting && alpha.enablelighting) @@ -256,7 +256,7 @@ static void GenerateLightingShader(T& object, LightingUidData& uid_data, int com GenerateLightShader<T>(object, uid_data, i, lit_index, lightsName, coloralpha); } } - object.Write("%s%d = mat * clamp(lacc, 0.0f, 1.0f);\n", dest, j); + object.Write("%s%d = mat * clamp(lacc, 0.0, 1.0);\n", dest, j); object.Write("}\n"); } } diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index 03d1677b2c..84410bc643 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -29,14 +29,14 @@ static const char *tevKSelTableC[] = // KCSEL { - "1.0f,1.0f,1.0f", // 1 = 0x00 - "0.875f,0.875f,0.875f", // 7_8 = 0x01 - "0.75f,0.75f,0.75f", // 3_4 = 0x02 - "0.625f,0.625f,0.625f", // 5_8 = 0x03 - "0.5f,0.5f,0.5f", // 1_2 = 0x04 - "0.375f,0.375f,0.375f", // 3_8 = 0x05 - "0.25f,0.25f,0.25f", // 1_4 = 0x06 - "0.125f,0.125f,0.125f", // 1_8 = 0x07 + "1.0,1.0,1.0", // 1 = 0x00 + "0.875,0.875,0.875", // 7_8 = 0x01 + "0.75,0.75,0.75", // 3_4 = 0x02 + "0.625,0.625,0.625", // 5_8 = 0x03 + "0.5,0.5,0.5", // 1_2 = 0x04 + "0.375,0.375,0.375", // 3_8 = 0x05 + "0.25,0.25,0.25", // 1_4 = 0x06 + "0.125,0.125,0.125", // 1_8 = 0x07 "ERROR1", // 0x08 "ERROR2", // 0x09 "ERROR3", // 0x0a @@ -65,14 +65,14 @@ static const char *tevKSelTableC[] = // KCSEL static const char *tevKSelTableA[] = // KASEL { - "1.0f", // 1 = 0x00 - "0.875f",// 7_8 = 0x01 - "0.75f", // 3_4 = 0x02 - "0.625f",// 5_8 = 0x03 - "0.5f", // 1_2 = 0x04 - "0.375f",// 3_8 = 0x05 - "0.25f", // 1_4 = 0x06 - "0.125f",// 1_8 = 0x07 + "1.0", // 1 = 0x00 + "0.875",// 7_8 = 0x01 + "0.75", // 3_4 = 0x02 + "0.625",// 5_8 = 0x03 + "0.5", // 1_2 = 0x04 + "0.375",// 3_8 = 0x05 + "0.25", // 1_4 = 0x06 + "0.125",// 1_8 = 0x07 "ERROR5", // 0x08 "ERROR6", // 0x09 "ERROR7", // 0x0a @@ -101,17 +101,17 @@ static const char *tevKSelTableA[] = // KASEL static const char *tevScaleTable[] = // CS { - "1.0f", // SCALE_1 - "2.0f", // SCALE_2 - "4.0f", // SCALE_4 - "0.5f", // DIVIDE_2 + "1.0", // SCALE_1 + "2.0", // SCALE_2 + "4.0", // SCALE_4 + "0.5", // DIVIDE_2 }; static const char *tevBiasTable[] = // TB { "", // ZERO, - "+0.5f", // ADDHALF, - "-0.5f", // SUBHALF, + "+0.5", // ADDHALF, + "-0.5", // SUBHALF, "", }; @@ -134,10 +134,10 @@ static const char *tevCInputTable[] = // CC "(textemp.aaa)", // TEXA, "(rastemp.rgb)", // RASC, "(rastemp.aaa)", // RASA, - "float3(1.0f, 1.0f, 1.0f)", // ONE - "float3(0.5f, 0.5f, 0.5f)", // HALF + "float3(1.0, 1.0, 1.0)", // ONE + "float3(0.5, 0.5, 0.5)", // HALF "(konsttemp.rgb)", //"konsttemp.rgb", // KONST - "float3(0.0f, 0.0f, 0.0f)", // ZERO + "float3(0.0, 0.0, 0.0)", // ZERO ///added extra values to map clamped values "(cprev.rgb)", // CPREV, "(cprev.aaa)", // APREV, @@ -151,10 +151,10 @@ static const char *tevCInputTable[] = // CC "(textemp.aaa)", // TEXA, "(crastemp.rgb)", // RASC, "(crastemp.aaa)", // RASA, - "float3(1.0f, 1.0f, 1.0f)", // ONE - "float3(0.5f, 0.5f, 0.5f)", // HALF + "float3(1.0, 1.0, 1.0)", // ONE + "float3(0.5, 0.5, 0.5)", // HALF "(ckonsttemp.rgb)", //"konsttemp.rgb", // KONST - "float3(0.0f, 0.0f, 0.0f)", // ZERO + "float3(0.0, 0.0, 0.0)", // ZERO "PADERROR1", "PADERROR2", "PADERROR3", "PADERROR4" }; @@ -167,7 +167,7 @@ static const char *tevAInputTable[] = // CA "textemp", // TEXA, "rastemp", // RASA, "konsttemp", // KONST, (hw1 had quarter) - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // ZERO + "float4(0.0, 0.0, 0.0, 0.0)", // ZERO ///added extra values to map clamped values "cprev", // APREV, "cc0", // A0, @@ -176,7 +176,7 @@ static const char *tevAInputTable[] = // CA "textemp", // TEXA, "crastemp", // RASA, "ckonsttemp", // KONST, (hw1 had quarter) - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // ZERO + "float4(0.0, 0.0, 0.0, 0.0)", // ZERO "PADERROR5", "PADERROR6", "PADERROR7", "PADERROR8", "PADERROR9", "PADERROR10", "PADERROR11", "PADERROR12", }; @@ -189,8 +189,8 @@ static const char *tevRasTable[] = "ERROR14", //3 "ERROR15", //4 "float4(alphabump,alphabump,alphabump,alphabump)", // use bump alpha - "(float4(alphabump,alphabump,alphabump,alphabump)*(255.0f/248.0f))", //normalized - "float4(0.0f, 0.0f, 0.0f, 0.0f)", // zero + "(float4(alphabump,alphabump,alphabump,alphabump)*(255.0/248.0))", //normalized + "float4(0.0, 0.0, 0.0, 0.0)", // zero }; //static const char *tevTexFunc[] = { "tex2D", "texRECT" }; @@ -199,11 +199,11 @@ static const char *tevCOutputTable[] = { "prev.rgb", "c0.rgb", "c1.rgb", "c2.rg static const char *tevAOutputTable[] = { "prev.a", "c0.a", "c1.a", "c2.a" }; static const char *tevIndAlphaSel[] = {"", "x", "y", "z"}; //static const char *tevIndAlphaScale[] = {"", "*32", "*16", "*8"}; -static const char *tevIndAlphaScale[] = {"*(248.0f/255.0f)", "*(224.0f/255.0f)", "*(240.0f/255.0f)", "*(248.0f/255.0f)"}; +static const char *tevIndAlphaScale[] = {"*(248.0/255.0)", "*(224.0/255.0)", "*(240.0/255.0)", "*(248.0/255.0)"}; static const char *tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias -static const char *tevIndBiasAdd[] = {"-128.0f", "1.0f", "1.0f", "1.0f" }; // indexed by fmt -static const char *tevIndWrapStart[] = {"0.0f", "256.0f", "128.0f", "64.0f", "32.0f", "16.0f", "0.001f" }; -static const char *tevIndFmtScale[] = {"255.0f", "31.0f", "15.0f", "7.0f" }; +static const char *tevIndBiasAdd[] = {"-128.0", "1.0", "1.0", "1.0" }; // indexed by fmt +static const char *tevIndWrapStart[] = {"0.0", "256.0", "128.0", "64.0", "32.0", "16.0", "0.001" }; +static const char *tevIndFmtScale[] = {"255.0", "31.0", "15.0", "7.0" }; struct RegisterState { @@ -309,7 +309,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T if (ApiType == API_OPENGL) { - out.Write("out vec4 ocol0;\n"); + out.Write("COLOROUT(ocol0)\n"); if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) out.Write("out vec4 ocol1;\n"); @@ -324,9 +324,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T if (xfregs.numTexGen.numTexGens < 7) { for (int i = 0; i < 8; ++i) - { out.Write("VARYIN float3 uv%d_2;\n", i); - } out.Write("VARYIN float4 clipPos_2;\n"); if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { @@ -428,18 +426,18 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write(",\n in float%d uv%d : TEXCOORD%d", i < 4 ? 4 : 3 , i, i); } out.Write(" ) {\n"); - out.Write("\tfloat4 clipPos = float4(0.0f, 0.0f, 0.0f, 0.0f);"); + out.Write("\tfloat4 clipPos = float4(0.0, 0.0, 0.0, 0.0);"); } } - out.Write(" float4 c0 = " I_COLORS"[1], c1 = " I_COLORS"[2], c2 = " I_COLORS"[3], prev = float4(0.0f, 0.0f, 0.0f, 0.0f), textemp = float4(0.0f, 0.0f, 0.0f, 0.0f), rastemp = float4(0.0f, 0.0f, 0.0f, 0.0f), konsttemp = float4(0.0f, 0.0f, 0.0f, 0.0f);\n" - " float3 comp16 = float3(1.0f, 255.0f, 0.0f), comp24 = float3(1.0f, 255.0f, 255.0f*255.0f);\n" - " float alphabump=0.0f;\n" - " float3 tevcoord=float3(0.0f, 0.0f, 0.0f);\n" - " float2 wrappedcoord=float2(0.0f,0.0f), tempcoord=float2(0.0f,0.0f);\n" - " float4 cc0=float4(0.0f,0.0f,0.0f,0.0f), cc1=float4(0.0f,0.0f,0.0f,0.0f);\n" - " float4 cc2=float4(0.0f,0.0f,0.0f,0.0f), cprev=float4(0.0f,0.0f,0.0f,0.0f);\n" - " float4 crastemp=float4(0.0f,0.0f,0.0f,0.0f),ckonsttemp=float4(0.0f,0.0f,0.0f,0.0f);\n\n"); + out.Write(" float4 c0 = " I_COLORS"[1], c1 = " I_COLORS"[2], c2 = " I_COLORS"[3], prev = float4(0.0, 0.0, 0.0, 0.0), textemp = float4(0.0, 0.0, 0.0, 0.0), rastemp = float4(0.0, 0.0, 0.0, 0.0), konsttemp = float4(0.0, 0.0, 0.0, 0.0);\n" + " float3 comp16 = float3(1.0, 255.0, 0.0), comp24 = float3(1.0, 255.0, 255.0*255.0);\n" + " float alphabump=0.0;\n" + " float3 tevcoord=float3(0.0, 0.0, 0.0);\n" + " float2 wrappedcoord=float2(0.0,0.0), tempcoord=float2(0.0,0.0);\n" + " float4 cc0=float4(0.0,0.0,0.0,0.0), cc1=float4(0.0,0.0,0.0,0.0);\n" + " float4 cc2=float4(0.0,0.0,0.0,0.0), cprev=float4(0.0,0.0,0.0,0.0);\n" + " float4 crastemp=float4(0.0,0.0,0.0,0.0),ckonsttemp=float4(0.0,0.0,0.0,0.0);\n\n"); if (ApiType == API_OPENGL) { @@ -453,12 +451,8 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T if (xfregs.numTexGen.numTexGens < 7) { if(numTexgen) - { - for (int i = 0; i < 8; ++i) - { - out.Write("float3 uv%d = uv%d_2;\n", i, i); - } - } + for (int i = 0; i < 8; ++i) + out.Write("float3 uv%d = uv%d_2;\n", i, i); out.Write("float4 clipPos = clipPos_2;\n"); if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) { @@ -516,7 +510,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T // HACK to handle cases where the tex gen is not enabled if (numTexgen == 0) { - out.Write("\tfloat3 uv0 = float3(0.0f, 0.0f, 0.0f);\n"); + out.Write("\tfloat3 uv0 = float3(0.0, 0.0, 0.0);\n"); } else { @@ -527,7 +521,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T uid_data.texMtxInfo_n_projection |= xfregs.texMtxInfo[i].projection << i; if (xfregs.texMtxInfo[i].projection == XF_TEXPROJ_STQ) { - out.Write("\tif (uv%d.z != 0.0f)", i); + out.Write("\tif (uv%d.z != 0.0)", i); out.Write("\t\tuv%d.xy = uv%d.xy / uv%d.z;\n", i, i, i); } @@ -561,7 +555,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("\ttempcoord = uv%d.xy * " I_INDTEXSCALE"[%d].%s;\n", texcoord, i/2, (i&1)?"zw":"xy"); } else - out.Write("\ttempcoord = float2(0.0f, 0.0f);\n"); + out.Write("\ttempcoord = float2(0.0, 0.0);\n"); out.Write("float3 indtex%d = ", i); SampleTexture<T>(out, "tempcoord", "abg", texmap, ApiType); @@ -618,7 +612,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T } // emulation of unsigned 8 overflow when casting if needed if(RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl) - out.Write("\tprev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("\tprev = frac(prev * (255.0/256.0)) * (256.0/255.0);\n"); AlphaTest::TEST_RESULT Pretest = bpmem.alpha_test.TestResult(); uid_data.Pretest = Pretest; @@ -665,9 +659,9 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T (bpmem.ztex2.op == ZTEXTURE_ADD) ? "+ zCoord" : ""); // U24 overflow emulation - out.Write("zCoord = zCoord * (16777215.0f/16777216.0f);\n"); + out.Write("zCoord = zCoord * (16777215.0/16777216.0);\n"); out.Write("zCoord = frac(zCoord);\n"); - out.Write("zCoord = zCoord * (16777216.0f/16777215.0f);\n"); + out.Write("zCoord = zCoord * (16777216.0/16777215.0);\n"); } if (per_pixel_depth && bpmem.UseLateDepthTest()) @@ -692,7 +686,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T { // alpha component must be 0 or the shader will not compile (Direct3D 9Ex restriction) // Colors will be blended against the color from ocol1 in D3D 9... - out.Write("\tocol1 = float4(prev.a, prev.a, prev.a, 0.0f);\n"); + out.Write("\tocol1 = float4(prev.a, prev.a, prev.a, 0.0);\n"); } else { @@ -722,43 +716,43 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T //table with the color compare operations static const char *TEVCMPColorOPTable[16] = { - "float3(0.0f, 0.0f, 0.0f)",//0 - "float3(0.0f, 0.0f, 0.0f)",//1 - "float3(0.0f, 0.0f, 0.0f)",//2 - "float3(0.0f, 0.0f, 0.0f)",//3 - "float3(0.0f, 0.0f, 0.0f)",//4 - "float3(0.0f, 0.0f, 0.0f)",//5 - "float3(0.0f, 0.0f, 0.0f)",//6 - "float3(0.0f, 0.0f, 0.0f)",//7 - " %s + ((%s.r >= %s.r + (0.25f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_R8_GT 8 - " %s + ((abs(%s.r - %s.r) < (0.5f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_R8_EQ 9 - " %s + (( dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_GR16_GT 10 - " %s + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_GR16_EQ 11 - " %s + (( dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_BGR24_GT 12 - " %s + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f))",//#define TEVCMP_BGR24_EQ 13 - " %s + (max(sign(%s.rgb - %s.rgb - (0.25f/255.0f)), float3(0.0f, 0.0f, 0.0f)) * %s)",//#define TEVCMP_RGB8_GT 14 - " %s + ((float3(1.0f, 1.0f, 1.0f) - max(sign(abs(%s.rgb - %s.rgb) - (0.5f/255.0f)), float3(0.0f, 0.0f, 0.0f))) * %s)"//#define TEVCMP_RGB8_EQ 15 + "float3(0.0, 0.0, 0.0)",//0 + "float3(0.0, 0.0, 0.0)",//1 + "float3(0.0, 0.0, 0.0)",//2 + "float3(0.0, 0.0, 0.0)",//3 + "float3(0.0, 0.0, 0.0)",//4 + "float3(0.0, 0.0, 0.0)",//5 + "float3(0.0, 0.0, 0.0)",//6 + "float3(0.0, 0.0, 0.0)",//7 + " %s + ((%s.r >= %s.r + (0.25/255.0)) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_R8_GT 8 + " %s + ((abs(%s.r - %s.r) < (0.5/255.0)) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_R8_EQ 9 + " %s + (( dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25/255.0))) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_GR16_GT 10 + " %s + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5/255.0) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_GR16_EQ 11 + " %s + (( dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25/255.0))) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_BGR24_GT 12 + " %s + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5/255.0) ? %s : float3(0.0, 0.0, 0.0))",//#define TEVCMP_BGR24_EQ 13 + " %s + (max(sign(%s.rgb - %s.rgb - (0.25/255.0)), float3(0.0, 0.0, 0.0)) * %s)",//#define TEVCMP_RGB8_GT 14 + " %s + ((float3(1.0, 1.0, 1.0) - max(sign(abs(%s.rgb - %s.rgb) - (0.5/255.0)), float3(0.0, 0.0, 0.0))) * %s)"//#define TEVCMP_RGB8_EQ 15 }; //table with the alpha compare operations static const char *TEVCMPAlphaOPTable[16] = { - "0.0f",//0 - "0.0f",//1 - "0.0f",//2 - "0.0f",//3 - "0.0f",//4 - "0.0f",//5 - "0.0f",//6 - "0.0f",//7 - " %s.a + ((%s.r >= (%s.r + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_R8_GT 8 - " %s.a + (abs(%s.r - %s.r) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_R8_EQ 9 - " %s.a + ((dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_GR16_GT 10 - " %s.a + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_GR16_EQ 11 - " %s.a + ((dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_BGR24_GT 12 - " %s.a + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s.a : 0.0f)",//#define TEVCMP_BGR24_EQ 13 - " %s.a + ((%s.a >= (%s.a + (0.25f/255.0f))) ? %s.a : 0.0f)",//#define TEVCMP_A8_GT 14 - " %s.a + (abs(%s.a - %s.a) < (0.5f/255.0f) ? %s.a : 0.0f)"//#define TEVCMP_A8_EQ 15 + "0.0",//0 + "0.0",//1 + "0.0",//2 + "0.0",//3 + "0.0",//4 + "0.0",//5 + "0.0",//6 + "0.0",//7 + " %s.a + ((%s.r >= (%s.r + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_R8_GT 8 + " %s.a + (abs(%s.r - %s.r) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_R8_EQ 9 + " %s.a + ((dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_GR16_GT 10 + " %s.a + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_GR16_EQ 11 + " %s.a + ((dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_BGR24_GT 12 + " %s.a + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5/255.0) ? %s.a : 0.0)",//#define TEVCMP_BGR24_EQ 13 + " %s.a + ((%s.a >= (%s.a + (0.25/255.0))) ? %s.a : 0.0)",//#define TEVCMP_A8_GT 14 + " %s.a + (abs(%s.a - %s.a) < (0.5/255.0) ? %s.a : 0.0)"//#define TEVCMP_A8_EQ 15 }; template<class T> @@ -821,12 +815,12 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP } else { - out.Write("float2 indtevtrans%d = float2(0.0f, 0.0f);\n", n); + out.Write("float2 indtevtrans%d = float2(0.0, 0.0);\n", n); } } else { - out.Write("float2 indtevtrans%d = float2(0.0f, 0.0f);\n", n); + out.Write("float2 indtevtrans%d = float2(0.0, 0.0);\n", n); } // --------- @@ -837,7 +831,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if (bpmem.tevind[n].sw == ITW_OFF) out.Write("wrappedcoord.x = uv%d.x;\n", texcoord); else if (bpmem.tevind[n].sw == ITW_0) - out.Write("wrappedcoord.x = 0.0f;\n"); + out.Write("wrappedcoord.x = 0.0;\n"); else out.Write("wrappedcoord.x = fmod( uv%d.x, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].sw]); @@ -845,7 +839,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if (bpmem.tevind[n].tw == ITW_OFF) out.Write("wrappedcoord.y = uv%d.y;\n", texcoord); else if (bpmem.tevind[n].tw == ITW_0) - out.Write("wrappedcoord.y = 0.0f;\n"); + out.Write("wrappedcoord.y = 0.0;\n"); else out.Write("wrappedcoord.y = fmod( uv%d.y, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].tw]); @@ -878,7 +872,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP const char *rasswap = swapModeTable[bpmem.combiners[n].alphaC.rswap]; out.Write("rastemp = %s.%s;\n", tevRasTable[bpmem.tevorders[n / 2].getColorChan(n & 1)], rasswap); - out.Write("crastemp = frac(rastemp * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("crastemp = frac(rastemp * (255.0/256.0)) * (256.0/255.0);\n"); } uid_data.stagehash[n].tevorders_enable = bpmem.tevorders[n / 2].getEnable(n & 1); @@ -890,7 +884,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP if(bHasTexCoord) out.Write("tevcoord.xy = uv%d.xy;\n", texcoord); else - out.Write("tevcoord.xy = float2(0.0f, 0.0f);\n"); + out.Write("tevcoord.xy = float2(0.0, 0.0);\n"); } const int i = bpmem.combiners[n].alphaC.tswap; @@ -911,7 +905,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP } else { - out.Write("textemp = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + out.Write("textemp = float4(1.0, 1.0, 1.0, 1.0);\n"); } @@ -925,7 +919,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.Write("konsttemp = float4(%s, %s);\n", tevKSelTableC[kc], tevKSelTableA[ka]); if(kc > 7 || ka > 7) { - out.Write("ckonsttemp = frac(konsttemp * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("ckonsttemp = frac(konsttemp * (255.0/256.0)) * (256.0/255.0);\n"); } else { @@ -944,7 +938,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP { if(RegisterStates[0].AlphaNeedOverflowControl || RegisterStates[0].ColorNeedOverflowControl) { - out.Write("cprev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cprev = frac(prev * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[0].AlphaNeedOverflowControl = false; RegisterStates[0].ColorNeedOverflowControl = false; } @@ -963,7 +957,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+1,C_COLORS+1); if(RegisterStates[1].AlphaNeedOverflowControl || RegisterStates[1].ColorNeedOverflowControl) { - out.Write("cc0 = frac(c0 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc0 = frac(c0 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[1].AlphaNeedOverflowControl = false; RegisterStates[1].ColorNeedOverflowControl = false; } @@ -982,7 +976,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+2,C_COLORS+2); if(RegisterStates[2].AlphaNeedOverflowControl || RegisterStates[2].ColorNeedOverflowControl) { - out.Write("cc1 = frac(c1 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc1 = frac(c1 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[2].AlphaNeedOverflowControl = false; RegisterStates[2].ColorNeedOverflowControl = false; } @@ -1001,7 +995,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP out.SetConstantsUsed(C_COLORS+3,C_COLORS+3); if(RegisterStates[3].AlphaNeedOverflowControl || RegisterStates[3].ColorNeedOverflowControl) { - out.Write("cc2 = frac(c2 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + out.Write("cc2 = frac(c2 * (255.0/256.0)) * (256.0/255.0);\n"); RegisterStates[3].AlphaNeedOverflowControl = false; RegisterStates[3].ColorNeedOverflowControl = false; } @@ -1055,7 +1049,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP else if (cc.a == TEVCOLORARG_ZERO) out.Write("%s*%s", tevCInputTable[cc.b + 16], tevCInputTable[cc.c + 16]); else if (cc.b == TEVCOLORARG_ZERO) - out.Write("%s*(float3(1.0f, 1.0f, 1.0f)-%s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.c + 16]); + out.Write("%s*(float3(1.0, 1.0, 1.0)-%s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.c + 16]); else out.Write("lerp(%s, %s, %s)", tevCInputTable[cc.a + 16], tevCInputTable[cc.b + 16], tevCInputTable[cc.c + 16]); @@ -1074,7 +1068,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP tevCInputTable[cc.c + 16]); } if (cc.clamp) - out.Write(", 0.0f, 1.0f)"); + out.Write(", 0.0, 1.0)"); out.Write(";\n"); RegisterStates[ac.dest].AlphaNeedOverflowControl = (ac.clamp == 0); @@ -1102,7 +1096,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP else if (ac.a == TEVALPHAARG_ZERO) out.Write("%s.a*%s.a", tevAInputTable[ac.b + 8], tevAInputTable[ac.c + 8]); else if (ac.b == TEVALPHAARG_ZERO) - out.Write("%s.a*(1.0f-%s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.c + 8]); + out.Write("%s.a*(1.0-%s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.c + 8]); else out.Write("lerp(%s.a, %s.a, %s.a)", tevAInputTable[ac.a + 8], tevAInputTable[ac.b + 8], tevAInputTable[ac.c + 8]); @@ -1123,7 +1117,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP tevAInputTable[ac.c + 8]); } if (ac.clamp) - out.Write(", 0.0f, 1.0f)"); + out.Write(", 0.0, 1.0)"); out.Write(";\n\n"); out.Write("// TEV done\n"); } @@ -1142,12 +1136,12 @@ void SampleTexture(T& out, const char *texcoords, const char *texswap, int texma static const char *tevAlphaFuncsTable[] = { "(false)", // NEVER - "(prev.a <= %s - (0.25f/255.0f))", // LESS - "(abs( prev.a - %s ) < (0.5f/255.0f))", // EQUAL - "(prev.a < %s + (0.25f/255.0f))", // LEQUAL - "(prev.a >= %s + (0.25f/255.0f))", // GREATER - "(abs( prev.a - %s ) >= (0.5f/255.0f))", // NEQUAL - "(prev.a > %s - (0.25f/255.0f))", // GEQUAL + "(prev.a <= %s - (0.25/255.0))", // LESS + "(abs( prev.a - %s ) < (0.5/255.0))", // EQUAL + "(prev.a < %s + (0.25/255.0))", // LEQUAL + "(prev.a >= %s + (0.25/255.0))", // GREATER + "(abs( prev.a - %s ) >= (0.5/255.0))", // NEQUAL + "(prev.a > %s - (0.25/255.0))", // GEQUAL "(true)" // ALWAYS }; @@ -1188,11 +1182,11 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data& uid_data, API_T out.Write(tevAlphaFuncsTable[compindex], alphaRef[1]); out.Write(")) {\n"); - out.Write("\t\tocol0 = float4(0.0f, 0.0f, 0.0f, 0.0f);\n"); + out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) - out.Write("\t\tocol1 = float4(0.0f, 0.0f, 0.0f, 0.0f);\n"); + out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); if(per_pixel_depth) - out.Write("\t\tdepth = 1.f;\n"); + out.Write("\t\tdepth = 1.0;\n"); // HAXX: zcomploc (aka early_ztest) is a way to control whether depth test is done before // or after texturing and alpha test. PC graphics APIs have no way to support this @@ -1224,10 +1218,10 @@ static const char *tevFogFuncsTable[] = "", // ? "", // Linear "", // ? - "\tfog = 1.0f - pow(2.0f, -8.0f * fog);\n", // exp - "\tfog = 1.0f - pow(2.0f, -8.0f * fog * fog);\n", // exp2 - "\tfog = pow(2.0f, -8.0f * (1.0f - fog));\n", // backward exp - "\tfog = 1.0f - fog;\n fog = pow(2.0f, -8.0f * fog * fog);\n" // backward exp2 + "\tfog = 1.0 - pow(2.0, -8.0 * fog);\n", // exp + "\tfog = 1.0 - pow(2.0, -8.0 * fog * fog);\n", // exp2 + "\tfog = pow(2.0, -8.0 * (1.0 - fog));\n", // backward exp + "\tfog = 1.0 - fog;\n fog = pow(2.0, -8.0 * fog * fog);\n" // backward exp2 }; template<class T> @@ -1260,12 +1254,12 @@ static inline void WriteFog(T& out, pixel_shader_uid_data& uid_data) if (bpmem.fogRange.Base.Enabled) { out.SetConstantsUsed(C_FOG+2, C_FOG+2); - out.Write("\tfloat x_adjust = (2.0f * (clipPos.x / " I_FOG"[2].y)) - 1.0f - " I_FOG"[2].x;\n"); + out.Write("\tfloat x_adjust = (2.0 * (clipPos.x / " I_FOG"[2].y)) - 1.0 - " I_FOG"[2].x;\n"); out.Write("\tx_adjust = sqrt(x_adjust * x_adjust + " I_FOG"[2].z * " I_FOG"[2].z) / " I_FOG"[2].z;\n"); out.Write("\tze *= x_adjust;\n"); } - out.Write("\tfloat fog = clamp(ze - " I_FOG"[1].z, 0.0f, 1.0f);\n"); + out.Write("\tfloat fog = clamp(ze - " I_FOG"[1].z, 0.0, 1.0);\n"); if (bpmem.fog.c_proj_fsel.fsel > 3) { diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp index bf2f2737ea..fec8b8afde 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp @@ -142,7 +142,7 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) if (ApiType != API_OPENGL) { - WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this + WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n");// still to determine the reason for this WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n"); } } @@ -204,14 +204,14 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) WRITE(p, " float yb = yl * %f;\n", blkH); WRITE(p, " float yoff = uv1.y - yb;\n"); WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n"); - WRITE(p, " float xel = floor(xp / 2.0f);\n"); + WRITE(p, " float xel = floor(xp / 2.0);\n"); WRITE(p, " float xb = floor(xel / %f);\n", blkH); WRITE(p, " float xoff = xel - (xb * %f);\n", blkH); - WRITE(p, " float x2 = uv1.x * 2.0f;\n"); + WRITE(p, " float x2 = uv1.x * 2.0;\n"); WRITE(p, " float xl = floor(x2 / %f);\n", blkW); WRITE(p, " float xib = x2 - (xl * %f);\n", blkW); - WRITE(p, " float halfxb = floor(xb / 2.0f);\n"); + WRITE(p, " float halfxb = floor(xb / 2.0);\n"); WRITE(p, " sampleUv.x = xib + (halfxb * %f);\n", blkW); WRITE(p, " sampleUv.y = yb + xoff;\n"); @@ -224,7 +224,7 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) if (ApiType != API_OPENGL) { - WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this + WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n");// still to determine the reason for this WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n"); } } @@ -246,7 +246,7 @@ void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYP else texSampleIncrementUnit = I_COLORS"[0].x"; - WRITE(p, " %s = %s(samp0, sampleUv + float2(%d.0f * (%s), 0.0f)).%s;\n", + WRITE(p, " %s = %s(samp0, sampleUv + float2(%d.0 * (%s), 0.0)).%s;\n", dest, texSampleOpName, s_incrementSampleXCount, texSampleIncrementUnit, colorComp); } @@ -282,7 +282,7 @@ void WriteIncrementSampleX(char*& p,API_TYPE ApiType) void WriteToBitDepth(char*& p, u8 depth, const char* src, const char* dest) { - float result = 255 / pow(2.0f, (8 - depth)); + float result = 255 / pow(2.0, (8 - depth)); WRITE(p, " %s = floor(%s * %ff);\n", dest, src, result); } @@ -362,7 +362,7 @@ void WriteI4Encoder(char* p, API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -416,7 +416,7 @@ void WriteIA4Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -432,15 +432,15 @@ void WriteRGB565Encoder(char* p,API_TYPE ApiType) WRITE(p, " float2 texBs = float2(texSample0.b, texSample1.b);\n"); WriteToBitDepth(p, 6, "texGs", "float2 gInt"); - WRITE(p, " float2 gUpper = floor(gInt / 8.0f);\n"); - WRITE(p, " float2 gLower = gInt - gUpper * 8.0f;\n"); + WRITE(p, " float2 gUpper = floor(gInt / 8.0);\n"); + WRITE(p, " float2 gLower = gInt - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texRs", "ocol0.br"); - WRITE(p, " ocol0.br = ocol0.br * 8.0f + gUpper;\n"); + WRITE(p, " ocol0.br = ocol0.br * 8.0 + gUpper;\n"); WriteToBitDepth(p, 5, "texBs", "ocol0.ga"); - WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0f;\n"); + WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0;\n"); - WRITE(p, " ocol0 = ocol0 / 255.0f;\n"); + WRITE(p, " ocol0 = ocol0 / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -459,13 +459,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WRITE(p, "if(texSample.a > 0.878f) {\n"); WriteToBitDepth(p, 5, "texSample.g", "color0"); - WRITE(p, " gUpper = floor(color0 / 8.0f);\n"); - WRITE(p, " gLower = color0 - gUpper * 8.0f;\n"); + WRITE(p, " gUpper = floor(color0 / 8.0);\n"); + WRITE(p, " gLower = color0 - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texSample.r", "ocol0.b"); - WRITE(p, " ocol0.b = ocol0.b * 4.0f + gUpper + 128.0f;\n"); + WRITE(p, " ocol0.b = ocol0.b * 4.0 + gUpper + 128.0;\n"); WriteToBitDepth(p, 5, "texSample.b", "ocol0.g"); - WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0f;\n"); + WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0;\n"); WRITE(p, "} else {\n"); @@ -473,9 +473,9 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.b", "ocol0.g"); WriteToBitDepth(p, 3, "texSample.a", "color0"); - WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0f;\n"); + WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0;\n"); WriteToBitDepth(p, 4, "texSample.g", "color0"); - WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0f;\n"); + WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0;\n"); WRITE(p, "}\n"); @@ -487,13 +487,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WRITE(p, "if(texSample.a > 0.878f) {\n"); WriteToBitDepth(p, 5, "texSample.g", "color0"); - WRITE(p, " gUpper = floor(color0 / 8.0f);\n"); - WRITE(p, " gLower = color0 - gUpper * 8.0f;\n"); + WRITE(p, " gUpper = floor(color0 / 8.0);\n"); + WRITE(p, " gLower = color0 - gUpper * 8.0;\n"); WriteToBitDepth(p, 5, "texSample.r", "ocol0.r"); - WRITE(p, " ocol0.r = ocol0.r * 4.0f + gUpper + 128.0f;\n"); + WRITE(p, " ocol0.r = ocol0.r * 4.0 + gUpper + 128.0;\n"); WriteToBitDepth(p, 5, "texSample.b", "ocol0.a"); - WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0f;\n"); + WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0;\n"); WRITE(p, "} else {\n"); @@ -501,13 +501,13 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.b", "ocol0.a"); WriteToBitDepth(p, 3, "texSample.a", "color0"); - WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0f;\n"); + WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0;\n"); WriteToBitDepth(p, 4, "texSample.g", "color0"); - WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0f;\n"); + WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0;\n"); WRITE(p, "}\n"); - WRITE(p, " ocol0 = ocol0 / 255.0f;\n"); + WRITE(p, " ocol0 = ocol0 / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -533,7 +533,7 @@ void WriteRGBA4443Encoder(char* p,API_TYPE ApiType) WriteToBitDepth(p, 4, "texSample.g", "color0.a"); WriteToBitDepth(p, 4, "texSample.b", "color1.a"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -541,8 +541,8 @@ void WriteRGBA8Encoder(char* p,API_TYPE ApiType) { Write32BitSwizzler(p, GX_TF_RGBA8, ApiType); - WRITE(p, " float cl1 = xb - (halfxb * 2.0f);\n"); - WRITE(p, " float cl0 = 1.0f - cl1;\n"); + WRITE(p, " float cl1 = xb - (halfxb * 2.0);\n"); + WRITE(p, " float cl0 = 1.0 - cl1;\n"); WRITE(p, " float4 texSample;\n"); WRITE(p, " float4 color0;\n"); @@ -599,7 +599,7 @@ void WriteC4Encoder(char* p, const char* comp,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -650,7 +650,7 @@ void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType) WriteToBitDepth(p, 4, "color0", "color0"); WriteToBitDepth(p, 4, "color1", "color1"); - WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n"); + WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -701,25 +701,25 @@ void WriteZ16Encoder(char* p,API_TYPE ApiType) WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); - WRITE(p, " ocol0.b = expanded.g / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded.r / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded.g / 255.0;\n"); + WRITE(p, " ocol0.g = expanded.r / 255.0;\n"); WriteIncrementSampleX(p, ApiType); WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); - WRITE(p, " ocol0.r = expanded.g / 255.0f;\n"); - WRITE(p, " ocol0.a = expanded.r / 255.0f;\n"); + WRITE(p, " ocol0.r = expanded.g / 255.0;\n"); + WRITE(p, " ocol0.a = expanded.r / 255.0;\n"); WriteEncoderEnd(p, ApiType); } @@ -735,25 +735,25 @@ void WriteZ16LEncoder(char* p,API_TYPE ApiType) WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); - WRITE(p, " depth -= expanded.g * 256.0f;\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); + WRITE(p, " depth -= expanded.g * 256.0;\n"); WRITE(p, " expanded.b = depth;\n"); - WRITE(p, " ocol0.b = expanded.b / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded.g / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded.b / 255.0;\n"); + WRITE(p, " ocol0.g = expanded.g / 255.0;\n"); WriteIncrementSampleX(p, ApiType); WriteSampleColor(p, "b", "depth", ApiType); - WRITE(p, " depth *= 16777215.0f;\n"); - WRITE(p, " expanded.r = floor(depth / (256.0f * 256.0f));\n"); - WRITE(p, " depth -= expanded.r * 256.0f * 256.0f;\n"); - WRITE(p, " expanded.g = floor(depth / 256.0f);\n"); - WRITE(p, " depth -= expanded.g * 256.0f;\n"); + WRITE(p, " depth *= 16777215.0;\n"); + WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n"); + WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n"); + WRITE(p, " expanded.g = floor(depth / 256.0);\n"); + WRITE(p, " depth -= expanded.g * 256.0;\n"); WRITE(p, " expanded.b = depth;\n"); WRITE(p, " ocol0.r = expanded.b;\n"); @@ -766,7 +766,7 @@ void WriteZ24Encoder(char* p, API_TYPE ApiType) { Write32BitSwizzler(p, GX_TF_Z24X8, ApiType); - WRITE(p, " float cl = xb - (halfxb * 2.0f);\n"); + WRITE(p, " float cl = xb - (halfxb * 2.0);\n"); WRITE(p, " float depth0;\n"); WRITE(p, " float depth1;\n"); @@ -779,27 +779,27 @@ void WriteZ24Encoder(char* p, API_TYPE ApiType) for (int i = 0; i < 2; i++) { - WRITE(p, " depth%i *= 16777215.0f;\n", i); + WRITE(p, " depth%i *= 16777215.0;\n", i); - WRITE(p, " expanded%i.r = floor(depth%i / (256.0f * 256.0f));\n", i, i); - WRITE(p, " depth%i -= expanded%i.r * 256.0f * 256.0f;\n", i, i); - WRITE(p, " expanded%i.g = floor(depth%i / 256.0f);\n", i, i); - WRITE(p, " depth%i -= expanded%i.g * 256.0f;\n", i, i); + WRITE(p, " expanded%i.r = floor(depth%i / (256.0 * 256.0));\n", i, i); + WRITE(p, " depth%i -= expanded%i.r * 256.0 * 256.0;\n", i, i); + WRITE(p, " expanded%i.g = floor(depth%i / 256.0);\n", i, i); + WRITE(p, " depth%i -= expanded%i.g * 256.0;\n", i, i); WRITE(p, " expanded%i.b = depth%i;\n", i, i); } - WRITE(p, " if(cl > 0.5f) {\n"); + WRITE(p, " if(cl > 0.5) {\n"); // upper 16 - WRITE(p, " ocol0.b = expanded0.g / 255.0f;\n"); - WRITE(p, " ocol0.g = expanded0.b / 255.0f;\n"); - WRITE(p, " ocol0.r = expanded1.g / 255.0f;\n"); - WRITE(p, " ocol0.a = expanded1.b / 255.0f;\n"); + WRITE(p, " ocol0.b = expanded0.g / 255.0;\n"); + WRITE(p, " ocol0.g = expanded0.b / 255.0;\n"); + WRITE(p, " ocol0.r = expanded1.g / 255.0;\n"); + WRITE(p, " ocol0.a = expanded1.b / 255.0;\n"); WRITE(p, " } else {\n"); // lower 8 - WRITE(p, " ocol0.b = 1.0f;\n"); - WRITE(p, " ocol0.g = expanded0.r / 255.0f;\n"); - WRITE(p, " ocol0.r = 1.0f;\n"); - WRITE(p, " ocol0.a = expanded1.r / 255.0f;\n"); + WRITE(p, " ocol0.b = 1.0;\n"); + WRITE(p, " ocol0.g = expanded0.r / 255.0;\n"); + WRITE(p, " ocol0.r = 1.0;\n"); + WRITE(p, " ocol0.a = expanded1.r / 255.0;\n"); WRITE(p, " }\n"); WriteEncoderEnd(p, ApiType); @@ -878,10 +878,10 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType) WriteC4Encoder(p, "b", ApiType); break; case GX_CTF_Z8M: - WriteZ8Encoder(p, "256.0f", ApiType); + WriteZ8Encoder(p, "256.0", ApiType); break; case GX_CTF_Z8L: - WriteZ8Encoder(p, "65536.0f" , ApiType); + WriteZ8Encoder(p, "65536.0" , ApiType); break; case GX_CTF_Z16L: WriteZ16LEncoder(p, ApiType); diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index 1b5286fea0..39b478feb5 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -204,7 +204,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } else if (api_type == API_D3D11) { - out.Write("int posmtx = blend_indices.x * 255.0f;\n"); + out.Write("int posmtx = blend_indices.x * 255.0;\n"); } else { @@ -236,7 +236,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } else { - out.Write("float4 pos = float4(dot(" I_POSNORMALMATRIX"[0], rawpos), dot(" I_POSNORMALMATRIX"[1], rawpos), dot(" I_POSNORMALMATRIX"[2], rawpos), 1.0f);\n"); + out.Write("float4 pos = float4(dot(" I_POSNORMALMATRIX"[0], rawpos), dot(" I_POSNORMALMATRIX"[1], rawpos), dot(" I_POSNORMALMATRIX"[2], rawpos), 1.0);\n"); if (components & VB_HAS_NRM0) out.Write("float3 _norm0 = normalize(float3(dot(" I_POSNORMALMATRIX"[3].xyz, rawnorm0), dot(" I_POSNORMALMATRIX"[4].xyz, rawnorm0), dot(" I_POSNORMALMATRIX"[5].xyz, rawnorm0)));\n"); if (components & VB_HAS_NRM1) @@ -246,7 +246,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ } if (!(components & VB_HAS_NRM0)) - out.Write("float3 _norm0 = float3(0.0f, 0.0f, 0.0f);\n"); + out.Write("float3 _norm0 = float3(0.0, 0.0, 0.0);\n"); out.Write("o.pos = float4(dot(" I_PROJECTION"[0], pos), dot(" I_PROJECTION"[1], pos), dot(" I_PROJECTION"[2], pos), dot(" I_PROJECTION"[3], pos));\n"); @@ -261,7 +261,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_COL0) out.Write("o.colors_0 = color0;\n"); else - out.Write("o.colors_0 = float4(1.0f, 1.0f, 1.0f, 1.0f);\n"); + out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n"); } GenerateLightingShader<T>(out, uid_data.lighting, components, I_MATERIALS, I_LIGHTS, "color", "o.colors_"); @@ -283,13 +283,13 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ */ // transform texcoords - out.Write("float4 coord = float4(0.0f, 0.0f, 1.0f, 1.0f);\n"); + out.Write("float4 coord = float4(0.0, 0.0, 1.0, 1.0);\n"); for (unsigned int i = 0; i < xfregs.numTexGen.numTexGens; ++i) { TexMtxInfo& texinfo = xfregs.texMtxInfo[i]; out.Write("{\n"); - out.Write("coord = float4(0.0f, 0.0f, 1.0f, 1.0f);\n"); + out.Write("coord = float4(0.0, 0.0, 1.0, 1.0);\n"); uid_data.texMtxInfo[i].sourcerow = xfregs.texMtxInfo[i].sourcerow; switch (texinfo.sourcerow) { @@ -301,7 +301,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_NRM0) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm0.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm0.xyz, 1.0);\n"); } break; case XF_SRCCOLORS_INROW: @@ -311,20 +311,20 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_NRM1) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm1.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm1.xyz, 1.0);\n"); } break; case XF_SRCBINORMAL_B_INROW: if (components & VB_HAS_NRM2) { _assert_( texinfo.inputform == XF_TEXINPUT_ABC1 ); - out.Write("coord = float4(rawnorm2.xyz, 1.0f);\n"); + out.Write("coord = float4(rawnorm2.xyz, 1.0);\n"); } break; default: _assert_(texinfo.sourcerow <= XF_SRCTEX7_INROW); if (components & (VB_HAS_UV0<<(texinfo.sourcerow - XF_SRCTEX0_INROW)) ) - out.Write("coord = float4(tex%d.x, tex%d.y, 1.0f, 1.0f);\n", texinfo.sourcerow - XF_SRCTEX0_INROW, texinfo.sourcerow - XF_SRCTEX0_INROW); + out.Write("coord = float4(tex%d.x, tex%d.y, 1.0, 1.0);\n", texinfo.sourcerow - XF_SRCTEX0_INROW, texinfo.sourcerow - XF_SRCTEX0_INROW); break; } @@ -340,7 +340,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ uid_data.texMtxInfo[i].embosslightshift = xfregs.texMtxInfo[i].embosslightshift; uid_data.texMtxInfo[i].embosssourceshift = xfregs.texMtxInfo[i].embosssourceshift; out.Write("ldir = normalize(" LIGHT_POS".xyz - pos.xyz);\n", LIGHT_POS_PARAMS(I_LIGHTS, texinfo.embosslightshift)); - out.Write("o.tex%d.xyz = o.tex%d.xyz + float3(dot(ldir, _norm1), dot(ldir, _norm2), 0.0f);\n", i, texinfo.embosssourceshift); + out.Write("o.tex%d.xyz = o.tex%d.xyz + float3(dot(ldir, _norm1), dot(ldir, _norm2), 0.0);\n", i, texinfo.embosssourceshift); } else { @@ -399,7 +399,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ // q of output is unknown // multiply by postmatrix - out.Write("o.tex%d.xyz = float3(dot(P0.xy, o.tex%d.xy) + P0.z + P0.w, dot(P1.xy, o.tex%d.xy) + P1.z + P1.w, 0.0f);\n", i, i, i); + out.Write("o.tex%d.xyz = float3(dot(P0.xy, o.tex%d.xy) + P0.z + P0.w, dot(P1.xy, o.tex%d.xy) + P1.z + P1.w, 0.0);\n", i, i, i); } else { @@ -462,14 +462,14 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ { // this results in a scale from -1..0 to -1..1 after perspective // divide - out.Write("o.pos.z = o.pos.w + o.pos.z * 2.0f;\n"); + out.Write("o.pos.z = o.pos.w + o.pos.z * 2.0;\n"); // Sonic Unleashed puts its final rendering at the near or // far plane of the viewing frustrum(actually box, they use // orthogonal projection for that), and we end up putting it // just beyond, and the rendering gets clipped away. (The // primitive gets dropped) - out.Write("o.pos.z = o.pos.z * 1048575.0f/1048576.0f;\n"); + out.Write("o.pos.z = o.pos.z * 1048575.0/1048576.0;\n"); // the next steps of the OGL pipeline are: // (x_c,y_c,z_c,w_c) = o.pos //switch to OGL spec terminology @@ -503,7 +503,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if(i < xfregs.numTexGen.numTexGens) out.Write(" uv%d_2.xyz = o.tex%d;\n", i, i); else - out.Write(" uv%d_2.xyz = float3(0.0f, 0.0f, 0.0f);\n", i); + out.Write(" uv%d_2.xyz = float3(0.0, 0.0, 0.0);\n", i); } out.Write(" clipPos_2 = o.clipPos;\n"); if(g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp index ed36b5dd6d..0e4ea6ed01 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp @@ -200,7 +200,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms char ps_rgba6_to_rgb8[] = "uniform sampler2DRect samp9;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main()\n" "{\n" " ivec4 src6 = ivec4(round(texture2DRect(samp9, gl_FragCoord.xy) * 63.f));\n" @@ -214,7 +214,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms char ps_rgb8_to_rgba6[] = "uniform sampler2DRect samp9;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main()\n" "{\n" " ivec4 src8 = ivec4(round(texture2DRect(samp9, gl_FragCoord.xy) * 255.f));\n" @@ -226,9 +226,13 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms " ocol0 = float4(dst6) / 63.f;\n" "}"; - ProgramShaderCache::CompileShader(m_pixel_format_shaders[0], vs, ps_rgb8_to_rgba6); - ProgramShaderCache::CompileShader(m_pixel_format_shaders[1], vs, ps_rgba6_to_rgb8); - + if(g_ogl_config.eSupportedGLSLVersion != GLSLES2) + { + // HACK: This shaders aren't glsles2 compatible as glsles2 don't support bit operations + // it could be workaround by floor + frac + tons off additions, but I think it isn't worth + ProgramShaderCache::CompileShader(m_pixel_format_shaders[0], vs, ps_rgb8_to_rgba6); + ProgramShaderCache::CompileShader(m_pixel_format_shaders[1], vs, ps_rgba6_to_rgb8); + } } FramebufferManager::~FramebufferManager() @@ -359,6 +363,19 @@ GLuint FramebufferManager::ResolveAndGetDepthTarget(const EFBRectangle &source_r void FramebufferManager::ReinterpretPixelData(unsigned int convtype) { + if(g_ogl_config.eSupportedGLSLVersion == GLSLES2) { + // This feature isn't supported by glsles2 + + // TODO: move this to InitBackendInfo + // We have to disable both the active and the stored config. Else we + // would either + // show this line per format change in one frame or + // once per frame. + OSD::AddMessage("Format Change Emulation isn't supported by your GPU.", 10000); + g_ActiveConfig.bEFBEmulateFormatChanges = false; + g_Config.bEFBEmulateFormatChanges = false; + return; + } g_renderer->ResetAPIState(); GLuint src_texture = 0; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp index 073e5cc513..598f336036 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLFunctions.cpp @@ -1,9 +1,12 @@ // Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. + +#include "DriverDetails.h" #include "GLFunctions.h" #include "Log.h" #include <dlfcn.h> + #ifdef USE_GLES3 PFNGLMAPBUFFERRANGEPROC glMapBufferRange; PFNGLUNMAPBUFFERPROC glUnmapBuffer; @@ -67,16 +70,40 @@ namespace GLFunc void Init() { self = dlopen(NULL, RTLD_LAZY); - LoadFunction("glBeginQuery", (void**)&glBeginQuery); - LoadFunction("glEndQuery", (void**)&glEndQuery); - LoadFunction("glGetQueryObjectuiv", (void**)&glGetQueryObjectuiv); - LoadFunction("glDeleteQueries", (void**)&glDeleteQueries); - LoadFunction("glGenQueries", (void**)&glGenQueries); + + LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer); + + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) { - LoadFunction("glUnmapBuffer", (void**)&glUnmapBuffer); + LoadFunction("glBeginQueryEXT", (void**)&glBeginQuery); + LoadFunction("glEndQueryEXT", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuivEXT", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueriesEXT", (void**)&glDeleteQueries); + LoadFunction("glGenQueriesEXT", (void**)&glGenQueries); + + LoadFunction("glMapBufferRangeNV", (void**)&glMapBufferRange); + LoadFunction("glBindBufferRangeNV", (void**)&glBindBufferRange); + LoadFunction("glBlitFramebufferNV", (void**)&glBlitFramebuffer); + + LoadFunction("glGenVertexArraysOES", (void**)&glGenVertexArrays); + LoadFunction("glDeleteVertexArraysOES", (void**)&glDeleteVertexArrays); + LoadFunction("glBindVertexArrayOES", (void**)&glBindVertexArray); + + LoadFunction("glRenderbufferStorageMultisampleNV", (void**)&glRenderbufferStorageMultisample); + + LoadFunction("glGetUniformBlockIndexNV", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBindingNV", (void**)&glUniformBlockBinding); + } + else + { + LoadFunction("glBeginQuery", (void**)&glBeginQuery); + LoadFunction("glEndQuery", (void**)&glEndQuery); + LoadFunction("glGetQueryObjectuiv", (void**)&glGetQueryObjectuiv); + LoadFunction("glDeleteQueries", (void**)&glDeleteQueries); + LoadFunction("glGenQueries", (void**)&glGenQueries); + LoadFunction("glMapBufferRange", (void**)&glMapBufferRange); LoadFunction("glBindBufferRange", (void**)&glBindBufferRange); - LoadFunction("glBlitFramebuffer", (void**)&glBlitFramebuffer); LoadFunction("glGenVertexArrays", (void**)&glGenVertexArrays); @@ -86,24 +113,26 @@ namespace GLFunc LoadFunction("glClientWaitSync", (void**)&glClientWaitSync); LoadFunction("glDeleteSync", (void**)&glDeleteSync); LoadFunction("glFenceSync", (void**)&glFenceSync); + LoadFunction("glSamplerParameterf", (void**)&glSamplerParameterf); LoadFunction("glSamplerParameteri", (void**)&glSamplerParameteri); LoadFunction("glSamplerParameterfv", (void**)&glSamplerParameterfv); LoadFunction("glBindSampler", (void**)&glBindSampler); LoadFunction("glDeleteSamplers", (void**)&glDeleteSamplers); LoadFunction("glGenSamplers", (void**)&glGenSamplers); - } + + LoadFunction("glGetProgramBinary", (void**)&glGetProgramBinary); + LoadFunction("glProgramBinary", (void**)&glProgramBinary); + LoadFunction("glProgramParameteri", (void**)&glProgramParameteri); - LoadFunction("glGetProgramBinary", (void**)&glGetProgramBinary); - LoadFunction("glProgramBinary", (void**)&glProgramBinary); - LoadFunction("glProgramParameteri", (void**)&glProgramParameteri); - - LoadFunction("glDrawRangeElements", (void**)&glDrawRangeElements); + LoadFunction("glDrawRangeElements", (void**)&glDrawRangeElements); - LoadFunction("glRenderbufferStorageMultisample", (void**)&glRenderbufferStorageMultisample); + LoadFunction("glRenderbufferStorageMultisample", (void**)&glRenderbufferStorageMultisample); - LoadFunction("glGetUniformBlockIndex", (void**)&glGetUniformBlockIndex); - LoadFunction("glUniformBlockBinding", (void**)&glUniformBlockBinding); + LoadFunction("glGetUniformBlockIndex", (void**)&glGetUniformBlockIndex); + LoadFunction("glUniformBlockBinding", (void**)&glUniformBlockBinding); + + } dlclose(self); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index f27f56d701..a8360fa9c3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -518,16 +518,18 @@ void ProgramShaderCache::CreateHeader ( void ) { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; snprintf(s_glsl_header, sizeof(s_glsl_header), - "#version %s\n" - "%s\n" // default precision + "%s\n" "%s\n" // ubo "%s\n" // early-z + // Precision defines for GLSLES2/3 + "%s\n" + "\n"// A few required defines and ones that will make our lives a lot easier - "#define ATTRIN in\n" - "#define ATTROUT out\n" - "#define VARYIN %s in\n" - "#define VARYOUT %s out\n" + "#define ATTRIN %s\n" + "#define ATTROUT %s\n" + "#define VARYIN %s\n" + "#define VARYOUT %s\n" // Silly differences "#define float2 vec2\n" @@ -542,18 +544,41 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" "%s\n" "%s\n" + + // GLSLES2 hacks + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "#define COLOROUT(name) %s\n" + - , v==GLSLES3 ? "300 es" : v==GLSL_130 ? "130" : v==GLSL_140 ? "140" : "150" - , v==GLSLES3 ? "precision highp float;" : "" + , v==GLSLES2 ? "" : v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v<GLSL_140 ? "#extension GL_ARB_uniform_buffer_object : enable" : "" , g_ActiveConfig.backend_info.bSupportsEarlyZ ? "#extension GL_ARB_shader_image_load_store : enable" : "" - , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "" : "centroid" - , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "" : "centroid" + , (v==GLSLES3 || v==GLSLES2) ? "precision highp float;" : "" - , v==GLSLES3 ? "" : v<=GLSL_130 ? "#extension GL_ARB_texture_rectangle : enable" : "#define texture2DRect texture" + , v==GLSLES2 ? "attribute" : "in" + , v==GLSLES2 ? "attribute" : "out" + , v==GLSLES2 ? "varying" : DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "in" : "centroid in" + , v==GLSLES2 ? "varying" : DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "out" : "centroid out" + + , v==GLSLES2 ? "#define texture2DRect texture2D" : v==GLSLES3 ? "" : v<=GLSL_130 ? "#extension GL_ARB_texture_rectangle : enable" : "#define texture2DRect texture" , v==GLSLES3 ? "#define texture2DRect(samp, uv) texelFetch(samp, ivec2(floor(uv)), 0)" : "" - , v==GLSLES3 ? "#define sampler2DRect sampler2D" : "" + , (v==GLSLES3 || v==GLSLES2) ? "#define sampler2DRect sampler2D" : "" + + , v==GLSLES2 ? "#define texture texture2D" : "" + , v==GLSLES2 ? "#define round(x) floor((x)+0.5)" : "" + , v==GLSLES2 ? "#define out " : "" + , v==GLSLES2 ? "#define ocol0 gl_FragColor" : "" + , v==GLSLES2 ? "#define ocol1 gl_FragColor" : "" + , v==GLSLES2 ? "#extension GL_NV_uniform_buffer_object : enable" : "" + , v==GLSLES2 ? "#extension GL_NV_fragdepth : enable" : "" + , v==GLSLES2 ? "" : "out vec4 name;" ); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp index 658b72da1c..9e46a5eb86 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp @@ -127,7 +127,7 @@ static const char *s_fragmentShaderSrc = "uniform sampler2D samp8;\n" "uniform vec4 color;\n" "VARYIN vec2 uv0;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main(void) {\n" " ocol0 = texture(samp8,uv0) * color;\n" "}\n"; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 22a58dd9ab..baeb520815 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -371,6 +371,7 @@ Renderer::Renderer() // Set default GLES3 options GLFunc::Init(); WARN_LOG(VIDEO, "Running the OpenGL ES 3 backend!"); + g_Config.backend_info.bSupportsDualSourceBlend = false; g_Config.backend_info.bSupportsGLSLUBO = !DriverDetails::HasBug(DriverDetails::BUG_ANNIHILATEDUBOS); g_Config.backend_info.bSupportsPrimitiveRestart = true; @@ -387,7 +388,10 @@ Renderer::Renderer() g_ogl_config.bSupportCoverageMSAA = false; // XXX: GLES3 spec has MSAA g_ogl_config.bSupportSampleShading = false; g_ogl_config.bSupportOGL31 = false; - g_ogl_config.eSupportedGLSLVersion = GLSLES3; + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + g_ogl_config.eSupportedGLSLVersion = GLSLES2; + else + g_ogl_config.eSupportedGLSLVersion = GLSLES3; #else #ifdef __APPLE__ glewExperimental = 1; @@ -659,11 +663,11 @@ void Renderer::Init() "ATTRIN vec3 color0;\n" "VARYOUT vec4 c;\n" "void main(void) {\n" - " gl_Position = vec4(rawpos, 0.0f, 1.0f);\n" - " c = vec4(color0, 1.0f);\n" + " gl_Position = vec4(rawpos, 0.0, 1.0);\n" + " c = vec4(color0, 1.0);\n" "}\n", "VARYIN vec4 c;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main(void) {\n" " ocol0 = c;\n" "}\n"); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.h b/Source/Plugins/Plugin_VideoOGL/Src/Render.h index bf33f015e6..4086ad3e87 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.h @@ -13,6 +13,7 @@ enum GLSL_VERSION { GLSL_130, GLSL_140, GLSL_150, // and above + GLSLES2, GLSLES3 }; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp index 8e4722bde9..713b0e21fa 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include "DriverDetails.h" #include "SamplerCache.h" namespace OGL @@ -15,11 +16,14 @@ SamplerCache::SamplerCache() SamplerCache::~SamplerCache() { - Clear(); + if (!DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + Clear(); } void SamplerCache::SetSamplerState(int stage, const TexMode0& tm0, const TexMode1& tm1) { + if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + return; // TODO: can this go somewhere else? if (m_last_max_anisotropy != g_ActiveConfig.iMaxAnisotropy) { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp b/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp index 814a628d1c..f0833637d0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/StreamBuffer.cpp @@ -33,7 +33,7 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType) g_Config.bHackedBufferUpload = false; } - if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)) + if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA) && !DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) m_uploadtype = BUFFERDATA; else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA)) m_uploadtype = BUFFERSUBDATA; @@ -48,7 +48,7 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType) else m_uploadtype = MAP_AND_ORPHAN; } - + Init(); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp index 06480df99a..c3349f5f2c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp @@ -411,7 +411,7 @@ TextureCache::TextureCache() "uniform sampler2DRect samp9;\n" "uniform vec4 colmat[7];\n" "VARYIN vec2 uv0;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "\n" "void main(){\n" " vec4 texcol = texture2DRect(samp9, uv0);\n" @@ -423,12 +423,12 @@ TextureCache::TextureCache() "uniform sampler2DRect samp9;\n" "uniform vec4 colmat[5];\n" "VARYIN vec2 uv0;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "\n" "void main(){\n" " vec4 texcol = texture2DRect(samp9, uv0);\n" - " vec4 EncodedDepth = fract((texcol.r * (16777215.0f/16777216.0f)) * vec4(1.0f,256.0f,256.0f*256.0f,1.0f));\n" - " texcol = round(EncodedDepth * (16777216.0f/16777215.0f) * vec4(255.0f,255.0f,255.0f,15.0f)) / vec4(255.0f,255.0f,255.0f,15.0f);\n" + " vec4 EncodedDepth = fract((texcol.r * (16777215.0/16777216.0)) * vec4(1.0,256.0,256.0*256.0,1.0));\n" + " texcol = round(EncodedDepth * (16777216.0/16777215.0) * vec4(255.0,255.0,255.0,15.0)) / vec4(255.0,255.0,255.0,15.0);\n" " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];" "}\n"; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index d912df12a7..219d7a6506 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -59,7 +59,7 @@ static const char *VProgram = "void main()\n" "{\n" " uv0 = tex0;\n" - " gl_Position = vec4(rawpos, 0.0f, 1.0f);\n" + " gl_Position = vec4(rawpos, 0.0, 1.0);\n" "}\n"; void CreatePrograms() @@ -68,7 +68,7 @@ void CreatePrograms() const char *FProgramRgbToYuyv = "uniform sampler2DRect samp9;\n" "VARYIN vec2 uv0;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main()\n" "{\n" " vec3 c0 = texture2DRect(samp9, uv0).rgb;\n" @@ -77,26 +77,26 @@ void CreatePrograms() " vec3 y_const = vec3(0.257,0.504,0.098);\n" " vec3 u_const = vec3(-0.148,-0.291,0.439);\n" " vec3 v_const = vec3(0.439,-0.368,-0.071);\n" - " vec4 const3 = vec4(0.0625,0.5,0.0625f,0.5);\n" + " vec4 const3 = vec4(0.0625,0.5,0.0625,0.5);\n" " ocol0 = vec4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" "}\n"; const char *FProgramYuyvToRgb = "uniform sampler2DRect samp9;\n" "VARYIN vec2 uv0;\n" - "out vec4 ocol0;\n" + "COLOROUT(ocol0)\n" "void main()\n" "{\n" " vec4 c0 = texture2DRect(samp9, uv0).rgba;\n" " float f = step(0.5, fract(uv0.x));\n" " float y = mix(c0.b, c0.r, f);\n" - " float yComp = 1.164f * (y - 0.0625f);\n" - " float uComp = c0.g - 0.5f;\n" - " float vComp = c0.a - 0.5f;\n" - " ocol0 = vec4(yComp + (1.596f * vComp),\n" - " yComp - (0.813f * vComp) - (0.391f * uComp),\n" - " yComp + (2.018f * uComp),\n" - " 1.0f);\n" + " float yComp = 1.164 * (y - 0.0625);\n" + " float uComp = c0.g - 0.5;\n" + " float vComp = c0.a - 0.5;\n" + " ocol0 = vec4(yComp + (1.596 * vComp),\n" + " yComp - (0.813 * vComp) - (0.391 * uComp),\n" + " yComp + (2.018 * uComp),\n" + " 1.0);\n" "}\n"; ProgramShaderCache::CompileShader(s_rgbToYuyvProgram, VProgram, FProgramRgbToYuyv); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp index 3f4547a005..5df9602af9 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp @@ -135,6 +135,24 @@ void VertexManager::Draw(u32 stride) glDrawRangeElementsBaseVertex(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2], s_baseVertex); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } + } + else if (DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + { + if (triangle_index_size > 0) + { + glDrawElements(triangle_mode, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0]); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } + if (line_index_size > 0) + { + glDrawElements(GL_LINES, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1]); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } + if (point_index_size > 0) + { + glDrawElements(GL_POINTS, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]); + INCSTAT(stats.thisFrame.numIndexedDrawCalls); + } } else { if (triangle_index_size > 0) { @@ -151,7 +169,7 @@ void VertexManager::Draw(u32 stride) glDrawRangeElements(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]); INCSTAT(stats.thisFrame.numIndexedDrawCalls); } - } + } } void VertexManager::vFlush()