diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index 6e263aa7c3..f2872d93ad 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -514,15 +514,6 @@ const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num) return result; } -const char* WriteBinding(API_TYPE ApiType, const u32 num) -{ - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - return ""; - static char result[64]; - sprintf(result, "layout(binding = %d) ", num); - return result; -} - const char *WriteLocation(API_TYPE ApiType) { if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) @@ -560,29 +551,14 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType if (ApiType == API_OPENGL) { // A few required defines and ones that will make our lives a lot easier - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding || g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - WRITE(p, "#version 130\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - WRITE(p, "#extension GL_ARB_shading_language_420pack : enable\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); - WRITE(p, "#define ATTRIN in\n"); - WRITE(p, "#define ATTROUT out\n"); - WRITE(p, "#define VARYIN in\n"); - WRITE(p, "#define VARYOUT out\n"); - } - else - { - WRITE(p, "#version 120\n"); - WRITE(p, "#define ATTRIN attribute\n"); - WRITE(p, "#define ATTROUT attribute\n"); // Can't really be used, but provide it anyway - WRITE(p, "#define VARYIN varying\n"); - WRITE(p, "#define VARYOUT varying\n"); - } + WRITE(p, "#version 130\n"); + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); + WRITE(p, "#define ATTRIN in\n"); + WRITE(p, "#define ATTROUT out\n"); + WRITE(p, "#define VARYIN in\n"); + WRITE(p, "#define VARYOUT out\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) - WRITE(p, "#extension GL_ARB_explicit_attrib_location : enable\n"); // Silly differences WRITE(p, "#define float2 vec2\n"); WRITE(p, "#define float3 vec3\n"); @@ -603,7 +579,7 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType WRITE(p, "}\n"); for (int i = 0; i < 8; ++i) - WRITE(p, "%suniform sampler2D samp%d;\n", WriteBinding(ApiType, i), i); + WRITE(p, "uniform sampler2D samp%d;\n", i); } else { @@ -659,27 +635,10 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType if (ApiType == API_OPENGL) { - // GLSL doesn't do main arguments - // Once we switch to GLSL 1.3 we will bind a lot of these. - + WRITE(p, "out float4 ocol0;\n"); if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) - { - // This won't get hit unless we support GL 3.3 - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - { - WRITE(p, "layout(location = 0) out float4 ocol0;\n"); - WRITE(p, "layout(location = 0, index = 1) out float4 ocol1;\n"); - } - else - { - WRITE(p, "out float4 ocol0;\n"); - WRITE(p, "out float4 ocol1;\n"); - } - } - else - { - WRITE(p, "float4 ocol0;\n"); - } + WRITE(p, "out float4 ocol1;\n"); + if (DepthTextureEnable) WRITE(p, "float depth;\n"); WRITE(p, "float4 rawpos = gl_FragCoord;\n"); @@ -790,8 +749,6 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType { if (DepthTextureEnable) WRITE(p, "\tgl_FragDepth = depth;\n"); - if (dstAlphaMode != DSTALPHA_DUAL_SOURCE_BLEND) - WRITE(p, "\tgl_FragData[0] = ocol0;\n"); } WRITE(p, "\tdiscard;\n"); if(ApiType != API_D3D11) @@ -957,16 +914,15 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) { // Colors will be blended against the alpha from ocol1... - WRITE(p, "\tocol1 = ocol0;\n"); + WRITE(p, "\tocol1 = prev;\n"); // ...and the alpha from ocol0 will be written to the framebuffer. WRITE(p, "\tocol0.a = " I_ALPHA"[0].a;\n"); } + if (ApiType == API_OPENGL) { if (DepthTextureEnable) WRITE(p, "\tgl_FragDepth = depth;\n"); - if (dstAlphaMode != DSTALPHA_DUAL_SOURCE_BLEND) - WRITE(p, "\tgl_FragData[0] = ocol0;\n"); } WRITE(p, "}\n"); if (text[sizeof(text) - 1] != 0x7C) diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp index 871043da5d..87c2f51329 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp @@ -93,7 +93,7 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) // [1] width and height of destination texture in pixels // Two were merged for GLSL if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - WRITE(p, "layout(std140%s) uniform PSBlock {\n", g_ActiveConfig.backend_info.bSupportsGLSLBinding ? ", binding = 1" : ""); + WRITE(p, "layout(std140) uniform PSBlock {\n"); WRITE(p, "%sfloat4 " I_COLORS"[2] %s;\n", WriteLocation(ApiType), WriteRegister(ApiType, "c", C_COLORS)); @@ -105,8 +105,6 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) float samples = (float)GetEncodedSampleCount(format); if (ApiType == API_OPENGL) { - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - WRITE(p, "layout(binding = 0) "); WRITE(p, "uniform sampler2DRect samp0;\n"); } else if (ApiType & API_D3D9) @@ -181,7 +179,7 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) // [1] width and height of destination texture in pixels // Two were merged for GLSL if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - WRITE(p, "layout(std140%s) uniform PSBlock {\n", g_ActiveConfig.backend_info.bSupportsGLSLBinding ? ", binding = 1" : ""); + WRITE(p, "layout(std140) uniform PSBlock {\n"); WRITE(p, "%sfloat4 " I_COLORS"[2] %s;\n", WriteLocation(ApiType), WriteRegister(ApiType, "c", C_COLORS)); if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) WRITE(p, "};\n"); @@ -192,8 +190,6 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) // 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments if (ApiType == API_OPENGL) { - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - WRITE(p, "layout(binding = 0) "); WRITE(p, "uniform sampler2DRect samp0;\n"); } else if (ApiType & API_D3D9) @@ -848,16 +844,10 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType) if (ApiType == API_OPENGL) { // A few required defines and ones that will make our lives a lot easier - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding || g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - WRITE(p, "#version 130\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - WRITE(p, "#extension GL_ARB_shading_language_420pack : enable\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); - } - else - WRITE(p, "#version 120\n"); + WRITE(p, "#version 130\n"); + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); + // Silly differences WRITE(p, "#define float2 vec2\n"); WRITE(p, "#define float3 vec3\n"); diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index de4a93d65b..9c4d717c84 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -164,8 +164,7 @@ char* GenerateVSOutputStruct(char* p, u32 components, API_TYPE ApiType) } extern const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num); -extern const char* WriteBinding(API_TYPE ApiType, const u32 num); -const char *WriteLocation(API_TYPE ApiType); +extern const char *WriteLocation(API_TYPE ApiType); const char *GenerateVertexShaderCode(u32 components, API_TYPE ApiType) { @@ -188,28 +187,15 @@ const char *GenerateVertexShaderCode(u32 components, API_TYPE ApiType) if (ApiType == API_OPENGL) { // A few required defines and ones that will make our lives a lot easier - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding || g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - WRITE(p, "#version 130\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - WRITE(p, "#extension GL_ARB_shading_language_420pack : enable\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); - WRITE(p, "#define ATTRIN in\n"); - WRITE(p, "#define ATTROUT out\n"); - WRITE(p, "#define VARYIN in\n"); - WRITE(p, "#define VARYOUT out\n"); - } - else - { - WRITE(p, "#version 120\n"); - WRITE(p, "#define ATTRIN attribute\n"); - WRITE(p, "#define ATTROUT attribute\n"); // Can't really be used, but provide it anyway - WRITE(p, "#define VARYIN varying\n"); - WRITE(p, "#define VARYOUT varying\n"); - } - if (g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) - WRITE(p, "#extension GL_ARB_explicit_attrib_location : enable\n"); + + WRITE(p, "#version 130\n"); + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + WRITE(p, "#extension GL_ARB_uniform_buffer_object : enable\n"); + WRITE(p, "#define ATTRIN in\n"); + WRITE(p, "#define ATTROUT out\n"); + WRITE(p, "#define VARYIN in\n"); + WRITE(p, "#define VARYOUT out\n"); + // Silly differences WRITE(p, "#define float2 vec2\n"); WRITE(p, "#define float3 vec3\n"); @@ -246,24 +232,12 @@ const char *GenerateVertexShaderCode(u32 components, API_TYPE ApiType) if (components & VB_HAS_NRM0) WRITE(p, " float3 rawnorm0 = gl_Normal; // NORMAL0,\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) - { - if (components & VB_HAS_POSMTXIDX) - WRITE(p, "layout(location = %d) ATTRIN float fposmtx;\n", SHADER_POSMTX_ATTRIB); - if (components & VB_HAS_NRM1) - WRITE(p, "layout(location = %d) ATTRIN float3 rawnorm1;\n", SHADER_NORM1_ATTRIB); - if (components & VB_HAS_NRM2) - WRITE(p, "layout(location = %d) ATTRIN float3 rawnorm2;\n", SHADER_NORM2_ATTRIB); - } - else - { - if (components & VB_HAS_POSMTXIDX) - WRITE(p, "ATTRIN float fposmtx; // ATTR%d,\n", SHADER_POSMTX_ATTRIB); - if (components & VB_HAS_NRM1) - WRITE(p, "ATTRIN float3 rawnorm1; // ATTR%d,\n", SHADER_NORM1_ATTRIB); - if (components & VB_HAS_NRM2) - WRITE(p, "ATTRIN float3 rawnorm2; // ATTR%d,\n", SHADER_NORM2_ATTRIB); - } + if (components & VB_HAS_POSMTXIDX) + WRITE(p, "ATTRIN float fposmtx; // ATTR%d,\n", SHADER_POSMTX_ATTRIB); + if (components & VB_HAS_NRM1) + WRITE(p, "ATTRIN float3 rawnorm1; // ATTR%d,\n", SHADER_NORM1_ATTRIB); + if (components & VB_HAS_NRM2) + WRITE(p, "ATTRIN float3 rawnorm2; // ATTR%d,\n", SHADER_NORM2_ATTRIB); if (components & VB_HAS_COL0) WRITE(p, " float4 color0 = gl_Color; // COLOR0,\n"); diff --git a/Source/Core/VideoCommon/Src/VideoConfig.h b/Source/Core/VideoCommon/Src/VideoConfig.h index 8972d60bcb..15f148b613 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.h +++ b/Source/Core/VideoCommon/Src/VideoConfig.h @@ -164,10 +164,8 @@ struct VideoConfig bool bSupportsPixelLighting; bool bSupportsGLSL; - bool bSupportsGLSLBinding; bool bSupportsGLSLBlend; bool bSupportsGLSLUBO; - bool bSupportsGLSLATTRBind; bool bSupportsGLSLCache; } backend_info; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp index 129d3060b4..6226dfcd75 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp @@ -70,32 +70,30 @@ void PixelShaderCache::Init() s_displayCompileAlert = true; char pmatrixprog[2048]; - sprintf(pmatrixprog, "#version %s\n" + sprintf(pmatrixprog, "#version 130\n" "#extension GL_ARB_texture_rectangle : enable\n" "%s\n" - "%s\n" - "%suniform sampler2DRect samp0;\n" + "uniform sampler2DRect samp0;\n" "%s\n" "%svec4 " I_COLORS"[7];\n" "%s\n" + "out vec4 ocol0;\n" + "\n" "void main(){\n" - "vec4 Temp0, Temp1;\n" - "vec4 K0 = vec4(0.5, 0.5, 0.5, 0.5);\n" - "Temp0 = texture2DRect(samp0, gl_TexCoord[0].xy);\n" - "Temp0 = Temp0 * " I_COLORS"[%d];\n" - "Temp0 = Temp0 + K0;\n" - "Temp0 = floor(Temp0);\n" - "Temp0 = Temp0 * " I_COLORS"[%d];\n" - "Temp1.x = dot(Temp0, " I_COLORS"[%d]);\n" - "Temp1.y = dot(Temp0, " I_COLORS"[%d]);\n" - "Temp1.z = dot(Temp0, " I_COLORS"[%d]);\n" - "Temp1.w = dot(Temp0, " I_COLORS"[%d]);\n" - "gl_FragData[0] = Temp1 + " I_COLORS"[%d];\n" + " vec4 Temp0, Temp1;\n" + " vec4 K0 = vec4(0.5, 0.5, 0.5, 0.5);\n" + " Temp0 = texture2DRect(samp0, gl_TexCoord[0].xy);\n" + " Temp0 = Temp0 * " I_COLORS"[%d];\n" + " Temp0 = Temp0 + K0;\n" + " Temp0 = floor(Temp0);\n" + " Temp0 = Temp0 * " I_COLORS"[%d];\n" + " Temp1.x = dot(Temp0, " I_COLORS"[%d]);\n" + " Temp1.y = dot(Temp0, " I_COLORS"[%d]);\n" + " Temp1.z = dot(Temp0, " I_COLORS"[%d]);\n" + " Temp1.w = dot(Temp0, " I_COLORS"[%d]);\n" + " ocol0 = Temp1 + " I_COLORS"[%d];\n" "}\n", - (g_ActiveConfig.backend_info.bSupportsGLSLUBO || g_ActiveConfig.backend_info.bSupportsGLSLBinding) ? "130" : "120", - g_ActiveConfig.backend_info.bSupportsGLSLBinding ? "#extension GL_ARB_shading_language_420pack : enable" : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "#extension GL_ARB_uniform_buffer_object : enable" : "", - g_ActiveConfig.backend_info.bSupportsGLSLBinding ? "layout(binding = 0) " : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "layout(std140) uniform PSBlock {" : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "" : "uniform ", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "};" : "", @@ -108,42 +106,40 @@ void PixelShaderCache::Init() s_ColorMatrixProgram.Destroy(); } - sprintf(pmatrixprog, "#version %s\n" + sprintf(pmatrixprog, "#version 130\n" "#extension GL_ARB_texture_rectangle : enable\n" "%s\n" - "%s\n" - "%suniform sampler2DRect samp0;\n" + "uniform sampler2DRect samp0;\n" "%s\n" "%svec4 " I_COLORS"[5];\n" "%s\n" + "out vec4 ocol0;\n" + "\n" "void main(){\n" - "vec4 R0, R1, R2;\n" - "vec4 K0 = vec4(255.99998474121, 0.003921568627451, 256.0, 0.0);\n" - "vec4 K1 = vec4(15.0, 0.066666666666, 0.0, 0.0);\n" - "R2 = texture2DRect(samp0, gl_TexCoord[0].xy);\n" - "R0.x = R2.x * K0.x;\n" - "R0.x = floor(R0).x;\n" - "R0.yzw = (R0 - R0.x).yzw;\n" - "R0.yzw = (R0 * K0.z).yzw;\n" - "R0.y = floor(R0).y;\n" - "R0.zw = (R0 - R0.y).zw;\n" - "R0.zw = (R0 * K0.z).zw;\n" - "R0.z = floor(R0).z;\n" - "R0.w = R0.x;\n" - "R0 = R0 * K0.y;\n" - "R0.w = (R0 * K1.x).w;\n" - "R0.w = floor(R0).w;\n" - "R0.w = (R0 * K1.y).w;\n" - "R1.x = dot(R0, " I_COLORS"[%d]);\n" - "R1.y = dot(R0, " I_COLORS"[%d]);\n" - "R1.z = dot(R0, " I_COLORS"[%d]);\n" - "R1.w = dot(R0, " I_COLORS"[%d]);\n" - "gl_FragData[0] = R1 * " I_COLORS"[%d];\n" + " vec4 R0, R1, R2;\n" + " vec4 K0 = vec4(255.99998474121, 0.003921568627451, 256.0, 0.0);\n" + " vec4 K1 = vec4(15.0, 0.066666666666, 0.0, 0.0);\n" + " R2 = texture2DRect(samp0, gl_TexCoord[0].xy);\n" + " R0.x = R2.x * K0.x;\n" + " R0.x = floor(R0).x;\n" + " R0.yzw = (R0 - R0.x).yzw;\n" + " R0.yzw = (R0 * K0.z).yzw;\n" + " R0.y = floor(R0).y;\n" + " R0.zw = (R0 - R0.y).zw;\n" + " R0.zw = (R0 * K0.z).zw;\n" + " R0.z = floor(R0).z;\n" + " R0.w = R0.x;\n" + " R0 = R0 * K0.y;\n" + " R0.w = (R0 * K1.x).w;\n" + " R0.w = floor(R0).w;\n" + " R0.w = (R0 * K1.y).w;\n" + " R1.x = dot(R0, " I_COLORS"[%d]);\n" + " R1.y = dot(R0, " I_COLORS"[%d]);\n" + " R1.z = dot(R0, " I_COLORS"[%d]);\n" + " R1.w = dot(R0, " I_COLORS"[%d]);\n" + " ocol0 = R1 * " I_COLORS"[%d];\n" "}\n", - (g_ActiveConfig.backend_info.bSupportsGLSLUBO || g_ActiveConfig.backend_info.bSupportsGLSLBinding) ? "130" : "120", - g_ActiveConfig.backend_info.bSupportsGLSLBinding ? "#extension GL_ARB_shading_language_420pack : enable" : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "#extension GL_ARB_uniform_buffer_object : enable" : "", - g_ActiveConfig.backend_info.bSupportsGLSLBinding ? "layout(binding = 0) " : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "layout(std140) uniform PSBlock {" : "", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "" : "uniform ", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "};" : "", diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 1131b65309..46cd66ca35 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -61,18 +61,18 @@ const char *UniformNames[NUM_UNIFORMS] = void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) { - // Dunno why this is needed when I have the binding - // points statically set in the shader source - // We should only need these two functions when we don't support binding but do support UBO - // Driver Bug? Nvidia GTX 570, 290.xx Driver, Linux x64 + // Bind UBO if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - glUniformBlockBinding(entry.prog_id, glGetUniformBlockIndex(entry.prog_id, "PSBlock"), 1); - // Some things have no vertex shader - if (entry.vsid != 0) - glUniformBlockBinding(entry.prog_id, glGetUniformBlockIndex(entry.prog_id, "VSBlock"), 2); + GLint PSBlock_id = glGetUniformBlockIndex(entry.prog_id, "PSBlock"); + GLint VSBlock_id = glGetUniformBlockIndex(entry.prog_id, "VSBlock"); + + if(PSBlock_id != -1) + glUniformBlockBinding(entry.prog_id, PSBlock_id, 1); + if(VSBlock_id != -1) + glUniformBlockBinding(entry.prog_id, VSBlock_id, 2); } - + // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 // We can remove this @@ -84,40 +84,32 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) for (int a = 8; a < NUM_UNIFORMS; ++a) entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + // Bind Texture Sampler + for (int a = 0; a < 8; ++a) { - for (int a = 0; a < 8; ++a) - { - // Still need to get sampler locations since we aren't binding them statically in the shaders - entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); - if (entry.UniformLocations[a] != -1) - glUniform1i(entry.UniformLocations[a], a); - } + // Still need to get sampler locations since we aren't binding them statically in the shaders + entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); + if (entry.UniformLocations[a] != -1) + glUniform1i(entry.UniformLocations[a], a); } + } void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& entry ) { - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + if (g_ActiveConfig.backend_info.bSupportsGLSLBlend) { - if (g_ActiveConfig.backend_info.bSupportsGLSLBlend) - { - // So we don't support binding, but we do support extended blending - // So we need to set a few more things here. - // Bind our out locations - glBindFragDataLocationIndexed(entry.prog_id, 0, 0, "ocol0"); - glBindFragDataLocationIndexed(entry.prog_id, 0, 1, "ocol1"); - } + // So we do support extended blending + // So we need to set a few more things here. + // Bind our out locations + glBindFragDataLocationIndexed(entry.prog_id, 0, 0, "ocol0"); + glBindFragDataLocationIndexed(entry.prog_id, 0, 1, "ocol1"); } // Need to set some attribute locations - if (entry.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) - { - // We have no vertex Shader - glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); - glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); - glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); - } + glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); + glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index af047ffa9f..892dde383b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -315,20 +315,16 @@ Renderer::Renderer() s_bHaveFramebufferBlit = strstr(ptoken, "GL_EXT_framebuffer_blit") != NULL; s_bHaveCoverageMSAA = strstr(ptoken, "GL_NV_framebuffer_multisample_coverage") != NULL; - if (glewIsSupported("GL_ARB_shading_language_420pack")) - g_Config.backend_info.bSupportsGLSLBinding = true; if (glewIsSupported("GL_ARB_blend_func_extended")) g_Config.backend_info.bSupportsGLSLBlend = true; if (glewIsSupported("GL_ARB_uniform_buffer_object")) g_Config.backend_info.bSupportsGLSLUBO = true; - if ((g_Config.backend_info.bSupportsGLSLBinding || g_Config.backend_info.bSupportsGLSLUBO) && glewIsSupported("GL_ARB_explicit_attrib_location")) - g_Config.backend_info.bSupportsGLSLATTRBind = true; if (glewIsSupported("GL_ARB_get_program_binary")) g_Config.backend_info.bSupportsGLSLCache = true; UpdateActiveConfig(); - OSD::AddMessage(StringFromFormat("Supports Binding: %s UBOs: %s Cache: %s", - g_ActiveConfig.backend_info.bSupportsGLSLBinding ? "True" : "False", + OSD::AddMessage(StringFromFormat("Supports Blending: %s UBOs: %s Cache: %s", + g_ActiveConfig.backend_info.bSupportsGLSLBlend ? "True" : "False", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "True" : "False", g_ActiveConfig.backend_info.bSupportsGLSLCache ? "True" : "False").c_str(), 5000); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index e8a6bd1c06..c884a18c60 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -69,106 +69,49 @@ static int s_cached_srcHeight = 0; void CreateRgbToYuyvProgram() { // Output is BGRA because that is slightly faster than RGBA. - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - { - const char *FProgram = - "#version 130\n" - "#extension GL_ARB_texture_rectangle : enable\n" - "#extension GL_ARB_shading_language_420pack : enable\n" - "#extension GL_ARB_explicit_attrib_location : enable\n" - "layout(binding = 0) uniform sampler2DRect samp0;\n" - "void main()\n" - "{\n" - " vec2 uv1 = vec2(gl_TexCoord[0].x + 1.0f, gl_TexCoord[0].y);\n" - " vec3 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgb;\n" - " vec3 c1 = texture2DRect(samp0, uv1).rgb;\n" - " vec3 y_const = vec3(0.257f,0.504f,0.098f);\n" - " vec3 u_const = vec3(-0.148f,-0.291f,0.439f);\n" - " vec3 v_const = vec3(0.439f,-0.368f,-0.071f);\n" - " vec4 const3 = vec4(0.0625f,0.5f,0.0625f,0.5f);\n" - " vec3 c01 = (c0 + c1) * 0.5f;\n" - " gl_FragData[0] = vec4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" - "}\n"; - if (!PixelShaderCache::CompilePixelShader(s_rgbToYuyvProgram, FProgram)) - ERROR_LOG(VIDEO, "Failed to create RGB to YUYV fragment program."); - } - else - { - const char *FProgram = - "#version 120\n" - "#extension GL_ARB_texture_rectangle : enable\n" - "uniform sampler2DRect samp0;\n" - "void main()\n" - "{\n" - " vec2 uv1 = vec2(gl_TexCoord[0].x + 1.0f, gl_TexCoord[0].y);\n" - " vec3 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgb;\n" - " vec3 c1 = texture2DRect(samp0, uv1).rgb;\n" - " vec3 y_const = vec3(0.257f,0.504f,0.098f);\n" - " vec3 u_const = vec3(-0.148f,-0.291f,0.439f);\n" - " vec3 v_const = vec3(0.439f,-0.368f,-0.071f);\n" - " vec4 const3 = vec4(0.0625f,0.5f,0.0625f,0.5f);\n" - " vec3 c01 = (c0 + c1) * 0.5f;\n" - " gl_FragData[0] = vec4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" - "}\n"; - if (!PixelShaderCache::CompilePixelShader(s_rgbToYuyvProgram, FProgram)) - ERROR_LOG(VIDEO, "Failed to create RGB to YUYV fragment program."); - } + const char *FProgram = + "#version 130\n" + "#extension GL_ARB_texture_rectangle : enable\n" + "uniform sampler2DRect samp0;\n" + "void main()\n" + "{\n" + " vec2 uv1 = vec2(gl_TexCoord[0].x + 1.0f, gl_TexCoord[0].y);\n" + " vec3 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgb;\n" + " vec3 c1 = texture2DRect(samp0, uv1).rgb;\n" + " vec3 y_const = vec3(0.257f,0.504f,0.098f);\n" + " vec3 u_const = vec3(-0.148f,-0.291f,0.439f);\n" + " vec3 v_const = vec3(0.439f,-0.368f,-0.071f);\n" + " vec4 const3 = vec4(0.0625f,0.5f,0.0625f,0.5f);\n" + " vec3 c01 = (c0 + c1) * 0.5f;\n" + " gl_FragData[0] = vec4(dot(c1,y_const),dot(c01,u_const),dot(c0,y_const),dot(c01, v_const)) + const3;\n" + "}\n"; + if (!PixelShaderCache::CompilePixelShader(s_rgbToYuyvProgram, FProgram)) + ERROR_LOG(VIDEO, "Failed to create RGB to YUYV fragment program."); } void CreateYuyvToRgbProgram() { - if (g_ActiveConfig.backend_info.bSupportsGLSLBinding) - { - const char *FProgram = - "#version 130\n" - "#extension GL_ARB_texture_rectangle : enable\n" - "#extension GL_ARB_shading_language_420pack : enable\n" - "#extension GL_ARB_explicit_attrib_location : enable\n" - "layout(binding = 0) uniform sampler2DRect samp0;\n" - "void main()\n" - "{\n" - " vec4 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgba;\n" + const char *FProgram = + "#version 130\n" + "#extension GL_ARB_texture_rectangle : enable\n" + "uniform sampler2DRect samp0;\n" + "void main()\n" + "{\n" + " vec4 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgba;\n" - " float f = step(0.5, fract(gl_TexCoord[0].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" + " float f = step(0.5, fract(gl_TexCoord[0].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" - " gl_FragData[0] = vec4(yComp + (1.596f * vComp),\n" - " yComp - (0.813f * vComp) - (0.391f * uComp),\n" - " yComp + (2.018f * uComp),\n" - " 1.0f);\n" - "}\n"; - if (!PixelShaderCache::CompilePixelShader(s_yuyvToRgbProgram, FProgram)) - ERROR_LOG(VIDEO, "Failed to create YUYV to RGB fragment program."); - } - else - { - const char *FProgram = - "#version 120\n" - "#ifdef GL_ARB_texture_rectangle\n" - "#extension GL_ARB_texture_rectangle : require\n" - "#endif\n" - "uniform sampler2DRect samp0;\n" - "void main()\n" - "{\n" - " vec4 c0 = texture2DRect(samp0, gl_TexCoord[0].xy).rgba;\n" - - " float f = step(0.5, fract(gl_TexCoord[0].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" - - " gl_FragData[0] = vec4(yComp + (1.596f * vComp),\n" - " yComp - (0.813f * vComp) - (0.391f * uComp),\n" - " yComp + (2.018f * uComp),\n" - " 1.0f);\n" - "}\n"; - if (!PixelShaderCache::CompilePixelShader(s_yuyvToRgbProgram, FProgram)) - ERROR_LOG(VIDEO, "Failed to create YUYV to RGB fragment program."); - } + " gl_FragData[0] = vec4(yComp + (1.596f * vComp),\n" + " yComp - (0.813f * vComp) - (0.391f * uComp),\n" + " yComp + (2.018f * uComp),\n" + " 1.0f);\n" + "}\n"; + if (!PixelShaderCache::CompilePixelShader(s_yuyvToRgbProgram, FProgram)) + ERROR_LOG(VIDEO, "Failed to create YUYV to RGB fragment program."); } FRAGMENTSHADER &GetOrCreateEncodingShader(u32 format) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp index d1d2e44a64..1bd196e312 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp @@ -224,8 +224,9 @@ void VertexManager::vFlush() ProgramShaderCache::SetBothShaders(ps->glprogid, vs->glprogid); if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - PixelShaderManager::SetConstants(); // Need to set these again, if we don't support UBO + // Need to set these again, if we don't support UBO VertexShaderManager::SetConstants(); + PixelShaderManager::SetConstants(); } // only update alpha