From a357c772578b4dabffe15127beaaab8e145da90e Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 30 Nov 2011 21:00:21 -0600 Subject: Add in GLSL setting again. PS and VS making. Untested and won't work for now. Add in program shader cache files. Readd NativeVertexFormat stuffs. Add in PS and VS cache things. SetShaders in places. Fixed EFB cache index computations in OpenGL renderer. The previous computation was very likely to go out of array bounds, which could result in crashes on EFB access. Also, the cache size was rounded down instead of up. This is a problem since EFB_HEIGHT (528) is not a multiple of EFB_CACHE_RECT_SIZE (64). --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 150 +++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp new file mode 100644 index 0000000000..fc056aed63 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -0,0 +1,150 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#include "ProgramShaderCache.h" + +namespace OGL +{ + GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; + ProgramShaderCache::PCache ProgramShaderCache::pshaders; + + std::pair ProgramShaderCache::CurrentShaderProgram; + const char *UniformNames[NUM_UNIFORMS] = { + // SAMPLERS + "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", + // PIXEL SHADER UNIFORMS + I_COLORS, + I_KCOLORS, + I_ALPHA, + I_TEXDIMS, + I_ZBIAS , + I_INDTEXSCALE , + I_INDTEXMTX, + I_FOG, + I_PLIGHTS, + I_PMATERIALS, + // VERTEX SHADER UNIFORMS + I_POSNORMALMATRIX, + I_PROJECTION , + I_MATERIALS, + I_LIGHTS, + I_TEXMATRICES, + I_TRANSFORMMATRICES , + I_NORMALMATRICES , + I_POSTTRANSFORMMATRICES, + I_DEPTHPARAMS, + }; + + void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) + { + PROGRAMUID uid; + CurrentFShader = PS; + CurrentVShader = VS; + + + GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); + + if(uid.uid.id == 0) + { + CurrentProgram = 0; + glUseProgram(0); + return; + } + + // Fragment shaders can survive without Vertex Shaders + // We have a valid fragment shader, let's create our program + std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + PCache::iterator iter = pshaders.find(ShaderPair); + if (iter != pshaders.end()) + { + PCacheEntry &entry = iter->second; + glUseProgram(entry.program.glprogid); + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + return; + } + PCacheEntry entry; + entry.program.vsid = CurrentVShader; + entry.program.psid = CurrentFShader; + entry.program.glprogid = glCreateProgram(); + + // Right, the program is created now + // Let's attach everything + if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out + glAttachShader(entry.program.glprogid, entry.program.vsid); + glAttachShader(entry.program.glprogid, entry.program.psid); + glLinkProgram(entry.program.glprogid); + //checkForGLError("linking program"); + glUseProgram(entry.program.glprogid); + //checkForGLError("using program"); + + // We cache our uniform locations for now + // Once we move up to a newer version of GLSL, ~1.30 + // We can remove this + + //For some reason this fails on my hardware + //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + //Got to do it this crappy way. + for(int a = 0; a < NUM_UNIFORMS; ++a) + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + + // Need to get some attribute locations + if(uid.uid.vsid != 0) // We have no vertex Shader + { + entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); + entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); + entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); + if(entry.program.attrLoc[0] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[0]); + if(entry.program.attrLoc[1] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[1]); + if(entry.program.attrLoc[2] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[2]); + } + else + entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; + + + pshaders[ShaderPair] = entry; + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + } + + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } + + GLint ProgramShaderCache::GetAttr(int num) + { + return pshaders[CurrentShaderProgram].program.attrLoc[num]; + } + PROGRAMSHADER ProgramShaderCache::GetShaderProgram() + { + return pshaders[CurrentShaderProgram].program; + } + + void ProgramShaderCache::Shutdown(void) + { + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); iter++) + iter->second.Destroy(); + pshaders.clear(); + } +} + +void GetProgramShaderId(PROGRAMUID *uid, GLuint _v, GLuint _p) +{ + uid->uid.vsid = _v; + uid->uid.psid = _p; +} -- cgit v1.2.3 From 4a84c6f742efb7a450d85791cd39d31ee0968812 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 9 Dec 2011 17:30:05 -0600 Subject: Add in UBOs, doesn't work yet. Still debugging here. --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 37 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index fc056aed63..776280103e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -14,12 +14,15 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ + #include "ProgramShaderCache.h" +#include namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; + GLuint ProgramShaderCache::UBOBuffers[2]; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -85,12 +88,14 @@ namespace OGL // Let's attach everything if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out glAttachShader(entry.program.glprogid, entry.program.vsid); + glAttachShader(entry.program.glprogid, entry.program.psid); + glLinkProgram(entry.program.glprogid); - //checkForGLError("linking program"); + glUseProgram(entry.program.glprogid); - //checkForGLError("using program"); + // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 // We can remove this @@ -122,18 +127,40 @@ namespace OGL CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; } - + void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) + { + assert(Buffer > 1); + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[Buffer]); + // glBufferSubData expects data in bytes, so multiply count by four + // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location + glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4, (void*)&f[0]); + } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) { return pshaders[CurrentShaderProgram].program.attrLoc[num]; } - PROGRAMSHADER ProgramShaderCache::GetShaderProgram() + PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) { return pshaders[CurrentShaderProgram].program; } - + void ProgramShaderCache::Init(void) + { + glGenBuffers(2, UBOBuffers); + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); + // We multiply by *4*4 because we need to get down to basic machine units. + // So multiply by four to get how many floats we have from vec4s + // Then once more to get bytes + glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); + // Now bind the buffer to the index point + // We know PS is 0 since we have it statically set in the shader + glBindBufferBase(GL_UNIFORM_BUFFER, 0, UBOBuffers[0]); + // Repeat for VS shader + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); + glBufferData(GL_UNIFORM_BUFFER, C_VENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); + glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[1]); + } void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); -- cgit v1.2.3 From 2fbca145cb9c559fed0be8e57c954e91e803ff8a Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 9 Dec 2011 19:14:02 -0600 Subject: Remove bSupportsGLSLLocation since it won't work how I expect it. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 776280103e..c7c8624069 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -92,7 +92,7 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.psid); glLinkProgram(entry.program.glprogid); - + glUseProgram(entry.program.glprogid); -- cgit v1.2.3 From c82b92bfc2203defad093a2e55adedeafed6c7ff Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 9 Dec 2011 21:15:15 -0600 Subject: Fix one error. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index c7c8624069..9fd3479e1d 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -94,7 +94,6 @@ namespace OGL glLinkProgram(entry.program.glprogid); glUseProgram(entry.program.glprogid); - // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 -- cgit v1.2.3 From b105d70339040bf0785e41629f0d4a1557d757b8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 01:56:37 -0600 Subject: Firin ma lazer --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 9fd3479e1d..b2bb6b6351 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -94,7 +94,15 @@ namespace OGL glLinkProgram(entry.program.glprogid); glUseProgram(entry.program.glprogid); - + + GLint Info = -1; + GLuint Indice = 1; + //glGetIntegeri_v(GL_UNIFORM_BLOCK_DATA_SIZE, 4, &Info); + //glGetIntegerv(GL_UNIFORM_BLOCK_DATA_SIZE, &Info); + glGetActiveUniformsiv(entry.program.glprogid, 1, &Indice, + GL_UNIFORM_SIZE, &Info); + printf("Minimum size: %d\n", Info); + // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 // We can remove this @@ -132,7 +140,8 @@ namespace OGL glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[Buffer]); // glBufferSubData expects data in bytes, so multiply count by four // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location - glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4, (void*)&f[0]); + glBufferSubData(GL_UNIFORM_BUFFER_EXT, offset * 4 * 4, count * 4 * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } @@ -151,14 +160,15 @@ namespace OGL // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, 1024 *1024 *1024, NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferBase(GL_UNIFORM_BUFFER, 0, UBOBuffers[0]); + glBindBufferRange(GL_UNIFORM_BUFFER, 4, UBOBuffers[0], 0, (C_PENVCONST_END * 4 * 4) - (C_PENVCONST_END * 4 * 4 % 256) + 256); // Repeat for VS shader glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, C_VENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[1]); + glBufferData(GL_UNIFORM_BUFFER, 1024*1024*1024, NULL, GL_DYNAMIC_DRAW); + glBindBufferRange(GL_UNIFORM_BUFFER, 5, UBOBuffers[1], 0, (C_VENVCONST_END * 4 * 4) - (C_VENVCONST_END * 4 * 4 % 256) + 256); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } void ProgramShaderCache::Shutdown(void) { -- cgit v1.2.3 From ce7a54f32af6614a5f9160dbbe53ee98a87109fb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 01:57:27 -0600 Subject: Firin ma lazer --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b2bb6b6351..322950edf0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -140,7 +140,7 @@ namespace OGL glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[Buffer]); // glBufferSubData expects data in bytes, so multiply count by four // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location - glBufferSubData(GL_UNIFORM_BUFFER_EXT, offset * 4 * 4, count * 4 * 4, f); + glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); glBindBuffer(GL_UNIFORM_BUFFER, 0); } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } -- cgit v1.2.3 From 904adb9e3dbc2af4c34740022ecabe3c1493c725 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 02:02:22 -0600 Subject: More for Billiard <3 --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 25 +++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 322950edf0..e174cf2641 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -17,7 +17,13 @@ #include "ProgramShaderCache.h" #include - +static GLenum checkForGLError(const char * situation) +{ + GLenum error = glGetError(); + if (error != GL_NO_ERROR) + printf("Error: %d -- %s\n", error, situation); + return error; +} namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; @@ -94,14 +100,8 @@ namespace OGL glLinkProgram(entry.program.glprogid); glUseProgram(entry.program.glprogid); + checkForGLError("User"); - GLint Info = -1; - GLuint Indice = 1; - //glGetIntegeri_v(GL_UNIFORM_BLOCK_DATA_SIZE, 4, &Info); - //glGetIntegerv(GL_UNIFORM_BLOCK_DATA_SIZE, &Info); - glGetActiveUniformsiv(entry.program.glprogid, 1, &Indice, - GL_UNIFORM_SIZE, &Info); - printf("Minimum size: %d\n", Info); // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 @@ -160,15 +160,16 @@ namespace OGL // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, 1024 *1024 *1024, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, 1024 *1024, NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferRange(GL_UNIFORM_BUFFER, 4, UBOBuffers[0], 0, (C_PENVCONST_END * 4 * 4) - (C_PENVCONST_END * 4 * 4 % 256) + 256); + glBindBufferBase(GL_UNIFORM_BUFFER, 4, UBOBuffers[0]); // Repeat for VS shader glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, 1024*1024*1024, NULL, GL_DYNAMIC_DRAW); - glBindBufferRange(GL_UNIFORM_BUFFER, 5, UBOBuffers[1], 0, (C_VENVCONST_END * 4 * 4) - (C_VENVCONST_END * 4 * 4 % 256) + 256); + glBufferData(GL_UNIFORM_BUFFER, 1024*1024, NULL, GL_DYNAMIC_DRAW); + glBindBufferBase(GL_UNIFORM_BUFFER, 5, UBOBuffers[1]); glBindBuffer(GL_UNIFORM_BUFFER, 0); + checkForGLError("Init"); } void ProgramShaderCache::Shutdown(void) { -- cgit v1.2.3 From 1f75ee49bf3003b10a41d93c0848573b38a7b440 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 07:38:30 -0600 Subject: UBO works for Pixel Shaders if Binding for UBO is zero, otherwise fails. Probably why Vertex shader UBO is failing. Too tired to investigate right now. --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 56 +++++++++++++++------- 1 file changed, 40 insertions(+), 16 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index e174cf2641..4b1f8b28d2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -17,12 +17,15 @@ #include "ProgramShaderCache.h" #include -static GLenum checkForGLError(const char * situation) +GLuint GLERR(const char *function) { - GLenum error = glGetError(); - if (error != GL_NO_ERROR) - printf("Error: %d -- %s\n", error, situation); - return error; + GLint err = glGetError(); + if (err != GL_NO_ERROR) + { + printf( "(%s) OpenGL error 0x%x - %s\n", + function, err, gluErrorString(err)); + } + return err; } namespace OGL { @@ -98,10 +101,19 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.psid); glLinkProgram(entry.program.glprogid); + GLsizei length = 0; + + glGetProgramiv(entry.program.glprogid, GL_INFO_LOG_LENGTH, &length); + if (length > 0) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetProgramInfoLog(entry.program.glprogid, length, &charsWritten, infoLog); + printf("Program info log:\n%s", infoLog); + delete[] infoLog; + } glUseProgram(entry.program.glprogid); - checkForGLError("User"); - // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 @@ -136,12 +148,22 @@ namespace OGL } void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) { + GLERR(""); assert(Buffer > 1); - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[Buffer]); + static int _Buffer = -1; + if(_Buffer != Buffer) + { + _Buffer = Buffer; + GLERR("bind"); + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); + } + // Query for the offsets of each block variable + // glBufferSubData expects data in bytes, so multiply count by four // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + GLERR("sub"); + } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } @@ -156,20 +178,22 @@ namespace OGL void ProgramShaderCache::Init(void) { glGenBuffers(2, UBOBuffers); + + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, 1024 *1024, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferBase(GL_UNIFORM_BUFFER, 4, UBOBuffers[0]); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, UBOBuffers[0]); + // Repeat for VS shader - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, 1024*1024, NULL, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, 5, UBOBuffers[1]); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - checkForGLError("Init"); + //glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); + //glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); + //glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); + GLERR("init"); } void ProgramShaderCache::Shutdown(void) { -- cgit v1.2.3 From d4a80ca3ecb595f849f4b7baebb491fa1fbc915d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 08:07:13 -0600 Subject: yay, UBOs work 100% now. --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 40 ++++++---------------- 1 file changed, 10 insertions(+), 30 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 4b1f8b28d2..073e8b430c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -17,16 +17,6 @@ #include "ProgramShaderCache.h" #include -GLuint GLERR(const char *function) -{ - GLint err = glGetError(); - if (err != GL_NO_ERROR) - { - printf( "(%s) OpenGL error 0x%x - %s\n", - function, err, gluErrorString(err)); - } - return err; -} namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; @@ -101,19 +91,14 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.psid); glLinkProgram(entry.program.glprogid); - GLsizei length = 0; - - glGetProgramiv(entry.program.glprogid, GL_INFO_LOG_LENGTH, &length); - if (length > 0) - { - GLsizei charsWritten; - GLchar* infoLog = new GLchar[length]; - glGetProgramInfoLog(entry.program.glprogid, length, &charsWritten, infoLog); - printf("Program info log:\n%s", infoLog); - delete[] infoLog; - } glUseProgram(entry.program.glprogid); + + // Dunno why this is needed when I have the binding + // points statically set in the shader source + // Driver Bug? Nvidia GTX 570, 290.xx Driver, Linux x64 + glUniformBlockBinding( entry.program.glprogid, 0, 1 ); + glUniformBlockBinding( entry.program.glprogid, 1, 2 ); // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 @@ -148,13 +133,11 @@ namespace OGL } void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) { - GLERR(""); assert(Buffer > 1); static int _Buffer = -1; if(_Buffer != Buffer) { _Buffer = Buffer; - GLERR("bind"); glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); } // Query for the offsets of each block variable @@ -162,7 +145,6 @@ namespace OGL // glBufferSubData expects data in bytes, so multiply count by four // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); - GLERR("sub"); } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } @@ -179,7 +161,6 @@ namespace OGL { glGenBuffers(2, UBOBuffers); - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s @@ -187,13 +168,12 @@ namespace OGL glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferBase(GL_UNIFORM_BUFFER, 0, UBOBuffers[0]); + glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[0]); // Repeat for VS shader - //glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - //glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); - //glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); - GLERR("init"); + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); + glBufferData(GL_UNIFORM_BUFFER, 1024*1024, NULL, GL_DYNAMIC_DRAW); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } void ProgramShaderCache::Shutdown(void) { -- cgit v1.2.3 From 5bcbf92f439663900a8fe60c1fee4eea2d96a192 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 14:35:37 -0600 Subject: Make sure to support everything even if GPU doesn't. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 073e8b430c..37923d2f47 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -96,9 +96,13 @@ namespace OGL // 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 - glUniformBlockBinding( entry.program.glprogid, 0, 1 ); - glUniformBlockBinding( entry.program.glprogid, 1, 2 ); + //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + { + glUniformBlockBinding( entry.program.glprogid, 0, 1 ); + glUniformBlockBinding( entry.program.glprogid, 1, 2 ); + } // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 -- cgit v1.2.3 From 5b06bbf87d75cb3d06dfae6c58c05ade0374a676 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 15:40:10 -0600 Subject: Use UBOs in every shader. I had missed a few. Only cache Uniform locations if we aren't using UBOs. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 37923d2f47..562843ebb1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -111,8 +111,9 @@ namespace OGL //For some reason this fails on my hardware //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); //Got to do it this crappy way. - for(int a = 0; a < NUM_UNIFORMS; ++a) - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + for(int a = 0; a < NUM_UNIFORMS; ++a) + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); // Need to get some attribute locations if(uid.uid.vsid != 0) // We have no vertex Shader @@ -176,7 +177,7 @@ namespace OGL // Repeat for VS shader glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, 1024*1024, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, 1024 * 1024, NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } void ProgramShaderCache::Shutdown(void) @@ -185,6 +186,7 @@ namespace OGL for (; iter != pshaders.end(); iter++) iter->second.Destroy(); pshaders.clear(); + glDeleteBuffers(2, UBOBuffers); } } -- cgit v1.2.3 From 67687a7b6d65dfa86d143da269a6b7163ad7d653 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 15:52:20 -0600 Subject: Make sure our UBO buffers are always aligned correctly. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 562843ebb1..c62016a853 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -164,20 +164,26 @@ namespace OGL } void ProgramShaderCache::Init(void) { + // We have to get the UBO alignment here because + // if we generate a buffer that isn't aligned + // then the UBO will fail. + GLint Align; + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); + glGenBuffers(2, UBOBuffers); glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, C_PENVCONST_END * 4 * 4, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, (C_PENVCONST_END * 4 * 4) - (C_PENVCONST_END * 4 * 4 % Align) + Align, NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[0]); // Repeat for VS shader glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, 1024 * 1024, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, (C_VENVCONST_END * 4 * 4) - (C_VENVCONST_END * 4 * 4 % Align) + Align, NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From a304af75fd11989597cc0df6946bc9a0de6734ad Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 10 Dec 2011 15:58:44 -0600 Subject: Make this pretty --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index c62016a853..d66fd9ec19 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -16,6 +16,8 @@ // http://code.google.com/p/dolphin-emu/ #include "ProgramShaderCache.h" +#include "MathUtil.h" + #include namespace OGL { @@ -176,14 +178,14 @@ namespace OGL // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, (C_PENVCONST_END * 4 * 4) - (C_PENVCONST_END * 4 * 4 % Align) + Align, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[0]); // Repeat for VS shader glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, (C_VENVCONST_END * 4 * 4) - (C_VENVCONST_END * 4 * 4 % Align) + Align, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From 3c6d0fc7106131098fe1a79d2deb0f39671c5252 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sun, 11 Dec 2011 11:08:18 +0100 Subject: 8 spaces indentation -> tabs --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 260 ++++++++++----------- 1 file changed, 130 insertions(+), 130 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index d66fd9ec19..15a5ff42a8 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -21,123 +21,123 @@ #include namespace OGL { - GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; - ProgramShaderCache::PCache ProgramShaderCache::pshaders; - GLuint ProgramShaderCache::UBOBuffers[2]; - - std::pair ProgramShaderCache::CurrentShaderProgram; - const char *UniformNames[NUM_UNIFORMS] = { - // SAMPLERS - "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", - // PIXEL SHADER UNIFORMS - I_COLORS, - I_KCOLORS, - I_ALPHA, - I_TEXDIMS, - I_ZBIAS , - I_INDTEXSCALE , - I_INDTEXMTX, - I_FOG, - I_PLIGHTS, - I_PMATERIALS, - // VERTEX SHADER UNIFORMS - I_POSNORMALMATRIX, - I_PROJECTION , - I_MATERIALS, - I_LIGHTS, - I_TEXMATRICES, - I_TRANSFORMMATRICES , - I_NORMALMATRICES , - I_POSTTRANSFORMMATRICES, - I_DEPTHPARAMS, - }; - - void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) - { - PROGRAMUID uid; - CurrentFShader = PS; - CurrentVShader = VS; - - - GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); - - if(uid.uid.id == 0) - { - CurrentProgram = 0; - glUseProgram(0); - return; - } - - // Fragment shaders can survive without Vertex Shaders - // We have a valid fragment shader, let's create our program - std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); - PCache::iterator iter = pshaders.find(ShaderPair); - if (iter != pshaders.end()) - { - PCacheEntry &entry = iter->second; - glUseProgram(entry.program.glprogid); - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; - return; - } - PCacheEntry entry; - entry.program.vsid = CurrentVShader; - entry.program.psid = CurrentFShader; - entry.program.glprogid = glCreateProgram(); - - // Right, the program is created now - // Let's attach everything - if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.program.glprogid, entry.program.vsid); - - glAttachShader(entry.program.glprogid, entry.program.psid); - - glLinkProgram(entry.program.glprogid); - - glUseProgram(entry.program.glprogid); - - // 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 - //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - { + GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; + ProgramShaderCache::PCache ProgramShaderCache::pshaders; + GLuint ProgramShaderCache::UBOBuffers[2]; + + std::pair ProgramShaderCache::CurrentShaderProgram; + const char *UniformNames[NUM_UNIFORMS] = { + // SAMPLERS + "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", + // PIXEL SHADER UNIFORMS + I_COLORS, + I_KCOLORS, + I_ALPHA, + I_TEXDIMS, + I_ZBIAS , + I_INDTEXSCALE , + I_INDTEXMTX, + I_FOG, + I_PLIGHTS, + I_PMATERIALS, + // VERTEX SHADER UNIFORMS + I_POSNORMALMATRIX, + I_PROJECTION , + I_MATERIALS, + I_LIGHTS, + I_TEXMATRICES, + I_TRANSFORMMATRICES , + I_NORMALMATRICES , + I_POSTTRANSFORMMATRICES, + I_DEPTHPARAMS, + }; + + void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) + { + PROGRAMUID uid; + CurrentFShader = PS; + CurrentVShader = VS; + + + GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); + + if(uid.uid.id == 0) + { + CurrentProgram = 0; + glUseProgram(0); + return; + } + + // Fragment shaders can survive without Vertex Shaders + // We have a valid fragment shader, let's create our program + std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + PCache::iterator iter = pshaders.find(ShaderPair); + if (iter != pshaders.end()) + { + PCacheEntry &entry = iter->second; + glUseProgram(entry.program.glprogid); + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + return; + } + PCacheEntry entry; + entry.program.vsid = CurrentVShader; + entry.program.psid = CurrentFShader; + entry.program.glprogid = glCreateProgram(); + + // Right, the program is created now + // Let's attach everything + if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out + glAttachShader(entry.program.glprogid, entry.program.vsid); + + glAttachShader(entry.program.glprogid, entry.program.psid); + + glLinkProgram(entry.program.glprogid); + + glUseProgram(entry.program.glprogid); + + // 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 + //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + { glUniformBlockBinding( entry.program.glprogid, 0, 1 ); glUniformBlockBinding( entry.program.glprogid, 1, 2 ); } - // We cache our uniform locations for now - // Once we move up to a newer version of GLSL, ~1.30 - // We can remove this - - //For some reason this fails on my hardware - //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); - //Got to do it this crappy way. - if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + // We cache our uniform locations for now + // Once we move up to a newer version of GLSL, ~1.30 + // We can remove this + + //For some reason this fails on my hardware + //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + //Got to do it this crappy way. + if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for(int a = 0; a < NUM_UNIFORMS; ++a) entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - // Need to get some attribute locations - if(uid.uid.vsid != 0) // We have no vertex Shader - { - entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); - entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); - entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); - if(entry.program.attrLoc[0] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[0]); - if(entry.program.attrLoc[1] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[1]); - if(entry.program.attrLoc[2] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[2]); - } - else - entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; - - - pshaders[ShaderPair] = entry; - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; - } + // Need to get some attribute locations + if(uid.uid.vsid != 0) // We have no vertex Shader + { + entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); + entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); + entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); + if(entry.program.attrLoc[0] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[0]); + if(entry.program.attrLoc[1] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[1]); + if(entry.program.attrLoc[2] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[2]); + } + else + entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; + + + pshaders[ShaderPair] = entry; + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + } void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) { assert(Buffer > 1); @@ -154,16 +154,16 @@ namespace OGL glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); } - GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } - - GLint ProgramShaderCache::GetAttr(int num) - { - return pshaders[CurrentShaderProgram].program.attrLoc[num]; - } - PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) - { - return pshaders[CurrentShaderProgram].program; - } + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } + + GLint ProgramShaderCache::GetAttr(int num) + { + return pshaders[CurrentShaderProgram].program.attrLoc[num]; + } + PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) + { + return pshaders[CurrentShaderProgram].program; + } void ProgramShaderCache::Init(void) { // We have to get the UBO alignment here because @@ -188,18 +188,18 @@ namespace OGL glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } - void ProgramShaderCache::Shutdown(void) - { - PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); iter++) - iter->second.Destroy(); - pshaders.clear(); - glDeleteBuffers(2, UBOBuffers); - } + void ProgramShaderCache::Shutdown(void) + { + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); iter++) + iter->second.Destroy(); + pshaders.clear(); + glDeleteBuffers(2, UBOBuffers); + } } void GetProgramShaderId(PROGRAMUID *uid, GLuint _v, GLuint _p) { - uid->uid.vsid = _v; - uid->uid.psid = _p; + uid->uid.vsid = _v; + uid->uid.psid = _p; } -- cgit v1.2.3 From 3bcec51334169ada2979ec77a09aa992e168f4d6 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sun, 11 Dec 2011 11:14:02 +0100 Subject: More coding style fixes because I suck at sed --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 214 ++++++++++----------- 1 file changed, 107 insertions(+), 107 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 15a5ff42a8..e43dfa9798 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -27,116 +27,116 @@ namespace OGL std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { - // SAMPLERS - "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", - // PIXEL SHADER UNIFORMS - I_COLORS, - I_KCOLORS, - I_ALPHA, - I_TEXDIMS, - I_ZBIAS , - I_INDTEXSCALE , - I_INDTEXMTX, - I_FOG, - I_PLIGHTS, - I_PMATERIALS, - // VERTEX SHADER UNIFORMS - I_POSNORMALMATRIX, - I_PROJECTION , - I_MATERIALS, - I_LIGHTS, - I_TEXMATRICES, - I_TRANSFORMMATRICES , - I_NORMALMATRICES , - I_POSTTRANSFORMMATRICES, - I_DEPTHPARAMS, - }; + // SAMPLERS + "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", + // PIXEL SHADER UNIFORMS + I_COLORS, + I_KCOLORS, + I_ALPHA, + I_TEXDIMS, + I_ZBIAS , + I_INDTEXSCALE , + I_INDTEXMTX, + I_FOG, + I_PLIGHTS, + I_PMATERIALS, + // VERTEX SHADER UNIFORMS + I_POSNORMALMATRIX, + I_PROJECTION , + I_MATERIALS, + I_LIGHTS, + I_TEXMATRICES, + I_TRANSFORMMATRICES , + I_NORMALMATRICES , + I_POSTTRANSFORMMATRICES, + I_DEPTHPARAMS, + }; void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { - PROGRAMUID uid; - CurrentFShader = PS; - CurrentVShader = VS; - - - GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); - - if(uid.uid.id == 0) - { - CurrentProgram = 0; - glUseProgram(0); - return; - } - - // Fragment shaders can survive without Vertex Shaders - // We have a valid fragment shader, let's create our program - std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); - PCache::iterator iter = pshaders.find(ShaderPair); - if (iter != pshaders.end()) - { - PCacheEntry &entry = iter->second; - glUseProgram(entry.program.glprogid); - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; - return; - } - PCacheEntry entry; - entry.program.vsid = CurrentVShader; - entry.program.psid = CurrentFShader; - entry.program.glprogid = glCreateProgram(); - - // Right, the program is created now - // Let's attach everything - if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.program.glprogid, entry.program.vsid); - - glAttachShader(entry.program.glprogid, entry.program.psid); - - glLinkProgram(entry.program.glprogid); - - glUseProgram(entry.program.glprogid); - - // 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 - //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - { + PROGRAMUID uid; + CurrentFShader = PS; + CurrentVShader = VS; + + + GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); + + if(uid.uid.id == 0) + { + CurrentProgram = 0; + glUseProgram(0); + return; + } + + // Fragment shaders can survive without Vertex Shaders + // We have a valid fragment shader, let's create our program + std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + PCache::iterator iter = pshaders.find(ShaderPair); + if (iter != pshaders.end()) + { + PCacheEntry &entry = iter->second; + glUseProgram(entry.program.glprogid); + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + return; + } + PCacheEntry entry; + entry.program.vsid = CurrentVShader; + entry.program.psid = CurrentFShader; + entry.program.glprogid = glCreateProgram(); + + // Right, the program is created now + // Let's attach everything + if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out + glAttachShader(entry.program.glprogid, entry.program.vsid); + + glAttachShader(entry.program.glprogid, entry.program.psid); + + glLinkProgram(entry.program.glprogid); + + glUseProgram(entry.program.glprogid); + + // 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 + //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + { glUniformBlockBinding( entry.program.glprogid, 0, 1 ); glUniformBlockBinding( entry.program.glprogid, 1, 2 ); } - // We cache our uniform locations for now - // Once we move up to a newer version of GLSL, ~1.30 - // We can remove this - - //For some reason this fails on my hardware - //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); - //Got to do it this crappy way. - if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + // We cache our uniform locations for now + // Once we move up to a newer version of GLSL, ~1.30 + // We can remove this + + //For some reason this fails on my hardware + //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + //Got to do it this crappy way. + if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for(int a = 0; a < NUM_UNIFORMS; ++a) entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - // Need to get some attribute locations - if(uid.uid.vsid != 0) // We have no vertex Shader - { - entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); - entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); - entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); - if(entry.program.attrLoc[0] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[0]); - if(entry.program.attrLoc[1] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[1]); - if(entry.program.attrLoc[2] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[2]); - } - else - entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; - - - pshaders[ShaderPair] = entry; - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; + // Need to get some attribute locations + if(uid.uid.vsid != 0) // We have no vertex Shader + { + entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); + entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); + entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); + if(entry.program.attrLoc[0] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[0]); + if(entry.program.attrLoc[1] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[1]); + if(entry.program.attrLoc[2] > 0) + glEnableVertexAttribArray(entry.program.attrLoc[2]); + } + else + entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; + + + pshaders[ShaderPair] = entry; + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; } void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) { @@ -158,11 +158,11 @@ namespace OGL GLint ProgramShaderCache::GetAttr(int num) { - return pshaders[CurrentShaderProgram].program.attrLoc[num]; + return pshaders[CurrentShaderProgram].program.attrLoc[num]; } PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) { - return pshaders[CurrentShaderProgram].program; + return pshaders[CurrentShaderProgram].program; } void ProgramShaderCache::Init(void) { @@ -190,11 +190,11 @@ namespace OGL } void ProgramShaderCache::Shutdown(void) { - PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); iter++) - iter->second.Destroy(); - pshaders.clear(); - glDeleteBuffers(2, UBOBuffers); + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); iter++) + iter->second.Destroy(); + pshaders.clear(); + glDeleteBuffers(2, UBOBuffers); } } -- cgit v1.2.3 From a809feae1a786a5768ad65a92059f12f37f97760 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 11 Dec 2011 04:19:11 -0600 Subject: Disable UBO buffer generation if hardware doesn't support it. --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 52 ++++++++++++---------- 1 file changed, 28 insertions(+), 24 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index e43dfa9798..adaa4babc3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -102,9 +102,9 @@ namespace OGL // Driver Bug? Nvidia GTX 570, 290.xx Driver, Linux x64 //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) { - glUniformBlockBinding( entry.program.glprogid, 0, 1 ); - glUniformBlockBinding( entry.program.glprogid, 1, 2 ); - } + glUniformBlockBinding( entry.program.glprogid, 0, 1 ); + glUniformBlockBinding( entry.program.glprogid, 1, 2 ); + } // We cache our uniform locations for now // Once we move up to a newer version of GLSL, ~1.30 @@ -114,8 +114,8 @@ namespace OGL //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); //Got to do it this crappy way. if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for(int a = 0; a < NUM_UNIFORMS; ++a) - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + for(int a = 0; a < NUM_UNIFORMS; ++a) + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); // Need to get some attribute locations if(uid.uid.vsid != 0) // We have no vertex Shader @@ -138,22 +138,22 @@ namespace OGL CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) + void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) + { + assert(Buffer > 1); + static int _Buffer = -1; + if(_Buffer != Buffer) { - assert(Buffer > 1); - static int _Buffer = -1; - if(_Buffer != Buffer) - { - _Buffer = Buffer; - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); - } - // Query for the offsets of each block variable - - // glBufferSubData expects data in bytes, so multiply count by four - // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location - glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); - + _Buffer = Buffer; + glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); } + // Query for the offsets of each block variable + + // glBufferSubData expects data in bytes, so multiply count by four + // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location + glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); + + } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -164,11 +164,13 @@ namespace OGL { return pshaders[CurrentShaderProgram].program; } - void ProgramShaderCache::Init(void) + void ProgramShaderCache::Init(void) + { + // We have to get the UBO alignment here because + // if we generate a buffer that isn't aligned + // then the UBO will fail. + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - // We have to get the UBO alignment here because - // if we generate a buffer that isn't aligned - // then the UBO will fail. GLint Align; glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); @@ -188,13 +190,15 @@ namespace OGL glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); } + } void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); iter++) iter->second.Destroy(); pshaders.clear(); - glDeleteBuffers(2, UBOBuffers); + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + glDeleteBuffers(2, UBOBuffers); } } -- cgit v1.2.3 From 73a29bf6a1c8330ae826f67f6ecfdd041eae7a57 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 11 Dec 2011 04:11:57 -0600 Subject: have separate variables/functions for VS/PS ubo stuff, array was confusing. --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 57 ++++++++++++---------- 1 file changed, 30 insertions(+), 27 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index adaa4babc3..3be1e76aff 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -23,7 +23,8 @@ namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; - GLuint ProgramShaderCache::UBOBuffers[2]; + GLuint ProgramShaderCache::s_ps_ubo; + GLuint ProgramShaderCache::s_vs_ubo; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -138,22 +139,21 @@ namespace OGL CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) - { - assert(Buffer > 1); - static int _Buffer = -1; - if(_Buffer != Buffer) + + void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - _Buffer = Buffer; - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } - // Query for the offsets of each block variable - - // glBufferSubData expects data in bytes, so multiply count by four - // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location - glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); - + + void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -173,32 +173,35 @@ namespace OGL { GLint Align; glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); - - glGenBuffers(2, UBOBuffers); - - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); + // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); + glGenBuffers(1, &s_ps_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); + glGenBuffers(1, &s_vs_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); + + glBindBuffer(GL_UNIFORM_BUFFER, 0); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[0]); - // Repeat for VS shader - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); + glBindBufferBase(GL_UNIFORM_BUFFER, 1, s_ps_ubo); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, s_vs_ubo); } } + void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); iter++) + for (; iter != pshaders.end(); ++iter) iter->second.Destroy(); pshaders.clear(); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - glDeleteBuffers(2, UBOBuffers); + + glDeleteBuffers(1, &s_ps_ubo); + glDeleteBuffers(1, &s_ps_ubo); } } -- cgit v1.2.3 From 8e80771670625fbb72c683f061965b8b12dc07bf Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 11 Dec 2011 04:32:57 -0600 Subject: fix stupid indentation --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 3be1e76aff..dd4fd6923f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -140,18 +140,18 @@ namespace OGL CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) - { - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - } - - void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) - { - glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + } + + void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } -- cgit v1.2.3 From e641ede232c97cb1208051fbd74633af2eef3bc7 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 11 Dec 2011 05:13:05 -0600 Subject: make use of glMapBuffer to set ubo data --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 56 +++++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index dd4fd6923f..df01055e65 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,6 +25,8 @@ namespace OGL ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_ubo; GLuint ProgramShaderCache::s_vs_ubo; + float* ProgramShaderCache::s_ps_mapped_data; + float* ProgramShaderCache::s_vs_mapped_data; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -142,18 +144,55 @@ namespace OGL void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + if (!s_ps_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + s_ps_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + + if (!s_ps_mapped_data) + PanicAlert("glMapBuffer"); + } + + std::copy(f, f + count * 4, s_ps_mapped_data + offset * 4); } void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + if (!s_vs_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + s_vs_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + + if (!s_vs_mapped_data) + PanicAlert("glMapBuffer"); + } + + std::copy(f, f + count * 4, s_vs_mapped_data + offset * 4); + } + + void ProgramShaderCache::FlushConstants() + { + if (s_ps_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) + PanicAlert("glUnmapBuffer"); + s_ps_mapped_data = NULL; + } + + if (s_vs_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) + PanicAlert("glUnmapBuffer"); + s_vs_mapped_data = NULL; + } + glBindBuffer(GL_UNIFORM_BUFFER, 0); } - + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -200,8 +239,11 @@ namespace OGL iter->second.Destroy(); pshaders.clear(); + // "A buffer object's mapped data store is automatically unmapped when the buffer object is deleted" glDeleteBuffers(1, &s_ps_ubo); - glDeleteBuffers(1, &s_ps_ubo); + glDeleteBuffers(1, &s_vs_ubo); + s_ps_ubo = s_vs_ubo = 0; + s_ps_mapped_data = s_vs_mapped_data = NULL; } } -- cgit v1.2.3 From d9117ab6a1da84618a123903217059ef72a396a1 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 11 Dec 2011 06:02:04 -0600 Subject: try combining vs/ps ubo --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 80 +++++++++------------- 1 file changed, 32 insertions(+), 48 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index df01055e65..bff25a5a65 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -23,10 +23,9 @@ namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; - GLuint ProgramShaderCache::s_ps_ubo; - GLuint ProgramShaderCache::s_vs_ubo; - float* ProgramShaderCache::s_ps_mapped_data; - float* ProgramShaderCache::s_vs_mapped_data; + GLuint ProgramShaderCache::s_ps_vs_ubo; + float* ProgramShaderCache::s_ps_vs_mapped_data; + GLintptr ProgramShaderCache::s_vs_data_offset; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -142,55 +141,40 @@ namespace OGL CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) + void ProgramShaderCache::MapBuffer() { - if (!s_ps_mapped_data) + if (!s_ps_vs_mapped_data) { - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); - s_ps_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + s_ps_vs_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); - if (!s_ps_mapped_data) + if (!s_ps_vs_mapped_data) PanicAlert("glMapBuffer"); } + } + + void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) + { + MapBuffer(); - std::copy(f, f + count * 4, s_ps_mapped_data + offset * 4); + std::copy(f, f + count * 4, s_ps_vs_mapped_data + offset * 4); } void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - if (!s_vs_mapped_data) - { - glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); - s_vs_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + MapBuffer(); - if (!s_vs_mapped_data) - PanicAlert("glMapBuffer"); - } - - std::copy(f, f + count * 4, s_vs_mapped_data + offset * 4); + // TODO: division = hax + std::copy(f, f + count * 4, s_ps_vs_mapped_data + (s_vs_data_offset / sizeof(float)) + offset * 4); } void ProgramShaderCache::FlushConstants() { - if (s_ps_mapped_data) + if (s_ps_vs_mapped_data) { - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) PanicAlert("glUnmapBuffer"); - s_ps_mapped_data = NULL; + s_ps_vs_mapped_data = NULL; } - - if (s_vs_mapped_data) - { - glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); - if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) - PanicAlert("glUnmapBuffer"); - s_vs_mapped_data = NULL; - } - - glBindBuffer(GL_UNIFORM_BUFFER, 0); } GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } @@ -212,23 +196,23 @@ namespace OGL { GLint Align; glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); + + GLintptr const ps_data_size = ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align); + GLintptr const vs_data_size = ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align); + s_vs_data_offset = ps_data_size; // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glGenBuffers(1, &s_ps_ubo); - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); - glGenBuffers(1, &s_vs_ubo); - glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); - - glBindBuffer(GL_UNIFORM_BUFFER, 0); + glGenBuffers(1, &s_ps_vs_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); + glBufferData(GL_UNIFORM_BUFFER, ps_data_size + vs_data_size, NULL, GL_DYNAMIC_DRAW); + // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader // Repeat for VS shader - glBindBufferBase(GL_UNIFORM_BUFFER, 1, s_ps_ubo); - glBindBufferBase(GL_UNIFORM_BUFFER, 2, s_vs_ubo); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); } } @@ -239,11 +223,11 @@ namespace OGL iter->second.Destroy(); pshaders.clear(); + glBindBuffer(GL_UNIFORM_BUFFER, 0); // "A buffer object's mapped data store is automatically unmapped when the buffer object is deleted" - glDeleteBuffers(1, &s_ps_ubo); - glDeleteBuffers(1, &s_vs_ubo); - s_ps_ubo = s_vs_ubo = 0; - s_ps_mapped_data = s_vs_mapped_data = NULL; + glDeleteBuffers(1, &s_ps_vs_ubo); + s_ps_vs_ubo = 0; + s_ps_vs_mapped_data = NULL; } } -- cgit v1.2.3 From d70726b035cc9d3dc7c342018f5e84efffe04bf1 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 11 Dec 2011 06:11:38 -0600 Subject: glMapBuffer was slow, go back to glBufferSubData, single combined ps/vs ubo now --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 37 +++------------------- 1 file changed, 5 insertions(+), 32 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index bff25a5a65..10c15aae36 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -24,7 +24,6 @@ namespace OGL GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; - float* ProgramShaderCache::s_ps_vs_mapped_data; GLintptr ProgramShaderCache::s_vs_data_offset; std::pair ProgramShaderCache::CurrentShaderProgram; @@ -141,42 +140,18 @@ namespace OGL CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::MapBuffer() - { - if (!s_ps_vs_mapped_data) - { - s_ps_vs_mapped_data = reinterpret_cast(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); - - if (!s_ps_vs_mapped_data) - PanicAlert("glMapBuffer"); - } - } - void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - MapBuffer(); - - std::copy(f, f + count * 4, s_ps_vs_mapped_data + offset * 4); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, + count * sizeof(float) * 4, f); } void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - MapBuffer(); - - // TODO: division = hax - std::copy(f, f + count * 4, s_ps_vs_mapped_data + (s_vs_data_offset / sizeof(float)) + offset * 4); + glBufferSubData(GL_UNIFORM_BUFFER, s_vs_data_offset + offset * sizeof(float) * 4, + count * sizeof(float) * 4, f); } - - void ProgramShaderCache::FlushConstants() - { - if (s_ps_vs_mapped_data) - { - if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) - PanicAlert("glUnmapBuffer"); - s_ps_vs_mapped_data = NULL; - } - } - + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -224,10 +199,8 @@ namespace OGL pshaders.clear(); glBindBuffer(GL_UNIFORM_BUFFER, 0); - // "A buffer object's mapped data store is automatically unmapped when the buffer object is deleted" glDeleteBuffers(1, &s_ps_vs_ubo); s_ps_vs_ubo = 0; - s_ps_vs_mapped_data = NULL; } } -- cgit v1.2.3 From ba12c0b4f51aafd814d9d400869586d204cf43df Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 11 Dec 2011 06:18:01 -0600 Subject: Instead of querying the vertex attribute location. Let's bind it to where CG expects it to be as well. Was causing problems when we were trying to activate the components below and they weren't available. This fixes cubivore with GLSL shader. Also any other game that uses 3 normal pointers. --- .../Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 10c15aae36..2f6aa691de 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -121,18 +121,10 @@ namespace OGL // Need to get some attribute locations if(uid.uid.vsid != 0) // We have no vertex Shader { - entry.program.attrLoc[0] = glGetAttribLocation(entry.program.glprogid, "rawnorm1"); - entry.program.attrLoc[1] = glGetAttribLocation(entry.program.glprogid, "rawnorm2"); - entry.program.attrLoc[2] = glGetAttribLocation(entry.program.glprogid, "fposmtx"); - if(entry.program.attrLoc[0] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[0]); - if(entry.program.attrLoc[1] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[1]); - if(entry.program.attrLoc[2] > 0) - glEnableVertexAttribArray(entry.program.attrLoc[2]); + glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); + glBindAttribLocation(entry.program.glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); } - else - entry.program.attrLoc[0] = entry.program.attrLoc[1] = entry.program.attrLoc[2] = 0; pshaders[ShaderPair] = entry; @@ -154,10 +146,6 @@ namespace OGL GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } - GLint ProgramShaderCache::GetAttr(int num) - { - return pshaders[CurrentShaderProgram].program.attrLoc[num]; - } PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) { return pshaders[CurrentShaderProgram].program; -- cgit v1.2.3 From 076c1a5aa7e88adba12138658250e370aecbe523 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 15 Dec 2011 15:48:21 -0600 Subject: Make sure not to try and bind UBO locations when it isn't supported --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 2f6aa691de..5d00ce2529 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -101,7 +101,7 @@ namespace OGL // 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 - //if(!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) { glUniformBlockBinding( entry.program.glprogid, 0, 1 ); glUniformBlockBinding( entry.program.glprogid, 1, 2 ); -- cgit v1.2.3 From 7aad45658ee30ad6b90f7d368e413afb519bfcc4 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 16 Dec 2011 23:18:24 -0600 Subject: Add a GUI option to use GLSL shaders. Also fix a small typo. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 5d00ce2529..98efbb000b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -101,7 +101,7 @@ namespace OGL // 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 - if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { glUniformBlockBinding( entry.program.glprogid, 0, 1 ); glUniformBlockBinding( entry.program.glprogid, 1, 2 ); -- cgit v1.2.3 From ddd4360d6df89bc82c20c1d5ef47ee1fc94180e7 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 16 Dec 2011 23:37:22 -0600 Subject: Only delete this buffer if we support it. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 98efbb000b..c90f151421 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -186,9 +186,12 @@ namespace OGL iter->second.Destroy(); pshaders.clear(); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - glDeleteBuffers(1, &s_ps_vs_ubo); - s_ps_vs_ubo = 0; + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + glBindBuffer(GL_UNIFORM_BUFFER, 0); + glDeleteBuffers(1, &s_ps_vs_ubo); + s_ps_vs_ubo = 0; + } } } -- cgit v1.2.3 From f8d0c28e537faa069a6f0f27f8bc205cae6b78d6 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 17 Dec 2011 01:06:55 -0600 Subject: Set Sampler values at program make time instead of every frame. Fix an issue when The user had UBO support but not Binding support. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index c90f151421..14542bf68f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -114,9 +114,17 @@ namespace OGL //For some reason this fails on my hardware //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); //Got to do it this crappy way. - if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for(int a = 0; a < NUM_UNIFORMS; ++a) entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + else if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + for(int a = 0; a < 8; ++a) + { + // Still need to get sampler locations since we aren't binding them statically in the shaders + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + if(entry.program.UniformLocations[a] != -1) + glUniform1i(entry.program.UniformLocations[a], a); + } // Need to get some attribute locations if(uid.uid.vsid != 0) // We have no vertex Shader -- cgit v1.2.3 From 9c09e1973a6868ce35c3d309088da01b9f6c4713 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 17 Dec 2011 01:17:11 -0600 Subject: Some shader programs don't come with Vertex shaders attached, don't try to bind a Vertex Uniform block then. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 14542bf68f..7ae733bcf1 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -104,7 +104,8 @@ namespace OGL if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { glUniformBlockBinding( entry.program.glprogid, 0, 1 ); - glUniformBlockBinding( entry.program.glprogid, 1, 2 ); + if(uid.uid.vsid != 0) // Some things have no vertex shader + glUniformBlockBinding( entry.program.glprogid, 1, 2 ); } // We cache our uniform locations for now -- cgit v1.2.3 From 6759ee701d3deb3d2966f871b7e44f1038194d74 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 18 Dec 2011 23:31:00 -0600 Subject: This thing fails when we don't support binding. Not 100% sure why I need to set this multiple times. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 7ae733bcf1..b83e4cf0ac 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -77,6 +77,13 @@ namespace OGL { PCacheEntry &entry = iter->second; glUseProgram(entry.program.glprogid); + if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + for(int a = 0; a < 8; ++a) + { + // Why do we need to set this again here when we don't support binding? + if(entry.program.UniformLocations[a] != -1) + glUniform1i(entry.program.UniformLocations[a], a); + } CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; return; -- cgit v1.2.3 From 1aad2e9e56311607879dc407388c6e1d12cdd978 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 19 Dec 2011 00:15:07 -0600 Subject: There we go, actually found the issue. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b83e4cf0ac..d38a4607e4 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -77,13 +77,6 @@ namespace OGL { PCacheEntry &entry = iter->second; glUseProgram(entry.program.glprogid); - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - for(int a = 0; a < 8; ++a) - { - // Why do we need to set this again here when we don't support binding? - if(entry.program.UniformLocations[a] != -1) - glUniform1i(entry.program.UniformLocations[a], a); - } CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; return; @@ -125,11 +118,10 @@ namespace OGL if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for(int a = 0; a < NUM_UNIFORMS; ++a) entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - else if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) for(int a = 0; a < 8; ++a) { // Still need to get sampler locations since we aren't binding them statically in the shaders - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); if(entry.program.UniformLocations[a] != -1) glUniform1i(entry.program.UniformLocations[a], a); } -- cgit v1.2.3 From 7cb3d86e31bf4f2e38b90640e614be63e327bcda Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 19 Dec 2011 19:10:05 -0600 Subject: Add a define back so we work without GLEW 1.6, Also I missed a line when I was fixing binding sampler locations last night when I was tired. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index d38a4607e4..dc4b4e9822 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -116,12 +116,13 @@ namespace OGL //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); //Got to do it this crappy way. if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for(int a = 0; a < NUM_UNIFORMS; ++a) + for(int a = 8; a < NUM_UNIFORMS; ++a) entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) for(int a = 0; a < 8; ++a) { // Still need to get sampler locations since we aren't binding them statically in the shaders + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); if(entry.program.UniformLocations[a] != -1) glUniform1i(entry.program.UniformLocations[a], a); } -- cgit v1.2.3 From d012c75005a66f0bc1375816fd2155f97516cdde Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 21 Dec 2011 00:15:48 -0600 Subject: Implement Program shaders cache. Seems to reduce a small amount of stuttering when F-Zero starts. Did it because I can :| --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 112 ++++++++++++++------- 1 file changed, 75 insertions(+), 37 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index dc4b4e9822..70655294c7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -26,6 +26,9 @@ namespace OGL GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; + LinearDiskCache g_program_disk_cache; + GLenum ProgramFormat; + std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { // SAMPLERS @@ -53,6 +56,48 @@ namespace OGL I_DEPTHPARAMS, }; + void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUID &uid) + { + // 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 + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + glUniformBlockBinding( entry.program.glprogid, 0, 1 ); + if(uid.uid.vsid != 0) // Some things have no vertex shader + glUniformBlockBinding( entry.program.glprogid, 1, 2 ); + } + + // We cache our uniform locations for now + // Once we move up to a newer version of GLSL, ~1.30 + // We can remove this + + //For some reason this fails on my hardware + //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + //Got to do it this crappy way. + if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + for(int a = 8; a < NUM_UNIFORMS; ++a) + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + for(int a = 0; a < 8; ++a) + { + // Still need to get sampler locations since we aren't binding them statically in the shaders + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + if(entry.program.UniformLocations[a] != -1) + glUniform1i(entry.program.UniformLocations[a], a); + } + + // Need to get some attribute locations + if(uid.uid.vsid != 0) // We have no vertex Shader + { + glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); + glBindAttribLocation(entry.program.glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); + } + } + + void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { PROGRAMUID uid; @@ -92,49 +137,19 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.vsid); glAttachShader(entry.program.glprogid, entry.program.psid); + + + glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); glLinkProgram(entry.program.glprogid); glUseProgram(entry.program.glprogid); - // 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 - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - glUniformBlockBinding( entry.program.glprogid, 0, 1 ); - if(uid.uid.vsid != 0) // Some things have no vertex shader - glUniformBlockBinding( entry.program.glprogid, 1, 2 ); - } - - // We cache our uniform locations for now - // Once we move up to a newer version of GLSL, ~1.30 - // We can remove this - - //For some reason this fails on my hardware - //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); - //Got to do it this crappy way. - if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for(int a = 8; a < NUM_UNIFORMS; ++a) - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - for(int a = 0; a < 8; ++a) - { - // Still need to get sampler locations since we aren't binding them statically in the shaders - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if(entry.program.UniformLocations[a] != -1) - glUniform1i(entry.program.UniformLocations[a], a); - } - - // Need to get some attribute locations - if(uid.uid.vsid != 0) // We have no vertex Shader - { - glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); - glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - glBindAttribLocation(entry.program.glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); - } + SetProgramVariables(entry, uid); + // Add it to our cache + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + g_program_disk_cache.Append(uid, entry.Data(), entry.Size()); pshaders[ShaderPair] = entry; CurrentShaderProgram = ShaderPair; @@ -186,10 +201,33 @@ namespace OGL glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); } + + // Read our shader cache, only if supported + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + { + char cache_filename[MAX_PATH]; + sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); + ProgramShaderCacheInserter inserter; + g_program_disk_cache.OpenAndRead(cache_filename, inserter); + + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + + GLint Formats[Supported]; + glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); + ProgramFormat = (GLenum)Formats[0]; // We don't really care about format + } } void ProgramShaderCache::Shutdown(void) { + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + { + g_program_disk_cache.Sync(); + g_program_disk_cache.Close(); + } + PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) iter->second.Destroy(); -- cgit v1.2.3 From 9996f2712046b7d899cc52a0d4ae6f021ef918f5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 21 Dec 2011 01:29:29 -0600 Subject: Give OSX users more of a chance of supporting Single pass DSB in the future. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 70655294c7..5c143c010c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -89,7 +89,7 @@ namespace OGL } // Need to get some attribute locations - if(uid.uid.vsid != 0) // We have no vertex Shader + if(uid.uid.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) // We have no vertex Shader { glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); -- cgit v1.2.3 From 7c914766501a3456f4bb940e1c4213d32f1ccf8f Mon Sep 17 00:00:00 2001 From: Sonicadvance1 Date: Wed, 21 Dec 2011 22:33:33 +0000 Subject: Missed a if, don't want people crashing now do we? --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 5c143c010c..0429b89e30 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -138,8 +138,8 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.psid); - - glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); glLinkProgram(entry.program.glprogid); -- cgit v1.2.3 From 4eb227bd4ce853f2df9af3e18ef317d5a15edff8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 24 Dec 2011 00:37:13 -0600 Subject: If user doesn't compile with glew 1.6, cut out program binaries so everything still compiles. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 0429b89e30..628cbae865 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -137,9 +137,10 @@ namespace OGL glAttachShader(entry.program.glprogid, entry.program.vsid); glAttachShader(entry.program.glprogid, entry.program.psid); - + #ifdef GLEW_VERSION_4_0 if (g_ActiveConfig.backend_info.bSupportsGLSLCache) glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + #endif glLinkProgram(entry.program.glprogid); @@ -201,7 +202,7 @@ namespace OGL glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); } - + #ifdef GLEW_VERSION_4_0 // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { @@ -218,6 +219,7 @@ namespace OGL glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); ProgramFormat = (GLenum)Formats[0]; // We don't really care about format } + #endif } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From 5c486587a68c2513412fe67d7bad24673ce2969f Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 24 Dec 2011 02:19:30 -0600 Subject: Write all shaders to disk on emulator stop instead of constantly. Also change pair from u64 to u32. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 628cbae865..6514e1e775 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -29,7 +29,7 @@ namespace OGL LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; - std::pair ProgramShaderCache::CurrentShaderProgram; + std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { // SAMPLERS "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", @@ -116,7 +116,7 @@ namespace OGL // Fragment shaders can survive without Vertex Shaders // We have a valid fragment shader, let's create our program - std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); PCache::iterator iter = pshaders.find(ShaderPair); if (iter != pshaders.end()) { @@ -129,6 +129,7 @@ namespace OGL PCacheEntry entry; entry.program.vsid = CurrentVShader; entry.program.psid = CurrentFShader; + entry.program.uid = uid; entry.program.glprogid = glCreateProgram(); // Right, the program is created now @@ -148,10 +149,6 @@ namespace OGL SetProgramVariables(entry, uid); - // Add it to our cache - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - g_program_disk_cache.Append(uid, entry.Data(), entry.Size()); - pshaders[ShaderPair] = entry; CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; @@ -226,6 +223,10 @@ namespace OGL { if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); ++iter) + g_program_disk_cache.Append(iter->second.program.uid, iter->second.program.Data(), iter->second.program.Size()); + g_program_disk_cache.Sync(); g_program_disk_cache.Close(); } -- cgit v1.2.3 From c4e7a288e5390ccd0920812c11ff3c42fc691294 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 25 Dec 2011 12:21:31 -0600 Subject: Add in the Windows fix. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 6514e1e775..a422f80079 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -212,9 +212,10 @@ namespace OGL GLint Supported; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - GLint Formats[Supported]; + GLint *Formats = new GLint[Supported]; glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); ProgramFormat = (GLenum)Formats[0]; // We don't really care about format + delete[] Formats; } #endif } -- cgit v1.2.3 From 31a8424bcc70c566b370831d35a5a30fbd7d7fe2 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 26 Dec 2011 00:15:54 -0500 Subject: fix formatting uglies introduced in glsl-master branch --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 409 +++++++++++---------- 1 file changed, 211 insertions(+), 198 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index a422f80079..008a4a679e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -18,234 +18,247 @@ #include "ProgramShaderCache.h" #include "MathUtil.h" -#include namespace OGL { - GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; - ProgramShaderCache::PCache ProgramShaderCache::pshaders; - GLuint ProgramShaderCache::s_ps_vs_ubo; - GLintptr ProgramShaderCache::s_vs_data_offset; - - LinearDiskCache g_program_disk_cache; - GLenum ProgramFormat; - - std::pair ProgramShaderCache::CurrentShaderProgram; - const char *UniformNames[NUM_UNIFORMS] = { - // SAMPLERS - "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", - // PIXEL SHADER UNIFORMS - I_COLORS, - I_KCOLORS, - I_ALPHA, - I_TEXDIMS, - I_ZBIAS , - I_INDTEXSCALE , - I_INDTEXMTX, - I_FOG, - I_PLIGHTS, - I_PMATERIALS, - // VERTEX SHADER UNIFORMS - I_POSNORMALMATRIX, - I_PROJECTION , - I_MATERIALS, - I_LIGHTS, - I_TEXMATRICES, - I_TRANSFORMMATRICES , - I_NORMALMATRICES , - I_POSTTRANSFORMMATRICES, - I_DEPTHPARAMS, - }; - - void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUID &uid) - { - // 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 - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - glUniformBlockBinding( entry.program.glprogid, 0, 1 ); - if(uid.uid.vsid != 0) // Some things have no vertex shader - glUniformBlockBinding( entry.program.glprogid, 1, 2 ); - } - - // We cache our uniform locations for now - // Once we move up to a newer version of GLSL, ~1.30 - // We can remove this - - //For some reason this fails on my hardware - //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); - //Got to do it this crappy way. - if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for(int a = 8; a < NUM_UNIFORMS; ++a) - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) - for(int a = 0; a < 8; ++a) - { - // Still need to get sampler locations since we aren't binding them statically in the shaders - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if(entry.program.UniformLocations[a] != -1) - glUniform1i(entry.program.UniformLocations[a], a); - } - - // Need to get some attribute locations - if(uid.uid.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) // We have no vertex Shader - { - glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); - glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - glBindAttribLocation(entry.program.glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); - } - } - - void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) +GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; +ProgramShaderCache::PCache ProgramShaderCache::pshaders; +GLuint ProgramShaderCache::s_ps_vs_ubo; +GLintptr ProgramShaderCache::s_vs_data_offset; + +LinearDiskCache g_program_disk_cache; +GLenum ProgramFormat; + +std::pair ProgramShaderCache::CurrentShaderProgram; +const char *UniformNames[NUM_UNIFORMS] = +{ + // SAMPLERS + "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", + // PIXEL SHADER UNIFORMS + I_COLORS, + I_KCOLORS, + I_ALPHA, + I_TEXDIMS, + I_ZBIAS , + I_INDTEXSCALE , + I_INDTEXMTX, + I_FOG, + I_PLIGHTS, + I_PMATERIALS, + // VERTEX SHADER UNIFORMS + I_POSNORMALMATRIX, + I_PROJECTION , + I_MATERIALS, + I_LIGHTS, + I_TEXMATRICES, + I_TRANSFORMMATRICES , + I_NORMALMATRICES , + I_POSTTRANSFORMMATRICES, + I_DEPTHPARAMS, +}; + +void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUID &uid) +{ + // 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 + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - PROGRAMUID uid; - CurrentFShader = PS; - CurrentVShader = VS; + glUniformBlockBinding(entry.program.glprogid, 0, 1); + // Some things have no vertex shader + if (uid.uid.vsid != 0) + glUniformBlockBinding(entry.program.glprogid, 1, 2); + } + // We cache our uniform locations for now + // Once we move up to a newer version of GLSL, ~1.30 + // We can remove this - GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); + // (Sonicadvance): For some reason this fails on my hardware + //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + // Got to do it this crappy way. + if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + for (int a = 8; a < NUM_UNIFORMS; ++a) + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if(uid.uid.id == 0) + if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) + { + for (int a = 0; a < 8; ++a) { - CurrentProgram = 0; - glUseProgram(0); - return; + // Still need to get sampler locations since we aren't binding them statically in the shaders + entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + if (entry.program.UniformLocations[a] != -1) + glUniform1i(entry.program.UniformLocations[a], a); } + } - // Fragment shaders can survive without Vertex Shaders - // We have a valid fragment shader, let's create our program - std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); - PCache::iterator iter = pshaders.find(ShaderPair); - if (iter != pshaders.end()) - { - PCacheEntry &entry = iter->second; - glUseProgram(entry.program.glprogid); - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; - return; - } - PCacheEntry entry; - entry.program.vsid = CurrentVShader; - entry.program.psid = CurrentFShader; - entry.program.uid = uid; - entry.program.glprogid = glCreateProgram(); - - // Right, the program is created now - // Let's attach everything - if(entry.program.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.program.glprogid, entry.program.vsid); - - glAttachShader(entry.program.glprogid, entry.program.psid); - #ifdef GLEW_VERSION_4_0 - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); - #endif - - glLinkProgram(entry.program.glprogid); - - glUseProgram(entry.program.glprogid); + // Need to get some attribute locations + if (uid.uid.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) + { + // We have no vertex Shader + glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); + glBindAttribLocation(entry.program.glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); + } +} - SetProgramVariables(entry, uid); +void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) +{ + PROGRAMUID uid; + CurrentFShader = PS; + CurrentVShader = VS; - pshaders[ShaderPair] = entry; - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; - } + GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); - void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) + if (uid.uid.id == 0) { - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, - count * sizeof(float) * 4, f); + CurrentProgram = 0; + glUseProgram(0); + return; } - void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) + // Fragment shaders can survive without Vertex Shaders + // We have a valid fragment shader, let's create our program + std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + PCache::iterator iter = pshaders.find(ShaderPair); + if (iter != pshaders.end()) { - glBufferSubData(GL_UNIFORM_BUFFER, s_vs_data_offset + offset * sizeof(float) * 4, - count * sizeof(float) * 4, f); + PCacheEntry &entry = iter->second; + glUseProgram(entry.program.glprogid); + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; + return; } - - GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } - PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) + PCacheEntry entry; + entry.program.vsid = CurrentVShader; + entry.program.psid = CurrentFShader; + entry.program.uid = uid; + entry.program.glprogid = glCreateProgram(); + + // Right, the program is created now + // Let's attach everything + if (entry.program.vsid != 0) // attaching zero vertex shader makes it freak out + glAttachShader(entry.program.glprogid, entry.program.vsid); + + glAttachShader(entry.program.glprogid, entry.program.psid); + +#ifdef GLEW_VERSION_4_0 + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); +#endif + + glLinkProgram(entry.program.glprogid); + + glUseProgram(entry.program.glprogid); + + SetProgramVariables(entry, uid); + + pshaders[ShaderPair] = entry; + CurrentShaderProgram = ShaderPair; + CurrentProgram = entry.program.glprogid; +} + +void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) +{ + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, + count * sizeof(float) * 4, f); +} + +void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) +{ + glBufferSubData(GL_UNIFORM_BUFFER, s_vs_data_offset + offset * sizeof(float) * 4, + count * sizeof(float) * 4, f); +} + +GLuint ProgramShaderCache::GetCurrentProgram(void) +{ + return CurrentProgram; +} + +PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) +{ + return pshaders[CurrentShaderProgram].program; +} + +void ProgramShaderCache::Init(void) +{ + // We have to get the UBO alignment here because + // if we generate a buffer that isn't aligned + // then the UBO will fail. + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - return pshaders[CurrentShaderProgram].program; + GLint Align; + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); + + GLintptr const ps_data_size = ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align); + GLintptr const vs_data_size = ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align); + s_vs_data_offset = ps_data_size; + + // We multiply by *4*4 because we need to get down to basic machine units. + // So multiply by four to get how many floats we have from vec4s + // Then once more to get bytes + glGenBuffers(1, &s_ps_vs_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); + glBufferData(GL_UNIFORM_BUFFER, ps_data_size + vs_data_size, NULL, GL_DYNAMIC_DRAW); + + // Now bind the buffer to the index point + // We know PS is 0 since we have it statically set in the shader + // Repeat for VS shader + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); } - void ProgramShaderCache::Init(void) + +#ifdef GLEW_VERSION_4_0 + // Read our shader cache, only if supported + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { - // We have to get the UBO alignment here because - // if we generate a buffer that isn't aligned - // then the UBO will fail. - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - GLint Align; - glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); - - GLintptr const ps_data_size = ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align); - GLintptr const vs_data_size = ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align); - s_vs_data_offset = ps_data_size; - - // We multiply by *4*4 because we need to get down to basic machine units. - // So multiply by four to get how many floats we have from vec4s - // Then once more to get bytes - glGenBuffers(1, &s_ps_vs_ubo); - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, ps_data_size + vs_data_size, NULL, GL_DYNAMIC_DRAW); - - // Now bind the buffer to the index point - // We know PS is 0 since we have it statically set in the shader - // Repeat for VS shader - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); - } - #ifdef GLEW_VERSION_4_0 - // Read our shader cache, only if supported - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - { - char cache_filename[MAX_PATH]; - sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); - ProgramShaderCacheInserter inserter; - g_program_disk_cache.OpenAndRead(cache_filename, inserter); - - GLint Supported; - glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - - GLint *Formats = new GLint[Supported]; - glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); - ProgramFormat = (GLenum)Formats[0]; // We don't really care about format - delete[] Formats; - } - #endif + char cache_filename[MAX_PATH]; + sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); + ProgramShaderCacheInserter inserter; + g_program_disk_cache.OpenAndRead(cache_filename, inserter); + + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + + GLint *Formats = new GLint[Supported]; + glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); + // We don't really care about format + ProgramFormat = (GLenum)Formats[0]; + delete[] Formats; } - - void ProgramShaderCache::Shutdown(void) +#endif +} + +void ProgramShaderCache::Shutdown(void) +{ + if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - { - PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); ++iter) - g_program_disk_cache.Append(iter->second.program.uid, iter->second.program.Data(), iter->second.program.Size()); - - g_program_disk_cache.Sync(); - g_program_disk_cache.Close(); - } - PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) - iter->second.Destroy(); - pshaders.clear(); + g_program_disk_cache.Append(iter->second.program.uid, iter->second.program.Data(), iter->second.program.Size()); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - glBindBuffer(GL_UNIFORM_BUFFER, 0); - glDeleteBuffers(1, &s_ps_vs_ubo); - s_ps_vs_ubo = 0; - } + g_program_disk_cache.Sync(); + g_program_disk_cache.Close(); + } + + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); ++iter) + iter->second.Destroy(); + pshaders.clear(); + + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + glBindBuffer(GL_UNIFORM_BUFFER, 0); + glDeleteBuffers(1, &s_ps_vs_ubo); + s_ps_vs_ubo = 0; } } +} // namespace OGL + void GetProgramShaderId(PROGRAMUID *uid, GLuint _v, GLuint _p) { uid->uid.vsid = _v; -- cgit v1.2.3 From aaa405c9734855ad38a97433fd27bfdb37138d41 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 26 Dec 2011 00:43:47 -0500 Subject: Checking GLEW_VERSION_4_0 is superfluous since we check GL_ARB_get_program_binary, and it's a runtime variable anyways. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 008a4a679e..d25830566e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -144,10 +144,8 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) glAttachShader(entry.program.glprogid, entry.program.psid); -#ifdef GLEW_VERSION_4_0 if (g_ActiveConfig.backend_info.bSupportsGLSLCache) glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); -#endif glLinkProgram(entry.program.glprogid); @@ -210,7 +208,6 @@ void ProgramShaderCache::Init(void) glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); } -#ifdef GLEW_VERSION_4_0 // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { @@ -229,7 +226,6 @@ void ProgramShaderCache::Init(void) ProgramFormat = (GLenum)Formats[0]; delete[] Formats; } -#endif } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From 4c1fef8f9837ccffc37a418b798d3d567b42ffef Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 26 Dec 2011 02:58:52 -0500 Subject: refactor ProgramShaderCache::PCacheEntry --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 81 ++++++++-------------- 1 file changed, 30 insertions(+), 51 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index d25830566e..387996a957 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -26,7 +26,7 @@ ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; -LinearDiskCache g_program_disk_cache; +LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; std::pair ProgramShaderCache::CurrentShaderProgram; @@ -57,7 +57,7 @@ const char *UniformNames[NUM_UNIFORMS] = I_DEPTHPARAMS, }; -void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUID &uid) +void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) { // Dunno why this is needed when I have the binding // points statically set in the shader source @@ -65,10 +65,10 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUI // Driver Bug? Nvidia GTX 570, 290.xx Driver, Linux x64 if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - glUniformBlockBinding(entry.program.glprogid, 0, 1); + glUniformBlockBinding(entry.prog_id, 0, 1); // Some things have no vertex shader - if (uid.uid.vsid != 0) - glUniformBlockBinding(entry.program.glprogid, 1, 2); + if (entry.vsid != 0) + glUniformBlockBinding(entry.prog_id, 1, 2); } // We cache our uniform locations for now @@ -76,42 +76,39 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry, const PROGRAMUI // We can remove this // (Sonicadvance): For some reason this fails on my hardware - //glGetUniformIndices(entry.program.glprogid, NUM_UNIFORMS, UniformNames, entry.program.UniformLocations); + //glGetUniformIndices(entry.prog_id, NUM_UNIFORMS, UniformNames, entry.UniformLocations); // Got to do it this crappy way. if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for (int a = 8; a < NUM_UNIFORMS; ++a) - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); + entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); if (!g_ActiveConfig.backend_info.bSupportsGLSLBinding) { for (int a = 0; a < 8; ++a) { // Still need to get sampler locations since we aren't binding them statically in the shaders - entry.program.UniformLocations[a] = glGetUniformLocation(entry.program.glprogid, UniformNames[a]); - if (entry.program.UniformLocations[a] != -1) - glUniform1i(entry.program.UniformLocations[a], a); + entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); + if (entry.UniformLocations[a] != -1) + glUniform1i(entry.UniformLocations[a], a); } } // Need to get some attribute locations - if (uid.uid.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) + if (entry.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) { // We have no vertex Shader - glBindAttribLocation(entry.program.glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); - glBindAttribLocation(entry.program.glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - glBindAttribLocation(entry.program.glprogid, 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"); } } void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { - PROGRAMUID uid; CurrentFShader = PS; CurrentVShader = VS; - GetProgramShaderId(&uid, CurrentVShader, CurrentFShader); - - if (uid.uid.id == 0) + if (CurrentFShader == 0 && CurrentVShader == 0) { CurrentProgram = 0; glUseProgram(0); @@ -120,42 +117,39 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) // Fragment shaders can survive without Vertex Shaders // We have a valid fragment shader, let's create our program - std::pair ShaderPair = std::make_pair(uid.uid.psid, uid.uid.vsid); + std::pair ShaderPair = std::make_pair(CurrentFShader, CurrentVShader); PCache::iterator iter = pshaders.find(ShaderPair); if (iter != pshaders.end()) { PCacheEntry &entry = iter->second; - glUseProgram(entry.program.glprogid); + glUseProgram(entry.prog_id); CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; + CurrentProgram = entry.prog_id; return; } PCacheEntry entry; - entry.program.vsid = CurrentVShader; - entry.program.psid = CurrentFShader; - entry.program.uid = uid; - entry.program.glprogid = glCreateProgram(); + entry.Create(CurrentFShader, CurrentVShader); // Right, the program is created now // Let's attach everything - if (entry.program.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.program.glprogid, entry.program.vsid); + if (entry.vsid != 0) // attaching zero vertex shader makes it freak out + glAttachShader(entry.prog_id, entry.vsid); - glAttachShader(entry.program.glprogid, entry.program.psid); + glAttachShader(entry.prog_id, entry.psid); if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - glProgramParameteri(entry.program.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + glProgramParameteri(entry.prog_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); - glLinkProgram(entry.program.glprogid); + glLinkProgram(entry.prog_id); - glUseProgram(entry.program.glprogid); + glUseProgram(entry.prog_id); - SetProgramVariables(entry, uid); + SetProgramVariables(entry); pshaders[ShaderPair] = entry; CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.program.glprogid; + CurrentProgram = entry.prog_id; } void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) @@ -175,9 +169,9 @@ GLuint ProgramShaderCache::GetCurrentProgram(void) return CurrentProgram; } -PROGRAMSHADER ProgramShaderCache::GetShaderProgram(void) +ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void) { - return pshaders[CurrentShaderProgram].program; + return pshaders[CurrentShaderProgram]; } void ProgramShaderCache::Init(void) @@ -216,15 +210,6 @@ void ProgramShaderCache::Init(void) SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); ProgramShaderCacheInserter inserter; g_program_disk_cache.OpenAndRead(cache_filename, inserter); - - GLint Supported; - glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - - GLint *Formats = new GLint[Supported]; - glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); - // We don't really care about format - ProgramFormat = (GLenum)Formats[0]; - delete[] Formats; } } @@ -234,7 +219,7 @@ void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) - g_program_disk_cache.Append(iter->second.program.uid, iter->second.program.Data(), iter->second.program.Size()); + g_program_disk_cache.Append(iter->second.uid, iter->second.GetProgram(), iter->second.Size()); g_program_disk_cache.Sync(); g_program_disk_cache.Close(); @@ -254,9 +239,3 @@ void ProgramShaderCache::Shutdown(void) } } // namespace OGL - -void GetProgramShaderId(PROGRAMUID *uid, GLuint _v, GLuint _p) -{ - uid->uid.vsid = _v; - uid->uid.psid = _p; -} -- cgit v1.2.3 From 108722bed04d65819dae76cf09874e5256252f4a Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 26 Dec 2011 10:27:18 -0500 Subject: oops, forgot to make sure the gl program is actually free'd. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 387996a957..eeb9614070 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -219,7 +219,10 @@ void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) + { g_program_disk_cache.Append(iter->second.uid, iter->second.GetProgram(), iter->second.Size()); + iter->second.FreeProgram(); + } g_program_disk_cache.Sync(); g_program_disk_cache.Close(); -- cgit v1.2.3 From 2e15440896f0267ef4b602ebfded277c95e0572f Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 29 Dec 2011 00:32:06 -0600 Subject: Add support for Dual source blending to older ATI cards that don't support 420pack but do support GL_ARB_blend_func_extended. This is more proper as well anyways. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index eeb9614070..728e4e8a01 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -91,6 +91,14 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) if (entry.UniformLocations[a] != -1) glUniform1i(entry.UniformLocations[a], a); } + 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"); + } } // Need to get some attribute locations -- cgit v1.2.3 From 03b09bed5dba644a06b5a591c477e7c4345f2b2d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 29 Dec 2011 01:35:50 -0600 Subject: Get the program binary type correctly or else ATI makes massive (~400MB) shader caches. Also, don't need the line in the PixelShaderGen. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 728e4e8a01..57470959d2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,6 +25,7 @@ GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShade ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; +GLenum ProgramShaderCache::prog_format; LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; @@ -213,6 +214,16 @@ void ProgramShaderCache::Init(void) // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + + GLint *Formats = new GLint[Supported]; + glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); + // We don't really care about format + // We just need the correct data type + prog_format = (GLenum)Formats[0]; + delete[] Formats; + char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); -- cgit v1.2.3 From 210ecad15f71efe0e09e4cf54744715483df5df1 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Thu, 29 Dec 2011 16:25:03 +0100 Subject: let us try normal c++ static init instead... --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 57470959d2..b178157a89 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,11 +25,12 @@ GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShade ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; -GLenum ProgramShaderCache::prog_format; LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; +GLuint ProgramShaderCache::PCacheEntry::prog_format = ProgramShaderCache::PCacheEntry::SetProgramFormat(); + std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -214,16 +215,6 @@ void ProgramShaderCache::Init(void) // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { - GLint Supported; - glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - - GLint *Formats = new GLint[Supported]; - glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); - // We don't really care about format - // We just need the correct data type - prog_format = (GLenum)Formats[0]; - delete[] Formats; - char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); -- cgit v1.2.3 From 1a8005d9489b7eea7c840609913c7f249885cbba Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Wed, 18 Jan 2012 10:22:03 -0800 Subject: set ProgramShaderCache program format correctly. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b178157a89..8f3378dca8 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -29,7 +29,7 @@ GLintptr ProgramShaderCache::s_vs_data_offset; LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; -GLuint ProgramShaderCache::PCacheEntry::prog_format = ProgramShaderCache::PCacheEntry::SetProgramFormat(); +GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = @@ -215,9 +215,12 @@ void ProgramShaderCache::Init(void) // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { + PCacheEntry::prog_format = PCacheEntry::SetProgramFormat(); + char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); + ProgramShaderCacheInserter inserter; g_program_disk_cache.OpenAndRead(cache_filename, inserter); } -- cgit v1.2.3 From d9f3fc4495e0d836d3c6b87ce9e0390db516bd2b Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 28 Dec 2012 17:06:08 +0100 Subject: fix ubo for intel cards (also amd?) --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 8f3378dca8..3c22a107fe 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -67,10 +67,10 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) // Driver Bug? Nvidia GTX 570, 290.xx Driver, Linux x64 if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - glUniformBlockBinding(entry.prog_id, 0, 1); + glUniformBlockBinding(entry.prog_id, glGetUniformBlockIndex(entry.prog_id, "PSBlock"), 1); // Some things have no vertex shader if (entry.vsid != 0) - glUniformBlockBinding(entry.prog_id, 1, 2); + glUniformBlockBinding(entry.prog_id, glGetUniformBlockIndex(entry.prog_id, "VSBlock"), 2); } // We cache our uniform locations for now -- cgit v1.2.3 From c2898748ac210305185d0b7db0ac48001329453c Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 31 Dec 2012 02:34:27 +0100 Subject: bind locations _before_ link program, fix dest alpha --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 3c22a107fe..1131b65309 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -93,6 +93,13 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) 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) { // So we don't support binding, but we do support extended blending @@ -103,7 +110,7 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) } } - // Need to get some attribute locations + // Need to set some attribute locations if (entry.vsid != 0 && !g_ActiveConfig.backend_info.bSupportsGLSLATTRBind) { // We have no vertex Shader @@ -113,6 +120,7 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) } } + void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { CurrentFShader = PS; @@ -151,6 +159,8 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) if (g_ActiveConfig.backend_info.bSupportsGLSLCache) glProgramParameteri(entry.prog_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + SetProgramBindings(entry); + glLinkProgram(entry.prog_id); glUseProgram(entry.prog_id); -- cgit v1.2.3 From b38b62afc60fa00f2456daf292cb2c1339ad7340 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 2 Jan 2013 16:56:08 +0100 Subject: remove glsl binding support. convert every shader to version 130 --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 58 ++++++++++------------ 1 file changed, 25 insertions(+), 33 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') 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"); } -- cgit v1.2.3 From 60b8e4fb1cd39cb1612b25fd720f8521f0ceff79 Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 11 Jan 2013 11:59:42 +0100 Subject: vertex shader for texture converter --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 46cd66ca35..e57674a2fd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -107,9 +107,12 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e } // Need to set some attribute locations - 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_POSITION_ATTRIB, "vposition"); + glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); + glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB, "texture0"); + glBindAttribLocation(entry.prog_id, SHADER_COLOR0_ATTRIB, "color0"); + glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); } -- cgit v1.2.3 From 28380773137267da3394b2d7461a35bde4f47233 Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 11 Jan 2013 21:24:59 +0100 Subject: fix warnings --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index e57674a2fd..5936ce36d4 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -107,7 +107,7 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e } // Need to set some attribute locations - glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "vposition"); + glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "rawpos"); glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB, "texture0"); glBindAttribLocation(entry.prog_id, SHADER_COLOR0_ATTRIB, "color0"); -- cgit v1.2.3 From c3aafc77b39b87ae473dc306e7f69d01dc4e72b9 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 14 Jan 2013 13:58:11 +0100 Subject: upload complete uniform buffer at once this is the way of dx11. it would upload more per draw, but uses less calls. will be faster if many uniforms are changed, but slower else --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 27 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 5936ce36d4..ba9049aec3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,6 +25,9 @@ GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShade ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; +float *ProgramShaderCache::s_ubo_buffer; +u32 ProgramShaderCache::s_ubo_buffer_size; +bool ProgramShaderCache::s_ubo_dirty; LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; @@ -169,16 +172,24 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, - count * sizeof(float) * 4, f); + s_ubo_dirty = true; + memcpy(s_ubo_buffer+(offset*4), f, count*4*sizeof(float)); } void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - glBufferSubData(GL_UNIFORM_BUFFER, s_vs_data_offset + offset * sizeof(float) * 4, - count * sizeof(float) * 4, f); + s_ubo_dirty = true; + memcpy(s_ubo_buffer+(offset*4)+s_vs_data_offset/sizeof(float), f, count*4*sizeof(float)); } +void ProgramShaderCache::UploadConstants() +{ + if(s_ubo_dirty) + glBufferData(GL_UNIFORM_BUFFER, s_ubo_buffer_size, s_ubo_buffer, GL_STREAM_DRAW); + s_ubo_dirty = false; +} + + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; @@ -202,19 +213,23 @@ void ProgramShaderCache::Init(void) GLintptr const ps_data_size = ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align); GLintptr const vs_data_size = ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align); s_vs_data_offset = ps_data_size; + s_ubo_buffer_size = ps_data_size + vs_data_size; // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes glGenBuffers(1, &s_ps_vs_ubo); glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, ps_data_size + vs_data_size, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, s_ubo_buffer_size, NULL, GL_STREAM_DRAW); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader // Repeat for VS shader glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); + + s_ubo_buffer = new float[s_ubo_buffer_size/sizeof(float)]; + s_ubo_dirty = true; } // Read our shader cache, only if supported @@ -256,6 +271,8 @@ void ProgramShaderCache::Shutdown(void) glBindBuffer(GL_UNIFORM_BUFFER, 0); glDeleteBuffers(1, &s_ps_vs_ubo); s_ps_vs_ubo = 0; + delete [] s_ubo_buffer; + s_ubo_buffer = 0; } } -- cgit v1.2.3 From 5fe3def64cb21908239f2e6644507ec5b2e9e632 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 14 Jan 2013 20:00:33 +0100 Subject: videoConfig cleanup --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index ba9049aec3..4a2fc131a7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -100,7 +100,7 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& entry ) { - if (g_ActiveConfig.backend_info.bSupportsGLSLBlend) + if (g_ActiveConfig.backend_info.bSupportsDualSourceBlend) { // So we do support extended blending // So we need to set a few more things here. -- cgit v1.2.3 From ff889c0e651e2685d60eb201620de05d3650274a Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 14 Jan 2013 22:59:08 +0100 Subject: use attrib pointers in nativeVertexFormat --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 4a2fc131a7..99997b1aa6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -111,11 +111,21 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e // Need to set some attribute locations glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "rawpos"); + glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); - glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB, "texture0"); + glBindAttribLocation(entry.prog_id, SHADER_COLOR0_ATTRIB, "color0"); + glBindAttribLocation(entry.prog_id, SHADER_COLOR1_ATTRIB, "color1"); + + glBindAttribLocation(entry.prog_id, SHADER_NORM0_ATTRIB, "rawnorm0"); glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); + + for(int i=0; i<8; i++) { + char attrib_name[8]; + snprintf(attrib_name, 8, "tex%d", i); + glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB+i, attrib_name); + } } -- cgit v1.2.3 From 687d74e6c20efa3b66c839365b2431c2a4caf9e4 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 15 Jan 2013 14:22:40 +0100 Subject: only change shader if needed --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 29 +++++++++++----------- 1 file changed, 14 insertions(+), 15 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 99997b1aa6..b1930570bd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -131,26 +131,25 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { - CurrentFShader = PS; - CurrentVShader = VS; - - if (CurrentFShader == 0 && CurrentVShader == 0) - { - CurrentProgram = 0; - glUseProgram(0); + if(!PS || !VS) { + ERROR_LOG(VIDEO, "tried to bind a zero shader"); return; } + + CurrentFShader = PS; + CurrentVShader = VS; - // Fragment shaders can survive without Vertex Shaders - // We have a valid fragment shader, let's create our program + // We have a valid shaders, let's create our program std::pair ShaderPair = std::make_pair(CurrentFShader, CurrentVShader); PCache::iterator iter = pshaders.find(ShaderPair); if (iter != pshaders.end()) { PCacheEntry &entry = iter->second; - glUseProgram(entry.prog_id); - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.prog_id; + if(CurrentProgram != entry.prog_id) { + glUseProgram(entry.prog_id); + CurrentProgram = entry.prog_id; + CurrentShaderProgram = ShaderPair; + } return; } @@ -159,9 +158,7 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) // Right, the program is created now // Let's attach everything - if (entry.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.prog_id, entry.vsid); - + glAttachShader(entry.prog_id, entry.vsid); glAttachShader(entry.prog_id, entry.psid); if (g_ActiveConfig.backend_info.bSupportsGLSLCache) @@ -254,6 +251,8 @@ void ProgramShaderCache::Init(void) ProgramShaderCacheInserter inserter; g_program_disk_cache.OpenAndRead(cache_filename, inserter); } + + CurrentProgram = 0; } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From bb200acdd8a346f561b33f091d139724b562de23 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 15 Jan 2013 17:10:43 +0100 Subject: also don't search in the shader cache if the shader isn't changed --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 25 +++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b1930570bd..c6e309d359 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -21,7 +21,7 @@ namespace OGL { -GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; +GLuint ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; @@ -136,25 +136,23 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) return; } - CurrentFShader = PS; - CurrentVShader = VS; - - // We have a valid shaders, let's create our program - std::pair ShaderPair = std::make_pair(CurrentFShader, CurrentVShader); + std::pair ShaderPair = std::make_pair(PS, VS); + + // program is already bound + if(ShaderPair == CurrentShaderProgram) return; + PCache::iterator iter = pshaders.find(ShaderPair); if (iter != pshaders.end()) { PCacheEntry &entry = iter->second; - if(CurrentProgram != entry.prog_id) { - glUseProgram(entry.prog_id); - CurrentProgram = entry.prog_id; - CurrentShaderProgram = ShaderPair; - } + glUseProgram(entry.prog_id); + CurrentProgram = entry.prog_id; + CurrentShaderProgram = ShaderPair; return; } PCacheEntry entry; - entry.Create(CurrentFShader, CurrentVShader); + entry.Create(PS, VS); // Right, the program is created now // Let's attach everything @@ -253,6 +251,7 @@ void ProgramShaderCache::Init(void) } CurrentProgram = 0; + CurrentShaderProgram = std::pair(0,0); } void ProgramShaderCache::Shutdown(void) @@ -270,6 +269,8 @@ void ProgramShaderCache::Shutdown(void) g_program_disk_cache.Close(); } + glUseProgram(0); + PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) iter->second.Destroy(); -- cgit v1.2.3 From 3054d36534316e16dbc9a1cb45f2c778e33685af Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 17 Jan 2013 11:16:12 +0100 Subject: use glBindFragDataLocation instead of glDrawBuffer --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index c6e309d359..24cdb9c444 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -108,6 +108,8 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e glBindFragDataLocationIndexed(entry.prog_id, 0, 0, "ocol0"); glBindFragDataLocationIndexed(entry.prog_id, 0, 1, "ocol1"); } + else + glBindFragDataLocation(entry.prog_id, 0, "ocol0"); // Need to set some attribute locations glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "rawpos"); -- cgit v1.2.3 From 6401a18143f9c0e8fbcdf07cbd656e1ae9e833b4 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 19 Jan 2013 00:12:02 +0100 Subject: remove texture sampler from uniform list --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 24cdb9c444..ad0173341c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -37,8 +37,6 @@ GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { - // SAMPLERS - "samp0","samp1","samp2","samp3","samp4","samp5","samp6","samp7", // PIXEL SHADER UNIFORMS I_COLORS, I_KCOLORS, @@ -84,16 +82,19 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) //glGetUniformIndices(entry.prog_id, NUM_UNIFORMS, UniformNames, entry.UniformLocations); // Got to do it this crappy way. if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for (int a = 8; a < NUM_UNIFORMS; ++a) + for (int a = 0; a < NUM_UNIFORMS; ++a) entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); // Bind Texture Sampler for (int a = 0; a < 8; ++a) { + char name[8]; + snprintf(name, 8, "samp%d", 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); + int loc = glGetUniformLocation(entry.prog_id, name); + if (loc != -1) + glUniform1i(loc, a); } } -- cgit v1.2.3 From 074f73c64193318676abe84645e82b58eb099021 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 19 Jan 2013 00:39:31 +0100 Subject: move utils texture to sampler 8+9 rasterfont tex will aways bound to samp8. efb copy utils will be done in samp9. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index ad0173341c..cbeed4376c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -86,7 +86,7 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); // Bind Texture Sampler - for (int a = 0; a < 8; ++a) + for (int a = 0; a <= 9; ++a) { char name[8]; snprintf(name, 8, "samp%d", a); -- cgit v1.2.3 From cf11f0ea720d891b7463e2613850af43b892b5d4 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 21 Jan 2013 15:43:04 +0100 Subject: clear uniform cache on startup --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index cbeed4376c..db7e954c44 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -237,6 +237,7 @@ void ProgramShaderCache::Init(void) glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); s_ubo_buffer = new float[s_ubo_buffer_size/sizeof(float)]; + memset(s_ubo_buffer, 0, s_ubo_buffer_size); s_ubo_dirty = true; } -- cgit v1.2.3 From a526fc5f92676f78923d759c501240bd4366963b Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 25 Jan 2013 13:20:42 +0100 Subject: ubo streaming --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index db7e954c44..44906bdf0b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -21,9 +21,12 @@ namespace OGL { +static const u32 UBO_LENGTH = 1024*1024; + GLuint ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; +u32 ProgramShaderCache::s_ubo_iterator; GLintptr ProgramShaderCache::s_vs_data_offset; float *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; @@ -192,12 +195,23 @@ void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float void ProgramShaderCache::UploadConstants() { - if(s_ubo_dirty) - glBufferData(GL_UNIFORM_BUFFER, s_ubo_buffer_size, s_ubo_buffer, GL_STREAM_DRAW); + if(s_ubo_dirty) { + if(s_ubo_iterator + s_ubo_buffer_size >= UBO_LENGTH) { + glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_DRAW); + s_ubo_iterator = 0; + } + void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); + memcpy(ubo, s_ubo_buffer, s_ubo_buffer_size); + glUnmapBuffer(GL_UNIFORM_BUFFER); + + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, s_ubo_iterator, s_vs_data_offset); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_ubo_iterator + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); + + s_ubo_iterator += s_ubo_buffer_size; + } s_ubo_dirty = false; } - GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; @@ -228,13 +242,8 @@ void ProgramShaderCache::Init(void) // Then once more to get bytes glGenBuffers(1, &s_ps_vs_ubo); glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, s_ubo_buffer_size, NULL, GL_STREAM_DRAW); - - // Now bind the buffer to the index point - // We know PS is 0 since we have it statically set in the shader - // Repeat for VS shader - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, 0, ps_data_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_vs_data_offset, vs_data_size); + glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_DRAW); + s_ubo_iterator = 0; s_ubo_buffer = new float[s_ubo_buffer_size/sizeof(float)]; memset(s_ubo_buffer, 0, s_ubo_buffer_size); -- cgit v1.2.3 From 4fadb6525941cc743be395edf5d10dfffa076944 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 26 Jan 2013 11:24:24 -0600 Subject: Only check shader compilation status in debug or with DEBUG_GLSL defined. invalidate range on bindbufferrange since we don't care about what is in the range. Both give a performance boost for me. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 44906bdf0b..73a9d5b105 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -200,7 +200,7 @@ void ProgramShaderCache::UploadConstants() glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_DRAW); s_ubo_iterator = 0; } - void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); + void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_RANGE_BIT); memcpy(ubo, s_ubo_buffer, s_ubo_buffer_size); glUnmapBuffer(GL_UNIFORM_BUFFER); -- cgit v1.2.3 From fd06342a97e6bedfdedac390e89c88454983c815 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 28 Jan 2013 13:03:31 +0100 Subject: set hint GL_STREAM_READ it's wrong, but so we are guaranteed to get pinned memory. it's slower for rendering, but faster for mapping. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 73a9d5b105..974d839900 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -197,7 +197,7 @@ void ProgramShaderCache::UploadConstants() { if(s_ubo_dirty) { if(s_ubo_iterator + s_ubo_buffer_size >= UBO_LENGTH) { - glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_DRAW); + glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_READ); s_ubo_iterator = 0; } void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_RANGE_BIT); @@ -242,7 +242,7 @@ void ProgramShaderCache::Init(void) // Then once more to get bytes glGenBuffers(1, &s_ps_vs_ubo); glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_DRAW); + glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_READ); s_ubo_iterator = 0; s_ubo_buffer = new float[s_ubo_buffer_size/sizeof(float)]; -- cgit v1.2.3 From d94f3c4155d8248bb08cbbf7fcd96d8d3d44516d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 28 Jan 2013 15:18:54 -0600 Subject: Stop using std::pair and std::map. Switch over to u64 and std::unordered_map. Provides a very small speed boost. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 974d839900..e1763038ec 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -37,7 +37,11 @@ GLenum ProgramFormat; GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; -std::pair ProgramShaderCache::CurrentShaderProgram; +u64 ProgramShaderCache::CurrentShaderProgram; +u64 Create_Pair(u32 key1, u32 key2) +{ + return (((u64)key1) << 32) | key2; +} const char *UniformNames[NUM_UNIFORMS] = { // PIXEL SHADER UNIFORMS @@ -142,7 +146,7 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) return; } - std::pair ShaderPair = std::make_pair(PS, VS); + u64 ShaderPair = Create_Pair(PS, VS); // program is already bound if(ShaderPair == CurrentShaderProgram) return; @@ -264,7 +268,7 @@ void ProgramShaderCache::Init(void) } CurrentProgram = 0; - CurrentShaderProgram = std::pair(0,0); + CurrentShaderProgram = 0; } void ProgramShaderCache::Shutdown(void) -- cgit v1.2.3 From fa454035571544fe58936c0c821ed8ccb5e6b72d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 28 Jan 2013 15:32:38 -0600 Subject: Got to love that my server's cmake is half retarded. --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index e1763038ec..76bf1e7e81 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -32,16 +32,23 @@ float *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; bool ProgramShaderCache::s_ubo_dirty; -LinearDiskCache g_program_disk_cache; +LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; u64 ProgramShaderCache::CurrentShaderProgram; + u64 Create_Pair(u32 key1, u32 key2) { return (((u64)key1) << 32) | key2; } +void Get_Pair(u64 key, u32 *key1, u32 *key2) +{ + *key1 = (key & 0xFFFFFFFF00000000) >> 32; + *key2 = key & 0xFFFFFFFF; +} + const char *UniformNames[NUM_UNIFORMS] = { // PIXEL SHADER UNIFORMS -- cgit v1.2.3 From 4a463f4588e2968c499236458c5712a489622633 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 31 Jan 2013 13:00:15 +0100 Subject: also add glBufferSubData for ubo upload so osx start game, but everything is black --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 76bf1e7e81..552a08f961 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -212,8 +212,12 @@ void ProgramShaderCache::UploadConstants() s_ubo_iterator = 0; } void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_RANGE_BIT); - memcpy(ubo, s_ubo_buffer, s_ubo_buffer_size); - glUnmapBuffer(GL_UNIFORM_BUFFER); + if(ubo) { + memcpy(ubo, s_ubo_buffer, s_ubo_buffer_size); + glUnmapBuffer(GL_UNIFORM_BUFFER); + } else { + glBufferSubData(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, s_ubo_buffer); + } glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, s_ubo_iterator, s_vs_data_offset); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_ubo_iterator + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); -- cgit v1.2.3 From 30170575c828c5b11dfdaa0ef05e58e0a24c486e Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 31 Jan 2013 23:11:53 +0100 Subject: create StreamBuffer class for ogl upload --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 44 +++++++--------------- 1 file changed, 14 insertions(+), 30 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 552a08f961..e7f2bdf43b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -17,6 +17,7 @@ #include "ProgramShaderCache.h" #include "MathUtil.h" +#include "StreamBuffer.h" namespace OGL { @@ -25,10 +26,8 @@ static const u32 UBO_LENGTH = 1024*1024; GLuint ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; -GLuint ProgramShaderCache::s_ps_vs_ubo; -u32 ProgramShaderCache::s_ubo_iterator; GLintptr ProgramShaderCache::s_vs_data_offset; -float *ProgramShaderCache::s_ubo_buffer; +u8 *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; bool ProgramShaderCache::s_ubo_dirty; @@ -39,6 +38,8 @@ GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; u64 ProgramShaderCache::CurrentShaderProgram; +static StreamBuffer *s_buffer; + u64 Create_Pair(u32 key1, u32 key2) { return (((u64)key1) << 32) | key2; @@ -195,36 +196,23 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4), f, count*4*sizeof(float)); + memcpy(s_ubo_buffer+(offset*4*sizeof(float)), f, count*4*sizeof(float)); } void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) { s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4)+s_vs_data_offset/sizeof(float), f, count*4*sizeof(float)); + memcpy(s_ubo_buffer+(offset*4*sizeof(float))+s_vs_data_offset, f, count*4*sizeof(float)); } void ProgramShaderCache::UploadConstants() { if(s_ubo_dirty) { - if(s_ubo_iterator + s_ubo_buffer_size >= UBO_LENGTH) { - glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_READ); - s_ubo_iterator = 0; - } - void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_RANGE_BIT); - if(ubo) { - memcpy(ubo, s_ubo_buffer, s_ubo_buffer_size); - glUnmapBuffer(GL_UNIFORM_BUFFER); - } else { - glBufferSubData(GL_UNIFORM_BUFFER, s_ubo_iterator, s_ubo_buffer_size, s_ubo_buffer); - } - - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_ps_vs_ubo, s_ubo_iterator, s_vs_data_offset); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_ps_vs_ubo, s_ubo_iterator + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); - - s_ubo_iterator += s_ubo_buffer_size; + size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_vs_data_offset); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); + s_ubo_dirty = false; } - s_ubo_dirty = false; } GLuint ProgramShaderCache::GetCurrentProgram(void) @@ -255,12 +243,9 @@ void ProgramShaderCache::Init(void) // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glGenBuffers(1, &s_ps_vs_ubo); - glBindBuffer(GL_UNIFORM_BUFFER, s_ps_vs_ubo); - glBufferData(GL_UNIFORM_BUFFER, UBO_LENGTH, NULL, GL_STREAM_READ); - s_ubo_iterator = 0; + s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH); - s_ubo_buffer = new float[s_ubo_buffer_size/sizeof(float)]; + s_ubo_buffer = new u8[s_ubo_buffer_size]; memset(s_ubo_buffer, 0, s_ubo_buffer_size); s_ubo_dirty = true; } @@ -306,9 +291,8 @@ void ProgramShaderCache::Shutdown(void) if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - glBindBuffer(GL_UNIFORM_BUFFER, 0); - glDeleteBuffers(1, &s_ps_vs_ubo); - s_ps_vs_ubo = 0; + delete s_buffer; + s_buffer = 0; delete [] s_ubo_buffer; s_ubo_buffer = 0; } -- cgit v1.2.3 From 878bd7f26c229eba4a9e61fe2905e1c3f2d2085b Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 1 Feb 2013 12:30:08 +0100 Subject: implement streaming by bufferSubData, split upload and allocation in ringbuffer --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index e7f2bdf43b..7c828031ab 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -208,6 +208,7 @@ void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float void ProgramShaderCache::UploadConstants() { if(s_ubo_dirty) { + s_buffer->Alloc(s_ubo_buffer_size); size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size); glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_vs_data_offset); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); -- cgit v1.2.3 From 76adc77fa6aea54cff18ca5aa3a8f2e5d37594db Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 5 Feb 2013 18:01:27 +0100 Subject: bigger buffers --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 7c828031ab..242663d20c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -22,7 +22,7 @@ namespace OGL { -static const u32 UBO_LENGTH = 1024*1024; +static const u32 UBO_LENGTH = 4*1024*1024; GLuint ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; -- cgit v1.2.3 From ef602fd643ff9eebb86bd03219e44493b0c6441a Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 5 Feb 2013 18:22:23 +0100 Subject: workaround for glGetUniformLocation in efb2ram --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 242663d20c..b56bb8919d 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -96,8 +96,9 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) // (Sonicadvance): For some reason this fails on my hardware //glGetUniformIndices(entry.prog_id, NUM_UNIFORMS, UniformNames, entry.UniformLocations); // Got to do it this crappy way. + entry.UniformLocations[0] = glGetUniformLocation(entry.prog_id, UniformNames[0]); if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - for (int a = 0; a < NUM_UNIFORMS; ++a) + for (int a = 1; a < NUM_UNIFORMS; ++a) entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); // Bind Texture Sampler -- cgit v1.2.3 From f079b04a5daafc1def25bb26c1111c4b02039666 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 7 Feb 2013 12:47:41 +0100 Subject: also check for glsl errors on linking, activation GLSL_DEBUG again (slowdown on shader compilation) --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b56bb8919d..5481f26541 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -184,6 +184,48 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) SetProgramBindings(entry); glLinkProgram(entry.prog_id); + +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLsizei length = 0; + glGetProgramiv(entry.prog_id, GL_INFO_LOG_LENGTH, &length); + if (length > 1) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetProgramInfoLog(entry.prog_id, length, &charsWritten, infoLog); + ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); + char szTemp[MAX_PATH]; + sprintf(szTemp, "p_%d.txt", entry.prog_id); + FILE *fp = fopen(szTemp, "wb"); + fwrite(infoLog, length, 1, fp); + delete[] infoLog; + + glGetShaderiv(VS, GL_SHADER_SOURCE_LENGTH, &length); + GLchar* src = new GLchar[length]; + glGetShaderSource(VS, length, &charsWritten, src); + fwrite(src, strlen(src), 1, fp); + delete [] src; + + glGetShaderiv(PS, GL_SHADER_SOURCE_LENGTH, &length); + src = new GLchar[length]; + glGetShaderSource(PS, length, &charsWritten, src); + fwrite(src, strlen(src), 1, fp); + delete [] src; + fclose(fp); + } + + GLint linkStatus; + glGetProgramiv(entry.prog_id, GL_LINK_STATUS, &linkStatus); + if (linkStatus != GL_TRUE) + { + // Compile failed + ERROR_LOG(VIDEO, "Program linking failed; see info log"); + + // Don't try to use this shader + glDeleteProgram(entry.prog_id); + return; + } +#endif glUseProgram(entry.prog_id); -- cgit v1.2.3 From bbc292c21000ee3532c1fb4e955dc03951a6e2f6 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 13 Feb 2013 13:12:19 +0100 Subject: merge Vertex and PixelShaderCache into ProgramShaderCache this is the first step, uniform handling is still missing --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 334 +++++++++++++++------ 1 file changed, 234 insertions(+), 100 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 5481f26541..fcffa175c6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -18,37 +18,30 @@ #include "ProgramShaderCache.h" #include "MathUtil.h" #include "StreamBuffer.h" +#include "Debugger.h" +#include "Statistics.h" namespace OGL { static const u32 UBO_LENGTH = 4*1024*1024; -GLuint ProgramShaderCache::CurrentProgram = 0; +static GLuint CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLintptr ProgramShaderCache::s_vs_data_offset; u8 *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; bool ProgramShaderCache::s_ubo_dirty; -LinearDiskCache g_program_disk_cache; +LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; -u64 ProgramShaderCache::CurrentShaderProgram; - static StreamBuffer *s_buffer; -u64 Create_Pair(u32 key1, u32 key2) -{ - return (((u64)key1) << 32) | key2; -} -void Get_Pair(u64 key, u32 *key1, u32 *key2) -{ - *key1 = (key & 0xFFFFFFFF00000000) >> 32; - *key2 = key & 0xFFFFFFFF; -} +ProgramShaderCache::PCacheEntry* ProgramShaderCache::last_entry; +SHADERUID ProgramShaderCache::last_uid; const char *UniformNames[NUM_UNIFORMS] = { @@ -75,18 +68,21 @@ const char *UniformNames[NUM_UNIFORMS] = I_DEPTHPARAMS, }; -void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) +void SHADER::SetProgramVariables() { + // glsl shader must be bind to set samplers + Bind(); + // Bind UBO if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) { - GLint PSBlock_id = glGetUniformBlockIndex(entry.prog_id, "PSBlock"); - GLint VSBlock_id = glGetUniformBlockIndex(entry.prog_id, "VSBlock"); + GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); + GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); if(PSBlock_id != -1) - glUniformBlockBinding(entry.prog_id, PSBlock_id, 1); + glUniformBlockBinding(glprogid, PSBlock_id, 1); if(VSBlock_id != -1) - glUniformBlockBinding(entry.prog_id, VSBlock_id, 2); + glUniformBlockBinding(glprogid, VSBlock_id, 2); } // We cache our uniform locations for now @@ -94,12 +90,12 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) // We can remove this // (Sonicadvance): For some reason this fails on my hardware - //glGetUniformIndices(entry.prog_id, NUM_UNIFORMS, UniformNames, entry.UniformLocations); + //glGetUniformIndices(glprogid, NUM_UNIFORMS, UniformNames, UniformLocations); // Got to do it this crappy way. - entry.UniformLocations[0] = glGetUniformLocation(entry.prog_id, UniformNames[0]); + UniformLocations[0] = glGetUniformLocation(glprogid, UniformNames[0]); if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) for (int a = 1; a < NUM_UNIFORMS; ++a) - entry.UniformLocations[a] = glGetUniformLocation(entry.prog_id, UniformNames[a]); + UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); // Bind Texture Sampler for (int a = 0; a <= 9; ++a) @@ -108,165 +104,284 @@ void ProgramShaderCache::SetProgramVariables(PCacheEntry &entry) snprintf(name, 8, "samp%d", a); // Still need to get sampler locations since we aren't binding them statically in the shaders - int loc = glGetUniformLocation(entry.prog_id, name); + int loc = glGetUniformLocation(glprogid, name); if (loc != -1) glUniform1i(loc, a); } } -void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& entry ) +void SHADER::SetProgramBindings() { if (g_ActiveConfig.backend_info.bSupportsDualSourceBlend) { // 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"); + glBindFragDataLocationIndexed(glprogid, 0, 0, "ocol0"); + glBindFragDataLocationIndexed(glprogid, 0, 1, "ocol1"); } else - glBindFragDataLocation(entry.prog_id, 0, "ocol0"); + glBindFragDataLocation(glprogid, 0, "ocol0"); // Need to set some attribute locations - glBindAttribLocation(entry.prog_id, SHADER_POSITION_ATTRIB, "rawpos"); + glBindAttribLocation(glprogid, SHADER_POSITION_ATTRIB, "rawpos"); - glBindAttribLocation(entry.prog_id, SHADER_POSMTX_ATTRIB, "fposmtx"); + glBindAttribLocation(glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); - glBindAttribLocation(entry.prog_id, SHADER_COLOR0_ATTRIB, "color0"); - glBindAttribLocation(entry.prog_id, SHADER_COLOR1_ATTRIB, "color1"); + glBindAttribLocation(glprogid, SHADER_COLOR0_ATTRIB, "color0"); + glBindAttribLocation(glprogid, SHADER_COLOR1_ATTRIB, "color1"); - glBindAttribLocation(entry.prog_id, SHADER_NORM0_ATTRIB, "rawnorm0"); - glBindAttribLocation(entry.prog_id, SHADER_NORM1_ATTRIB, "rawnorm1"); - glBindAttribLocation(entry.prog_id, SHADER_NORM2_ATTRIB, "rawnorm2"); + glBindAttribLocation(glprogid, SHADER_NORM0_ATTRIB, "rawnorm0"); + glBindAttribLocation(glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); + glBindAttribLocation(glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); for(int i=0; i<8; i++) { char attrib_name[8]; snprintf(attrib_name, 8, "tex%d", i); - glBindAttribLocation(entry.prog_id, SHADER_TEXTURE0_ATTRIB+i, attrib_name); + glBindAttribLocation(glprogid, SHADER_TEXTURE0_ATTRIB+i, attrib_name); } } +void SHADER::Bind() +{ + if(CurrentProgram != glprogid) + { + glUseProgram(glprogid); + CurrentProgram = glprogid; + } +} + + +void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) +{ + s_ubo_dirty = true; + memcpy(s_ubo_buffer+(offset*4*sizeof(float)), f, count*4*sizeof(float)); +} + +void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) +{ + s_ubo_dirty = true; + memcpy(s_ubo_buffer+(offset*4*sizeof(float))+s_vs_data_offset, f, count*4*sizeof(float)); +} -void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) +void ProgramShaderCache::UploadConstants() { - if(!PS || !VS) { - ERROR_LOG(VIDEO, "tried to bind a zero shader"); - return; + if(s_ubo_dirty) { + s_buffer->Alloc(s_ubo_buffer_size); + size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_vs_data_offset); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); + s_ubo_dirty = false; } +} + +GLuint ProgramShaderCache::GetCurrentProgram(void) +{ + return CurrentProgram; +} + +SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 components ) +{ + SHADERUID uid; + GetShaderId(&uid, dstAlphaMode, components); - u64 ShaderPair = Create_Pair(PS, VS); + // Check if the shader is already set + if (last_entry) + { + if (uid == last_uid) + { + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + ValidateShaderIDs(last_entry, dstAlphaMode, components); + last_entry->shader.Bind(); + return &last_entry->shader; + } + } - // program is already bound - if(ShaderPair == CurrentShaderProgram) return; + last_uid = uid; - PCache::iterator iter = pshaders.find(ShaderPair); + // Check if shader is already in cache + PCache::iterator iter = pshaders.find(uid); if (iter != pshaders.end()) { - PCacheEntry &entry = iter->second; - glUseProgram(entry.prog_id); - CurrentProgram = entry.prog_id; - CurrentShaderProgram = ShaderPair; - return; + PCacheEntry *entry = &iter->second; + last_entry = entry; + + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + ValidateShaderIDs(entry, dstAlphaMode, components); + last_entry->shader.Bind(); + return &last_entry->shader; + } + + // Make an entry in the table + PCacheEntry& newentry = pshaders[uid]; + last_entry = &newentry; + + const char *vcode = GenerateVertexShaderCode(components, API_OPENGL); + const char *pcode = GeneratePixelShaderCode(dstAlphaMode, API_OPENGL, components); + + if (g_ActiveConfig.bEnableShaderDebugging) + { + GetSafePixelShaderId(&newentry.safe_uid, dstAlphaMode, components); + newentry.shader.strvprog = vcode; + newentry.shader.strpprog = pcode; } - PCacheEntry entry; - entry.Create(PS, VS); +#if defined(_DEBUG) || defined(DEBUGFAST) + if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { + static int counter = 0; + char szTemp[MAX_PATH]; + sprintf(szTemp, "%svs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(szTemp, vcode); + sprintf(szTemp, "%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(szTemp, pcode); + } +#endif - // Right, the program is created now - // Let's attach everything - glAttachShader(entry.prog_id, entry.vsid); - glAttachShader(entry.prog_id, entry.psid); + if (!CompileShader(newentry.shader, vcode, pcode)) { + GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); + return NULL; + } + + INCSTAT(stats.numPixelShadersCreated); + SETSTAT(stats.numPixelShadersAlive, pshaders.size()); + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + + last_entry->shader.Bind(); + return &last_entry->shader; +} + +bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, const char* pcode ) +{ + GLuint vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode); + GLuint psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode); + + if(!vsid || !psid) + { + glDeleteShader(vsid); + glDeleteShader(psid); + return false; + } + + GLuint pid = shader.glprogid = glCreateProgram();; + + glAttachShader(pid, vsid); + glAttachShader(pid, psid); if (g_ActiveConfig.backend_info.bSupportsGLSLCache) - glProgramParameteri(entry.prog_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); - SetProgramBindings(entry); + shader.SetProgramBindings(); - glLinkProgram(entry.prog_id); + glLinkProgram(pid); + + // original shaders aren't needed any more + glDeleteShader(vsid); + glDeleteShader(psid); #if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) GLsizei length = 0; - glGetProgramiv(entry.prog_id, GL_INFO_LOG_LENGTH, &length); + glGetProgramiv(pid, GL_INFO_LOG_LENGTH, &length); if (length > 1) { GLsizei charsWritten; GLchar* infoLog = new GLchar[length]; - glGetProgramInfoLog(entry.prog_id, length, &charsWritten, infoLog); + glGetProgramInfoLog(pid, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); char szTemp[MAX_PATH]; - sprintf(szTemp, "p_%d.txt", entry.prog_id); + sprintf(szTemp, "p_%d.txt", pid); FILE *fp = fopen(szTemp, "wb"); fwrite(infoLog, length, 1, fp); delete[] infoLog; - - glGetShaderiv(VS, GL_SHADER_SOURCE_LENGTH, &length); - GLchar* src = new GLchar[length]; - glGetShaderSource(VS, length, &charsWritten, src); - fwrite(src, strlen(src), 1, fp); - delete [] src; - - glGetShaderiv(PS, GL_SHADER_SOURCE_LENGTH, &length); - src = new GLchar[length]; - glGetShaderSource(PS, length, &charsWritten, src); - fwrite(src, strlen(src), 1, fp); - delete [] src; + fwrite(vcode, strlen(vcode), 1, fp); + fwrite(pcode, strlen(pcode), 1, fp); fclose(fp); } GLint linkStatus; - glGetProgramiv(entry.prog_id, GL_LINK_STATUS, &linkStatus); + glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); if (linkStatus != GL_TRUE) { // Compile failed ERROR_LOG(VIDEO, "Program linking failed; see info log"); // Don't try to use this shader - glDeleteProgram(entry.prog_id); - return; + glDeleteProgram(pid); + return false; } #endif - glUseProgram(entry.prog_id); - - SetProgramVariables(entry); - - pshaders[ShaderPair] = entry; - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.prog_id; + shader.SetProgramVariables(); + + return true; } -void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) +GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) { - s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4*sizeof(float)), f, count*4*sizeof(float)); + GLuint result = glCreateShader(type); + + const char *src[] = {code}; + + glShaderSource(result, 1, src, NULL); + glCompileShader(result); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLsizei length = 0; + glGetShaderiv(result, GL_INFO_LOG_LENGTH, &length); + if (length > 1) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetShaderInfoLog(result, length, &charsWritten, infoLog); + ERROR_LOG(VIDEO, "PS Shader info log:\n%s", infoLog); + char szTemp[MAX_PATH]; + sprintf(szTemp, "ps_%d.txt", result); + FILE *fp = fopen(szTemp, "wb"); + fwrite(infoLog, strlen(infoLog), 1, fp); + fwrite(code, strlen(code), 1, fp); + fclose(fp); + delete[] infoLog; + } + + GLint compileStatus; + glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); + if (compileStatus != GL_TRUE) + { + // Compile failed + ERROR_LOG(VIDEO, "Shader compilation failed; see info log"); + + // Don't try to use this shader + glDeleteShader(result); + return 0; + } +#endif + (void)GL_REPORT_ERROR(); + return result; } -void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) + + +void ProgramShaderCache::GetShaderId ( SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components ) { - s_ubo_dirty = true; - memcpy(s_ubo_buffer+(offset*4*sizeof(float))+s_vs_data_offset, f, count*4*sizeof(float)); + GetPixelShaderId(&uid->puid, dstAlphaMode, components); + GetVertexShaderId(&uid->vuid, components); } -void ProgramShaderCache::UploadConstants() +void ProgramShaderCache::GetSafeShaderId ( SHADERUIDSAFE* uid, DSTALPHA_MODE dstAlphaMode, u32 components ) { - if(s_ubo_dirty) { - s_buffer->Alloc(s_ubo_buffer_size); - size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_vs_data_offset); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset); - s_ubo_dirty = false; - } + GetSafePixelShaderId(&uid->puid, dstAlphaMode, components); + GetSafeVertexShaderId(&uid->vuid, components); } -GLuint ProgramShaderCache::GetCurrentProgram(void) +void ProgramShaderCache::ValidateShaderIDs ( PCacheEntry *entry, DSTALPHA_MODE dstAlphaMode, u32 components ) { - return CurrentProgram; + //ValidatePixelShaderIDs(API_OPENGL, entry->safe_uid, entry->shader.strprog, dstAlphaMode, components); } + + ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void) { - return pshaders[CurrentShaderProgram]; + return *last_entry; } void ProgramShaderCache::Init(void) @@ -308,7 +423,7 @@ void ProgramShaderCache::Init(void) } CurrentProgram = 0; - CurrentShaderProgram = 0; + last_entry = NULL; } void ProgramShaderCache::Shutdown(void) @@ -318,7 +433,7 @@ void ProgramShaderCache::Shutdown(void) PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) { - g_program_disk_cache.Append(iter->second.uid, iter->second.GetProgram(), iter->second.Size()); + g_program_disk_cache.Append(iter->first, iter->second.GetProgram(), iter->second.Size()); iter->second.FreeProgram(); } @@ -342,4 +457,23 @@ void ProgramShaderCache::Shutdown(void) } } +void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key, const u8* value, u32 value_size ) +{ + // The two shaders might not even exist anymore + // But it is fine, no need to worry about that + PCacheEntry entry; + entry.shader.glprogid = glCreateProgram(); + glProgramBinary(entry.shader.glprogid, entry.prog_format, value, value_size); + + GLint success; + glGetProgramiv(entry.shader.glprogid, GL_LINK_STATUS, &success); + + if (success) + { + pshaders[key] = entry; + entry.shader.SetProgramVariables(); + } +} + + } // namespace OGL -- cgit v1.2.3 From 398b37f371f5a9666ed70ac364650ad7b9412053 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 13 Feb 2013 15:16:32 +0100 Subject: fix ValidateShaderIDs --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index fcffa175c6..d8de0c9149 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -222,7 +222,7 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen if (g_ActiveConfig.bEnableShaderDebugging) { - GetSafePixelShaderId(&newentry.safe_uid, dstAlphaMode, components); + GetSafeShaderId(&newentry.safe_uid, dstAlphaMode, components); newentry.shader.strvprog = vcode; newentry.shader.strpprog = pcode; } @@ -374,7 +374,8 @@ void ProgramShaderCache::GetSafeShaderId ( SHADERUIDSAFE* uid, DSTALPHA_MODE dst void ProgramShaderCache::ValidateShaderIDs ( PCacheEntry *entry, DSTALPHA_MODE dstAlphaMode, u32 components ) { - //ValidatePixelShaderIDs(API_OPENGL, entry->safe_uid, entry->shader.strprog, dstAlphaMode, components); + ValidateVertexShaderIDs(API_OPENGL, entry->safe_uid.vuid, entry->shader.strvprog, components); + ValidatePixelShaderIDs(API_OPENGL, entry->safe_uid.puid, entry->shader.strpprog, dstAlphaMode, components); } -- cgit v1.2.3 From b3675d15dc29b30b3b847dad7143cfa4bb281ac3 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 13 Feb 2013 16:30:15 +0100 Subject: enable shader cache again --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 56 +++++++++++++++------- 1 file changed, 40 insertions(+), 16 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index d8de0c9149..2108080bdd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -34,9 +34,6 @@ u32 ProgramShaderCache::s_ubo_buffer_size; bool ProgramShaderCache::s_ubo_dirty; LinearDiskCache g_program_disk_cache; -GLenum ProgramFormat; - -GLuint ProgramShaderCache::PCacheEntry::prog_format = 0; static StreamBuffer *s_buffer; @@ -216,6 +213,7 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen // Make an entry in the table PCacheEntry& newentry = pshaders[uid]; last_entry = &newentry; + newentry.in_cache = 0; const char *vcode = GenerateVertexShaderCode(components, API_OPENGL); const char *pcode = GeneratePixelShaderCode(dstAlphaMode, API_OPENGL, components); @@ -413,14 +411,23 @@ void ProgramShaderCache::Init(void) // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { - PCacheEntry::prog_format = PCacheEntry::SetProgramFormat(); - - char cache_filename[MAX_PATH]; - sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); - - ProgramShaderCacheInserter inserter; - g_program_disk_cache.OpenAndRead(cache_filename, inserter); + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + if(!Supported) + { + ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So disable shader cache."); + g_ActiveConfig.backend_info.bSupportsGLSLCache = false; + } + else + { + char cache_filename[MAX_PATH]; + sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); + + ProgramShaderCacheInserter inserter; + g_program_disk_cache.OpenAndRead(cache_filename, inserter); + } + SETSTAT(stats.numPixelShadersAlive, pshaders.size()); } CurrentProgram = 0; @@ -429,13 +436,25 @@ void ProgramShaderCache::Init(void) void ProgramShaderCache::Shutdown(void) { + // store all shaders in cache on disk if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) { - g_program_disk_cache.Append(iter->first, iter->second.GetProgram(), iter->second.Size()); - iter->second.FreeProgram(); + if(iter->second.in_cache) continue; + + GLint binary_size; + glGetProgramiv(iter->second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); + if(!binary_size) continue; + + u8 *data = new u8[binary_size+sizeof(GLenum)]; + u8 *binary = data + sizeof(GLenum); + GLenum *prog_format = (GLenum*)data; + glGetProgramBinary(iter->second.shader.glprogid, binary_size, NULL, prog_format, binary); + + g_program_disk_cache.Append(iter->first, data, binary_size+sizeof(GLenum)); + delete [] data; } g_program_disk_cache.Sync(); @@ -460,11 +479,14 @@ void ProgramShaderCache::Shutdown(void) void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key, const u8* value, u32 value_size ) { - // The two shaders might not even exist anymore - // But it is fine, no need to worry about that + const u8 *binary = value+sizeof(GLenum); + GLenum *prog_format = (GLenum*)value; + GLint binary_size = value_size-sizeof(GLenum); + PCacheEntry entry; + entry.in_cache = 1; entry.shader.glprogid = glCreateProgram(); - glProgramBinary(entry.shader.glprogid, entry.prog_format, value, value_size); + glProgramBinary(entry.shader.glprogid, *prog_format, binary, binary_size); GLint success; glGetProgramiv(entry.shader.glprogid, GL_LINK_STATUS, &success); @@ -474,6 +496,8 @@ void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key pshaders[key] = entry; entry.shader.SetProgramVariables(); } + else + glDeleteProgram(entry.shader.glprogid); } -- cgit v1.2.3 From 21b83b436ca98a246e96c8aca20c373c71bcc0c7 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 13 Feb 2013 16:50:56 +0100 Subject: create shader cache directoy --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 2108080bdd..0fe2ef1d68 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -420,6 +420,9 @@ void ProgramShaderCache::Init(void) } else { + if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) + File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); + char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); -- cgit v1.2.3 From 0325e37bfb4269500a03ac48f8ff7ca8ab94e101 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 13 Feb 2013 21:34:48 +0100 Subject: merge glsl headers into one place --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 48 +++++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 0fe2ef1d68..51a7887308 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -26,20 +26,21 @@ namespace OGL static const u32 UBO_LENGTH = 4*1024*1024; -static GLuint CurrentProgram = 0; -ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLintptr ProgramShaderCache::s_vs_data_offset; u8 *ProgramShaderCache::s_ubo_buffer; u32 ProgramShaderCache::s_ubo_buffer_size; bool ProgramShaderCache::s_ubo_dirty; -LinearDiskCache g_program_disk_cache; - static StreamBuffer *s_buffer; +LinearDiskCache g_program_disk_cache; +static GLuint CurrentProgram = 0; +ProgramShaderCache::PCache ProgramShaderCache::pshaders; ProgramShaderCache::PCacheEntry* ProgramShaderCache::last_entry; SHADERUID ProgramShaderCache::last_uid; +static char s_glsl_header[1024] = ""; + const char *UniformNames[NUM_UNIFORMS] = { // PIXEL SHADER UNIFORMS @@ -291,7 +292,9 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons FILE *fp = fopen(szTemp, "wb"); fwrite(infoLog, length, 1, fp); delete[] infoLog; + fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); fwrite(vcode, strlen(vcode), 1, fp); + fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); fwrite(pcode, strlen(pcode), 1, fp); fclose(fp); } @@ -318,9 +321,9 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) { GLuint result = glCreateShader(type); - const char *src[] = {code}; + const char *src[] = {s_glsl_header, code}; - glShaderSource(result, 1, src, NULL); + glShaderSource(result, 2, src, NULL); glCompileShader(result); #if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) GLsizei length = 0; @@ -335,6 +338,7 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) sprintf(szTemp, "ps_%d.txt", result); FILE *fp = fopen(szTemp, "wb"); fwrite(infoLog, strlen(infoLog), 1, fp); + fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); fwrite(code, strlen(code), 1, fp); fclose(fp); delete[] infoLog; @@ -433,6 +437,8 @@ void ProgramShaderCache::Init(void) SETSTAT(stats.numPixelShadersAlive, pshaders.size()); } + CreateHeader(); + CurrentProgram = 0; last_entry = NULL; } @@ -480,6 +486,36 @@ void ProgramShaderCache::Shutdown(void) } } +void ProgramShaderCache::CreateHeader ( void ) +{ + snprintf(s_glsl_header, sizeof(s_glsl_header), + "#version %s\n" + "#extension GL_ARB_texture_rectangle : enable\n" + "%s\n" // ubo + + "\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 in\n" + "#define VARYOUT out\n" + + // Silly differences + "#define float2 vec2\n" + "#define float3 vec3\n" + "#define float4 vec4\n" + + // hlsl to glsl function translation + "#define frac(x) fract(x)\n" + "#define saturate(x) clamp(x, 0.0f, 1.0f)\n" + "#define lerp(x, y, z) mix(x, y, z)\n" + + + , "130" + , g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" + ); +} + + void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key, const u8* value, u32 value_size ) { const u8 *binary = value+sizeof(GLenum); -- cgit v1.2.3 From a0ef58418b7c99bb4c2e426d98acc44e29a4295a Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 14 Feb 2013 18:59:45 +0100 Subject: workaround for buggy intel windows driver. revert this as soon as there are newer driver --- .../Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 51a7887308..4a943b42d5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -488,6 +488,19 @@ void ProgramShaderCache::Shutdown(void) void ProgramShaderCache::CreateHeader ( void ) { +#ifdef _WIN32 + // Intel Windows driver has a issue: + // their glsl doesn't know about the ubo extension, so we can't load it. + // but as version 140, ubo is in core and don't have to be loaded in glsl. + // as sandy do ogl3.1, glsl 140 is supported, so force it in this way. + // TODO: remove this again when the issue is fixed: + // see http://communities.intel.com/thread/36084 + u8 *vendor = glGetString(GL_VENDOR); + bool intel_windows_hack = strcmp(vendor, "Intel") == 0; +#else + bool intel_windows_hack = false; +#endif + snprintf(s_glsl_header, sizeof(s_glsl_header), "#version %s\n" "#extension GL_ARB_texture_rectangle : enable\n" @@ -510,8 +523,8 @@ void ProgramShaderCache::CreateHeader ( void ) "#define lerp(x, y, z) mix(x, y, z)\n" - , "130" - , g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" + , intel_windows_hack ? "140" : "130" + , g_ActiveConfig.backend_info.bSupportsGLSLUBO && !intel_windows_hack ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" ); } -- cgit v1.2.3 From 9f4a616f2ed841808141949451c32b75704ef268 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 14 Feb 2013 19:04:52 +0100 Subject: build fix --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 4a943b42d5..bf4c0b7c1d 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -495,7 +495,7 @@ void ProgramShaderCache::CreateHeader ( void ) // as sandy do ogl3.1, glsl 140 is supported, so force it in this way. // TODO: remove this again when the issue is fixed: // see http://communities.intel.com/thread/36084 - u8 *vendor = glGetString(GL_VENDOR); + char *vendor = (char*)glGetString(GL_VENDOR); bool intel_windows_hack = strcmp(vendor, "Intel") == 0; #else bool intel_windows_hack = false; -- cgit v1.2.3 From 242d960781a5ec6fc1a9aeb2a2a772aff489880d Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 22 Feb 2013 10:25:38 +0100 Subject: increase buffer size 32M UBO, 16M Vertex, 2M Index --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index bf4c0b7c1d..6513a62f2b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -24,7 +24,7 @@ namespace OGL { -static const u32 UBO_LENGTH = 4*1024*1024; +static const u32 UBO_LENGTH = 32*1024*1024; GLintptr ProgramShaderCache::s_vs_data_offset; u8 *ProgramShaderCache::s_ubo_buffer; -- cgit v1.2.3 From e4f8d7b4c8a67e9505de31e6e52ecb087e8be7a7 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 4 Mar 2013 10:20:55 +0100 Subject: fix debug build --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 6513a62f2b..85957251b0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -20,6 +20,7 @@ #include "StreamBuffer.h" #include "Debugger.h" #include "Statistics.h" +#include "ImageWrite.h" namespace OGL { -- cgit v1.2.3 From d19bc15d265cc478449acdd247b3d158e2a11c40 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 5 Mar 2013 15:24:10 +0100 Subject: fix glsl140 workaround --- Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 85957251b0..af08cc5402 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -497,14 +497,17 @@ void ProgramShaderCache::CreateHeader ( void ) // TODO: remove this again when the issue is fixed: // see http://communities.intel.com/thread/36084 char *vendor = (char*)glGetString(GL_VENDOR); - bool intel_windows_hack = strcmp(vendor, "Intel") == 0; + bool glsl140_hack = strcmp(vendor, "Intel") == 0; +#elif __APPLE__ + // as apple doesn't support glsl130 at all, we also have to use glsl140 + bool glsl140_hack = true; #else - bool intel_windows_hack = false; + bool glsl140_hack = false; #endif snprintf(s_glsl_header, sizeof(s_glsl_header), "#version %s\n" - "#extension GL_ARB_texture_rectangle : enable\n" + "%s\n" // tex_rect "%s\n" // ubo "\n"// A few required defines and ones that will make our lives a lot easier @@ -524,8 +527,9 @@ void ProgramShaderCache::CreateHeader ( void ) "#define lerp(x, y, z) mix(x, y, z)\n" - , intel_windows_hack ? "140" : "130" - , g_ActiveConfig.backend_info.bSupportsGLSLUBO && !intel_windows_hack ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" + , glsl140_hack ? "140" : "130" + , glsl140_hack ? "#define texture2DRect texture" : "#extension GL_ARB_texture_rectangle : enable" + , g_ActiveConfig.backend_info.bSupportsGLSLUBO && !glsl140_hack ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" ); } -- cgit v1.2.3 From 2bd7ba76b9acb469990f647bb1e6651c93188650 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 7 Mar 2013 20:26:56 +0100 Subject: only report errors without debug_glsl --- .../Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index af08cc5402..c42e540042 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -279,10 +279,11 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glDeleteShader(vsid); glDeleteShader(psid); -#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLint linkStatus; + glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); GLsizei length = 0; glGetProgramiv(pid, GL_INFO_LOG_LENGTH, &length); - if (length > 1) + if (linkStatus != GL_TRUE || (length > 1 && DEBUG_GLSL)) { GLsizei charsWritten; GLchar* infoLog = new GLchar[length]; @@ -299,9 +300,6 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons fwrite(pcode, strlen(pcode), 1, fp); fclose(fp); } - - GLint linkStatus; - glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); if (linkStatus != GL_TRUE) { // Compile failed @@ -311,7 +309,6 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glDeleteProgram(pid); return false; } -#endif shader.SetProgramVariables(); @@ -326,10 +323,11 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) glShaderSource(result, 2, src, NULL); glCompileShader(result); -#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLint compileStatus; + glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); GLsizei length = 0; glGetShaderiv(result, GL_INFO_LOG_LENGTH, &length); - if (length > 1) + if (compileStatus != GL_TRUE || (length > 1 && DEBUG_GLSL)) { GLsizei charsWritten; GLchar* infoLog = new GLchar[length]; @@ -344,9 +342,6 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) fclose(fp); delete[] infoLog; } - - GLint compileStatus; - glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); if (compileStatus != GL_TRUE) { // Compile failed @@ -356,7 +351,6 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) glDeleteShader(result); return 0; } -#endif (void)GL_REPORT_ERROR(); return result; } -- cgit v1.2.3 From a6844d6b9e7b4c376d2c8b280bc3ede0968f0f1e Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 7 Mar 2013 20:37:28 +0100 Subject: move shader error files in dolphin user directory --- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 26 +++++++++------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp') diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index c42e540042..a441ba2d64 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -290,15 +290,12 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glGetProgramInfoLog(pid, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); char szTemp[MAX_PATH]; - sprintf(szTemp, "p_%d.txt", pid); - FILE *fp = fopen(szTemp, "wb"); - fwrite(infoLog, length, 1, fp); - delete[] infoLog; - fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); - fwrite(vcode, strlen(vcode), 1, fp); - fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); - fwrite(pcode, strlen(pcode), 1, fp); - fclose(fp); + sprintf(szTemp, "%sp_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), pid); + std::ofstream file; + OpenFStream(file, szTemp, std::ios_base::out); + file << infoLog << s_glsl_header << vcode << s_glsl_header << pcode; + file.close(); + delete [] infoLog; } if (linkStatus != GL_TRUE) { @@ -334,12 +331,11 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) glGetShaderInfoLog(result, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "PS Shader info log:\n%s", infoLog); char szTemp[MAX_PATH]; - sprintf(szTemp, "ps_%d.txt", result); - FILE *fp = fopen(szTemp, "wb"); - fwrite(infoLog, strlen(infoLog), 1, fp); - fwrite(s_glsl_header, strlen(s_glsl_header), 1, fp); - fwrite(code, strlen(code), 1, fp); - fclose(fp); + sprintf(szTemp, "%sps_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), result); + std::ofstream file; + OpenFStream(file, szTemp, std::ios_base::out); + file << infoLog << s_glsl_header << code; + file.close(); delete[] infoLog; } if (compileStatus != GL_TRUE) -- cgit v1.2.3