From ad13f2d23d8dd809e5f5246a7ea45bbcb0b3fc70 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 11 Dec 2011 06:18:01 -0600 Subject: [PATCH] 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. --- .../Plugin_VideoOGL/Src/NativeVertexFormat.cpp | 17 +++-------------- .../Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 18 +++--------------- .../Plugin_VideoOGL/Src/ProgramShaderCache.h | 2 -- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp b/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp index c83c976fb2..d42b2a7222 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/NativeVertexFormat.cpp @@ -192,15 +192,8 @@ void GLVertexFormat::SetupVertexPointers() { if (vtx_decl.num_normals >= 1) { glNormalPointer(VarToGL(vtx_decl.normal_gl_type), vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.normal_offset[0])); if (vtx_decl.num_normals == 3) { - GLint varLocation1 = SHADER_NORM1_ATTRIB, varLocation2 = SHADER_NORM2_ATTRIB; - if(g_ActiveConfig.bUseGLSL){ - varLocation1 = OGL::ProgramShaderCache::GetAttr(0); - varLocation2 = OGL::ProgramShaderCache::GetAttr(1); - } - if(varLocation1 > 0) - glVertexAttribPointer(varLocation1, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.normal_offset[1])); - if(varLocation2 > 0) - glVertexAttribPointer(varLocation2, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.normal_offset[2])); + glVertexAttribPointer(SHADER_NORM1_ATTRIB, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.normal_offset[1])); + glVertexAttribPointer(SHADER_NORM2_ATTRIB, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.normal_offset[2])); } } @@ -224,11 +217,7 @@ void GLVertexFormat::SetupVertexPointers() { } if (vtx_decl.posmtx_offset != -1) { - GLint varLocation = SHADER_POSMTX_ATTRIB; - if(g_ActiveConfig.bUseGLSL) - varLocation = OGL::ProgramShaderCache::GetAttr(2); - if(varLocation > 0) - glVertexAttribPointer(varLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.posmtx_offset)); + glVertexAttribPointer(SHADER_POSMTX_ATTRIB, 4, GL_UNSIGNED_BYTE, GL_FALSE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.posmtx_offset)); } #endif } 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; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h index 26d5735ce6..4830f28849 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h @@ -72,7 +72,6 @@ struct PROGRAMSHADER PROGRAMSHADER() : glprogid(0), vsid(0), psid(0){} GLuint glprogid; // opengl program id GLuint vsid, psid; - GLint attrLoc[3]; GLint UniformLocations[NUM_UNIFORMS]; }; @@ -100,7 +99,6 @@ class ProgramShaderCache public: static PROGRAMSHADER GetShaderProgram(void); - static GLint GetAttr(int num); static void SetBothShaders(GLuint PS, GLuint VS); static GLuint GetCurrentProgram(void);