summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2011-12-10 07:38:30 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2011-12-10 07:38:30 -0600
commit7ab38cff68e411bf104ebc55373ca6f2b2ad9c66 (patch)
treef908c7449f86d16eef46f5e2e7b8acc6dba6afac /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
parent49664bff61d26d8120daa31b2e0afb2090e7474a (diff)
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.
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp56
1 files changed, 40 insertions, 16 deletions
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 <assert.h>
-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)
{