diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp index 7ef96db26f..6982b97e60 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp @@ -76,31 +76,16 @@ const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num) return result; } -const char *WriteLocation(API_TYPE ApiType) -{ - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - return ""; - static char result[64]; - sprintf(result, "uniform "); - return result; -} - // block dimensions : widthStride, heightStride // texture dims : width, height, x offset, y offset void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) { - // [0] left, top, right, bottom of source rectangle within source texture - // [1] width and height of destination texture in pixels - // Two were merged for GLSL - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - 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"); + // [0] left, top, right, bottom of source rectangle within source texture + // [1] width and height of destination texture in pixels + // Two were merged for GLSL + WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS)); - float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); + float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); float blkH = (float)TexDecoder_GetBlockHeightInTexels(format); float samples = (float)GetEncodedSampleCount(format); if (ApiType == API_OPENGL) @@ -175,16 +160,12 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) // texture dims : width, height, x offset, y offset void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType) { - // [0] left, top, right, bottom of source rectangle within source texture - // [1] width and height of destination texture in pixels - // Two were merged for GLSL - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - 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"); + // [0] left, top, right, bottom of source rectangle within source texture + // [1] width and height of destination texture in pixels + // Two were merged for GLSL + WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS)); - float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); + float blkW = (float)TexDecoder_GetBlockWidthInTexels(format); float blkH = (float)TexDecoder_GetBlockHeightInTexels(format); // 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp index f1f284782f..e7b46081af 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp @@ -61,6 +61,8 @@ static FRAGMENTSHADER s_ColorMatrixProgram; static FRAGMENTSHADER s_DepthMatrixProgram; static GLuint s_ColorMatrixUniform; static GLuint s_DepthMatrixUniform; +static u32 s_ColorCbufid; +static u32 s_DepthCbufid; static VERTEXSHADER s_vProgram; struct VBOCache { @@ -318,10 +320,14 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo if(srcFormat == PIXELFMT_Z24) { ProgramShaderCache::SetBothShaders(s_DepthMatrixProgram.glprogid, s_vProgram.glprogid); - glUniform4fv(s_DepthMatrixUniform, 5, colmat); + if(s_DepthCbufid != cbufid) + glUniform4fv(s_DepthMatrixUniform, 5, colmat); + s_DepthCbufid = cbufid; } else { ProgramShaderCache::SetBothShaders(s_ColorMatrixProgram.glprogid, s_vProgram.glprogid); - glUniform4fv(s_ColorMatrixUniform, 7, colmat); + if(s_ColorCbufid != cbufid) + glUniform4fv(s_ColorMatrixUniform, 7, colmat); + s_ColorCbufid = cbufid; } GL_REPORT_ERRORD(); @@ -543,6 +549,8 @@ TextureCache::TextureCache() s_ColorMatrixUniform = glGetUniformLocation(ProgramShaderCache::GetCurrentProgram(), "colmat"); ProgramShaderCache::SetBothShaders(s_DepthMatrixProgram.glprogid, s_vProgram.glprogid); s_DepthMatrixUniform = glGetUniformLocation(ProgramShaderCache::GetCurrentProgram(), "colmat"); + s_ColorCbufid = -1; + s_DepthCbufid = -1; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index e06f997d91..3c5d2f4f14 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -361,12 +361,14 @@ int EncodeToRamFromTexture(u32 address,GLuint source_texture, bool bFromZBuffer, ProgramShaderCache::SetBothShaders(texconv_shader.glprogid, s_vProgram.glprogid); float sampleStride = bScaleByHalf ? 2.f : 1.f; - TextureConversionShader::SetShaderParameters((float)expandedWidth, - (float)Renderer::EFBToScaledY(expandedHeight), // TODO: Why do we scale this? - (float)Renderer::EFBToScaledX(source.left), - (float)Renderer::EFBToScaledY(EFB_HEIGHT - source.top - expandedHeight), - Renderer::EFBToScaledXf(sampleStride), - Renderer::EFBToScaledYf(sampleStride)); + + float params[] = { + Renderer::EFBToScaledXf(sampleStride), Renderer::EFBToScaledYf(sampleStride), + 0.0f, 0.0f, + (float)expandedWidth, (float)Renderer::EFBToScaledY(expandedHeight)-1, + (float)Renderer::EFBToScaledX(source.left), (float)Renderer::EFBToScaledY(EFB_HEIGHT - source.top - expandedHeight) + }; + glUniform4fv(glGetUniformLocation(ProgramShaderCache::GetCurrentProgram(), I_COLORS), 2, params); TargetRectangle scaledSource; scaledSource.top = 0;