Commit b74a85df authored by hybrid's avatar hybrid

Add the new OpenGL2.x scheme for shader creation.

Properly clean up shaders, which were not completely removed before.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3214 dfc29bdd-3216-0410-991c-e03cc46cb475
parent c981decf
......@@ -34,9 +34,18 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
pGlCreateShaderObjectARB(0), pGlShaderSourceARB(0),
pGlCompileShaderARB(0), pGlCreateProgramObjectARB(0), pGlAttachObjectARB(0),
pGlLinkProgramARB(0), pGlUseProgramObjectARB(0), pGlDeleteObjectARB(0),
pGlGetObjectParameterivARB(0), pGlGetUniformLocationARB(0),
pGlCreateProgram(0), pGlUseProgram(0),
pGlDeleteProgram(0), pGlDeleteShader(0),
pGlGetAttachedObjectsARB(0), pGlGetAttachedShaders(0),
pGlCreateShader(0), pGlShaderSource(0), pGlCompileShader(0),
pGlAttachShader(0), pGlLinkProgram(0),
pGlGetInfoLogARB(0), pGlGetShaderInfoLog(0), pGlGetProgramInfoLog(0),
pGlGetObjectParameterivARB(0), pGlGetShaderiv(0), pGlGetProgramiv(0),
pGlGetUniformLocationARB(0), pGlGetUniformLocation(0),
pGlUniform1ivARB(0), pGlUniform1fvARB(0), pGlUniform2fvARB(0), pGlUniform3fvARB(0), pGlUniform4fvARB(0), pGlUniformMatrix2fvARB(0),
pGlUniformMatrix3fvARB(0), pGlUniformMatrix4fvARB(0), pGlGetActiveUniformARB(0), pGlPointParameterfARB(0), pGlPointParameterfvARB(0),
pGlUniformMatrix3fvARB(0), pGlUniformMatrix4fvARB(0),
pGlGetActiveUniformARB(0), pGlGetActiveUniform(0),
pGlPointParameterfARB(0), pGlPointParameterfvARB(0),
pGlStencilFuncSeparate(0), pGlStencilOpSeparate(0),
pGlStencilFuncSeparateATI(0), pGlStencilOpSeparateATI(0),
pGlCompressedTexImage2D(0),
......@@ -139,16 +148,32 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) wglGetProcAddress("glDeleteProgramsNV");
pGlProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) wglGetProcAddress("glProgramLocalParameter4fvARB");
pGlCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) wglGetProcAddress("glCreateShaderObjectARB");
pGlCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");
pGlShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) wglGetProcAddress("glShaderSourceARB");
pGlShaderSource = (PFNGLSHADERSOURCEPROC) wglGetProcAddress("glShaderSource");
pGlCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) wglGetProcAddress("glCompileShaderARB");
pGlCompileShader = (PFNGLCOMPILESHADERPROC) wglGetProcAddress("glCompileShader");
pGlCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) wglGetProcAddress("glCreateProgramObjectARB");
pGlCreateProgram = (PFNGLCREATEPROGRAMPROC) wglGetProcAddress("glCreateProgram");
pGlAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress("glAttachObjectARB");
pGlAttachShader = (PFNGLATTACHSHADERPROC) wglGetProcAddress("glAttachShader");
pGlLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress("glLinkProgramARB");
pGlLinkProgram = (PFNGLLINKPROGRAMPROC) wglGetProcAddress("glLinkProgram");
pGlUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress("glUseProgramObjectARB");
pGlUseProgram = (PFNGLUSEPROGRAMPROC) wglGetProcAddress("glUseProgram");
pGlDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) wglGetProcAddress("glDeleteObjectARB");
pGlDeleteProgram = (PFNGLDELETEPROGRAMPROC) wglGetProcAddress("glDeleteProgram");
pGlDeleteShader = (PFNGLDELETESHADERPROC) wglGetProcAddress("glDeleteShader");
pGlGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) wglGetProcAddress("glGetAttachedShaders");
pGlGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) wglGetProcAddress("glGetAttachedObjectsARB");
pGlGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) wglGetProcAddress("glGetInfoLogARB");
pGlGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) wglGetProcAddress("glGetShaderInfoLog");
pGlGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) wglGetProcAddress("glGetProgramInfoLog");
pGlGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) wglGetProcAddress("glGetObjectParameterivARB");
pGlGetShaderiv = (PFNGLGETSHADERIVPROC) wglGetProcAddress("glGetShader");
pGlGetProgramiv = (PFNGLGETPROGRAMIVPROC) wglGetProcAddress("glGetProgram");
pGlGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) wglGetProcAddress("glGetUniformLocationARB");
pGlGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) wglGetProcAddress("glGetUniformLocation");
pGlUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) wglGetProcAddress("glUniform4fvARB");
pGlUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) wglGetProcAddress("glUniform1ivARB");
pGlUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) wglGetProcAddress("glUniform1fvARB");
......@@ -158,6 +183,7 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) wglGetProcAddress("glUniformMatrix3fvARB");
pGlUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) wglGetProcAddress("glUniformMatrix4fvARB");
pGlGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) wglGetProcAddress("glGetActiveUniformARB");
pGlGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) wglGetProcAddress("glGetActiveUniform");
// get point parameter extension
pGlPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC) wglGetProcAddress("glPointParameterfARB");
......@@ -277,36 +303,84 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCreateShaderObjectARB"));
pGlCreateShader = (PFNGLCREATESHADERPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCreateShader"));
pGlShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glShaderSourceARB"));
pGlShaderSource = (PFNGLSHADERSOURCEPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glShaderSource"));
pGlCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCompileShaderARB"));
pGlCompileShader = (PFNGLCOMPILESHADERPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCompileShader"));
pGlCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCreateProgramObjectARB"));
pGlCreateProgram = (PFNGLCREATEPROGRAMPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glCreateProgram"));
pGlAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glAttachObjectARB"));
pGlAttachShader = (PFNGLATTACHSHADERPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glAttachShader"));
pGlLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glLinkProgram"));
pGlLinkProgram = (PFNGLLINKPROGRAMPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glLinkProgramARB"));
pGlUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glUseProgramObjectARB"));
pGlUseProgram = (PFNGLUSEPROGRAMPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glUseProgram"));
pGlDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteObjectARB"));
pGlDeleteProgram = (PFNGLDELETEPROGRAMPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteProgram"));
pGlDeleteShader = (PFNGLDELETESHADERPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteShader"));
pGlGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetAttachedObjectsARB"));
pGlGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetAttachedShaders"));
pGlGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetInfoLogARB"));
pGlGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetShaderInfoLog"));
pGlGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetProgramInfoLog"));
pGlGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetObjectParameterivARB"));
pGlGetShaderiv = (PFNGLGETSHADERIVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetShader"));
pGlGetProgramiv = (PFNGLGETPROGRAMIVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetProgram"));
pGlGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetUniformLocationARB"));
pGlGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetUniformLocation"));
pGlUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glUniform4fvARB"));
......@@ -337,6 +411,9 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetActiveUniformARB"));
pGlGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGetActiveUniform"));
// get point parameter extension
pGlPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glPointParameterfARB"));
......
......@@ -856,16 +856,41 @@ class COpenGLExtensionHandler
void extGlDeletePrograms(GLsizei n, const GLuint *programs);
void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);
GLhandleARB extGlCreateShaderObject(GLenum shaderType);
void extGlShaderSource(GLhandleARB shader, int numOfStrings, const char **strings, int *lenOfStrings);
void extGlCompileShader(GLhandleARB shader);
GLuint extGlCreateShader(GLenum shaderType);
// note: Due to the type confusion between shader_objects and OpenGL 2.0
// we have to add the ARB extension for proper method definitions in case
// that handleARB and uint are the same type
void extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
void extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
// note: Due to the type confusion between shader_objects and OpenGL 2.0
// we have to add the ARB extension for proper method definitions in case
// that handleARB and uint are the same type
void extGlCompileShaderARB(GLhandleARB shader);
void extGlCompileShader(GLuint shader);
GLhandleARB extGlCreateProgramObject(void);
GLuint extGlCreateProgram(void);
void extGlAttachObject(GLhandleARB program, GLhandleARB shader);
void extGlLinkProgram(GLhandleARB program);
void extGlAttachShader(GLuint program, GLuint shader);
void extGlLinkProgramARB(GLhandleARB program);
// note: Due to the type confusion between shader_objects and OpenGL 2.0
// we have to add the ARB extension for proper method definitions in case
// that handleARB and uint are the same type
void extGlLinkProgram(GLuint program);
void extGlUseProgramObject(GLhandleARB prog);
void extGlUseProgram(GLuint prog);
void extGlDeleteObject(GLhandleARB object);
void extGlDeleteProgram(GLuint object);
void extGlDeleteShader(GLuint shader);
void extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
void extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders);
void extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, int *param);
GLint extGlGetUniformLocation(GLhandleARB program, const char *name);
void extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
void extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param);
void extGlGetShaderiv(GLuint shader, GLenum type, GLint *param);
void extGlGetProgramiv(GLuint program, GLenum type, GLint *param);
GLint extGlGetUniformLocationARB(GLhandleARB program, const char *name);
GLint extGlGetUniformLocation(GLuint program, const char *name);
void extGlUniform4fv(GLint location, GLsizei count, const GLfloat *v);
void extGlUniform1iv(GLint loc, GLsizei count, const GLint *v);
void extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v);
......@@ -874,7 +899,8 @@ class COpenGLExtensionHandler
void extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
void extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
void extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
void extGlGetActiveUniform(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
void extGlGetActiveUniformARB(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
void extGlGetActiveUniform(GLuint program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
// framebuffer objects
void extGlBindFramebuffer(GLenum target, GLuint framebuffer);
......@@ -927,16 +953,32 @@ class COpenGLExtensionHandler
PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;
PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;
PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;
PFNGLCREATESHADERPROC pGlCreateShader;
PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;
PFNGLSHADERSOURCEPROC pGlShaderSource;
PFNGLCOMPILESHADERARBPROC pGlCompileShaderARB;
PFNGLCOMPILESHADERPROC pGlCompileShader;
PFNGLCREATEPROGRAMOBJECTARBPROC pGlCreateProgramObjectARB;
PFNGLCREATEPROGRAMPROC pGlCreateProgram;
PFNGLATTACHOBJECTARBPROC pGlAttachObjectARB;
PFNGLATTACHSHADERPROC pGlAttachShader;
PFNGLLINKPROGRAMARBPROC pGlLinkProgramARB;
PFNGLLINKPROGRAMPROC pGlLinkProgram;
PFNGLUSEPROGRAMOBJECTARBPROC pGlUseProgramObjectARB;
PFNGLUSEPROGRAMPROC pGlUseProgram;
PFNGLDELETEOBJECTARBPROC pGlDeleteObjectARB;
PFNGLDELETEPROGRAMPROC pGlDeleteProgram;
PFNGLDELETESHADERPROC pGlDeleteShader;
PFNGLGETATTACHEDOBJECTSARBPROC pGlGetAttachedObjectsARB;
PFNGLGETATTACHEDSHADERSPROC pGlGetAttachedShaders;
PFNGLGETINFOLOGARBPROC pGlGetInfoLogARB;
PFNGLGETSHADERINFOLOGPROC pGlGetShaderInfoLog;
PFNGLGETPROGRAMINFOLOGPROC pGlGetProgramInfoLog;
PFNGLGETOBJECTPARAMETERIVARBPROC pGlGetObjectParameterivARB;
PFNGLGETSHADERIVPROC pGlGetShaderiv;
PFNGLGETSHADERIVPROC pGlGetProgramiv;
PFNGLGETUNIFORMLOCATIONARBPROC pGlGetUniformLocationARB;
PFNGLGETUNIFORMLOCATIONPROC pGlGetUniformLocation;
PFNGLUNIFORM1IVARBPROC pGlUniform1ivARB;
PFNGLUNIFORM1FVARBPROC pGlUniform1fvARB;
PFNGLUNIFORM2FVARBPROC pGlUniform2fvARB;
......@@ -946,6 +988,7 @@ class COpenGLExtensionHandler
PFNGLUNIFORMMATRIX3FVARBPROC pGlUniformMatrix3fvARB;
PFNGLUNIFORMMATRIX4FVARBPROC pGlUniformMatrix4fvARB;
PFNGLGETACTIVEUNIFORMARBPROC pGlGetActiveUniformARB;
PFNGLGETACTIVEUNIFORMPROC pGlGetActiveUniform;
PFNGLPOINTPARAMETERFARBPROC pGlPointParameterfARB;
PFNGLPOINTPARAMETERFVARBPROC pGlPointParameterfvARB;
PFNGLSTENCILFUNCSEPARATEPROC pGlStencilFuncSeparate;
......@@ -1115,7 +1158,20 @@ inline GLhandleARB COpenGLExtensionHandler::extGlCreateShaderObject(GLenum shade
return 0;
}
inline void COpenGLExtensionHandler::extGlShaderSource(GLhandleARB shader, int numOfStrings, const char **strings, int *lenOfStrings)
inline GLuint COpenGLExtensionHandler::extGlCreateShader(GLenum shaderType)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlCreateShader)
return pGlCreateShader(shaderType);
#elif defined(GL_VERSION_2_0)
return glCreateShader(shaderType);
#else
os::Printer::log("glCreateShader not supported", ELL_ERROR);
#endif
return 0;
}
inline void COpenGLExtensionHandler::extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlShaderSourceARB)
......@@ -1127,7 +1183,19 @@ inline void COpenGLExtensionHandler::extGlShaderSource(GLhandleARB shader, int n
#endif
}
inline void COpenGLExtensionHandler::extGlCompileShader(GLhandleARB shader)
inline void COpenGLExtensionHandler::extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlShaderSource)
pGlShaderSource(shader, numOfStrings, strings, lenOfStrings);
#elif defined(GL_VERSION_2_0)
glShaderSource(shader, numOfStrings, strings, (GLint *)lenOfStrings);
#else
os::Printer::log("glShaderSource not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlCompileShaderARB(GLhandleARB shader)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlCompileShaderARB)
......@@ -1139,6 +1207,18 @@ inline void COpenGLExtensionHandler::extGlCompileShader(GLhandleARB shader)
#endif
}
inline void COpenGLExtensionHandler::extGlCompileShader(GLuint shader)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlCompileShader)
pGlCompileShader(shader);
#elif defined(GL_VERSION_2_0)
glCompileShader(shader);
#else
os::Printer::log("glCompileShader not supported", ELL_ERROR);
#endif
}
inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1152,6 +1232,19 @@ inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)
return 0;
}
inline GLuint COpenGLExtensionHandler::extGlCreateProgram(void)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlCreateProgram)
return pGlCreateProgram();
#elif defined(GL_VERSION_2_0)
return glCreateProgram();
#else
os::Printer::log("glCreateProgram not supported", ELL_ERROR);
#endif
return 0;
}
inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLhandleARB shader)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1164,7 +1257,19 @@ inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLha
#endif
}
inline void COpenGLExtensionHandler::extGlLinkProgram(GLhandleARB program)
inline void COpenGLExtensionHandler::extGlAttachShader(GLuint program, GLuint shader)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlAttachShader)
pGlAttachShader(program, shader);
#elif defined(GL_VERSION_2_0)
glAttachShader(program, shader);
#else
os::Printer::log("glAttachShader not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlLinkProgramARB(GLhandleARB program)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlLinkProgramARB)
......@@ -1176,6 +1281,18 @@ inline void COpenGLExtensionHandler::extGlLinkProgram(GLhandleARB program)
#endif
}
inline void COpenGLExtensionHandler::extGlLinkProgram(GLuint program)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlLinkProgram)
pGlLinkProgram(program);
#elif defined(GL_VERSION_2_0)
glLinkProgram(program);
#else
os::Printer::log("glLinkProgram not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1188,6 +1305,18 @@ inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)
#endif
}
inline void COpenGLExtensionHandler::extGlUseProgram(GLuint prog)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlUseProgram)
pGlUseProgram(prog);
#elif defined(GL_VERSION_2_0)
glUseProgram(prog);
#else
os::Printer::log("glUseProgram not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1196,7 +1325,55 @@ inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)
#elif defined(GL_ARB_shader_objects)
glDeleteObjectARB(object);
#else
os::Printer::log("gldeleteObject not supported", ELL_ERROR);
os::Printer::log("glDeleteObject not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlDeleteProgram(GLuint object)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlDeleteProgram)
pGlDeleteProgram(object);
#elif defined(GL_VERSION_2_0)
glDeleteProgram(object);
#else
os::Printer::log("glDeleteProgram not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlDeleteShader(GLuint shader)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlDeleteShader)
pGlDeleteShader(shader);
#elif defined(GL_VERSION_2_0)
glDeleteShader(shader);
#else
os::Printer::log("glDeleteShader not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetAttachedObjectsARB)
pGlGetAttachedObjectsARB(program, maxcount, count, shaders);
#elif defined(GL_ARB_shader_objects)
glGetAttachedObjectsARB(program, maxcount, count, shaders);
#else
os::Printer::log("glGetAttachedObjects not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetAttachedShaders)
pGlGetAttachedShaders(program, maxcount, count, shaders);
#elif defined(GL_VERSION_2_0)
glGetAttachedShaders(program, maxcount, count, shaders);
#else
os::Printer::log("glGetAttachedShaders not supported", ELL_ERROR);
#endif
}
......@@ -1212,19 +1389,67 @@ inline void COpenGLExtensionHandler::extGlGetInfoLog(GLhandleARB object, GLsizei
#endif
}
inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, int *param)
inline void COpenGLExtensionHandler::extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetShaderInfoLog)
pGlGetShaderInfoLog(shader, maxLength, length, infoLog);
#elif defined(GL_VERSION_2_0)
glGetShaderInfoLog(shader, maxLength, length, infoLog);
#else
os::Printer::log("glGetShaderInfoLog not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetProgramInfoLog)
pGlGetProgramInfoLog(program, maxLength, length, infoLog);
#elif defined(GL_VERSION_2_0)
glGetProgramInfoLog(program, maxLength, length, infoLog);
#else
os::Printer::log("glGetProgramInfoLog not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetObjectParameterivARB)
pGlGetObjectParameterivARB(object, type, param);
#elif defined(GL_ARB_shader_objects)
glGetObjectParameterivARB(object, type, (GLint *)param);
glGetObjectParameterivARB(object, type, param);
#else
os::Printer::log("glGetObjectParameteriv not supported", ELL_ERROR);
#endif
}
inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLhandleARB program, const char *name)
inline void COpenGLExtensionHandler::extGlGetShaderiv(GLuint shader, GLenum type, GLint *param)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetShaderiv)
pGlGetShaderiv(shader, type, param);
#elif defined(GL_VERSION_2_0)
glGetShaderiv(shader, type, param);
#else
os::Printer::log("glGetShaderiv not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlGetProgramiv(GLuint program, GLenum type, GLint *param)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetProgramiv)
pGlGetProgramiv(program, type, param);
#elif defined(GL_VERSION_2_0)
glGetShaderiv(program, type, param);
#else
os::Printer::log("glGetProgramiv not supported", ELL_ERROR);
#endif
}
inline GLint COpenGLExtensionHandler::extGlGetUniformLocationARB(GLhandleARB program, const char *name)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetUniformLocationARB)
......@@ -1237,6 +1462,19 @@ inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLhandleARB progra
return 0;
}
inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLuint program, const char *name)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetUniformLocation)
return pGlGetUniformLocation(program, name);
#elif defined(GL_VERSION_2_0)
return glGetUniformLocation(program, name);
#else
os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
#endif
return 0;
}
inline void COpenGLExtensionHandler::extGlUniform4fv(GLint location, GLsizei count, const GLfloat *v)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1333,7 +1571,7 @@ inline void COpenGLExtensionHandler::extGlUniformMatrix4fv(GLint loc, GLsizei co
#endif
}
inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLhandleARB program,
inline void COpenGLExtensionHandler::extGlGetActiveUniformARB(GLhandleARB program,
GLuint index, GLsizei maxlength, GLsizei *length,
GLint *size, GLenum *type, GLcharARB *name)
{
......@@ -1347,6 +1585,20 @@ inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLhandleARB program,
#endif
}
inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLuint program,
GLuint index, GLsizei maxlength, GLsizei *length,
GLint *size, GLenum *type, GLchar *name)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGetActiveUniform)
pGlGetActiveUniform(program, index, maxlength, length, size, type, name);
#elif defined(GL_VERSION_2_0)
glGetActiveUniform(program, index, maxlength, length, size, type, name);
#else
os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlPointParameterf(GLint loc, GLfloat f)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
......@@ -1780,7 +2032,7 @@ inline void COpenGLExtensionHandler::extGlBlendFuncIndexed(GLuint buf, GLenum sr
}
inline void COpenGLExtensionHandler::extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value)
inline void COpenGLExtensionHandler::extGlProgramParameteri(GLuint program, GLenum pname, GLint value)
{
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
if (queryFeature(EVDF_GEOMETRY_SHADER))
......
......@@ -44,7 +44,7 @@ COpenGLSLMaterialRenderer::COpenGLSLMaterialRenderer(video::COpenGLDriver* drive
video::IMaterialRenderer* baseMaterial,
s32 userData)
: Driver(driver), CallBack(callback), BaseMaterial(baseMaterial),
Program(0), UserData(userData)
Program(0), Program2(0), UserData(userData)
{
#ifdef _DEBUG
setDebugName("COpenGLSLMaterialRenderer");
......@@ -73,7 +73,7 @@ COpenGLSLMaterialRenderer::COpenGLSLMaterialRenderer(COpenGLDriver* driver,
IShaderConstantSetCallBack* callback,
IMaterialRenderer* baseMaterial, s32 userData)
: Driver(driver), CallBack(callback), BaseMaterial(baseMaterial),
Program(0), UserData(userData)
Program(0), Program2(0), UserData(userData)
{
if (BaseMaterial)
BaseMaterial->grab();
......@@ -89,12 +89,28 @@ COpenGLSLMaterialRenderer::~COpenGLSLMaterialRenderer()
if (CallBack)
CallBack->drop();
if(Program)
if (Program)
{
GLhandleARB shaders[8];
GLint count;
Driver->extGlGetAttachedObjects(Program, 8, &count, shaders);
for (GLint i=0; i<count; ++i)
Driver->extGlDeleteObject(shaders[i]);
Driver->extGlDeleteObject(Program);
Program = 0;
}
if (Program2)
{
GLuint shaders[8];
GLint count;
Driver->extGlGetAttachedShaders(Program2, 8, &count, shaders);
for (GLint i=0; i<count; ++i)
Driver->extGlDeleteShader(shaders[i]);
Driver->extGlDeleteProgram(Program2);
Program2 = 0;
}
UniformInfo.clear();
if (BaseMaterial)
......@@ -130,12 +146,24 @@ void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr,
if (!createShader(GL_GEOMETRY_SHADER_EXT, geometryShaderProgram))
return;
#if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_shader4)
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_INPUT_TYPE_EXT, Driver->primitiveTypeToGL(inType));
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_OUTPUT_TYPE_EXT, Driver->primitiveTypeToGL(outType));
if (verticesOut==0)
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_VERTICES_OUT_EXT, Driver->MaxGeometryVerticesOut);
if (Program2)
{
Driver->extGlProgramParameteri(Program2, GL_GEOMETRY_INPUT_TYPE_EXT, Driver->primitiveTypeToGL(inType));
Driver->extGlProgramParameteri(Program2, GL_GEOMETRY_OUTPUT_TYPE_EXT, Driver->primitiveTypeToGL(outType));
if (verticesOut==0)
Driver->extGlProgramParameteri(Program2, GL_GEOMETRY_VERTICES_OUT_EXT, Driver->MaxGeometryVerticesOut);
else
Driver->extGlProgramParameteri(Program2, GL_GEOMETRY_VERTICES_OUT_EXT, core::min_(verticesOut, Driver->MaxGeometryVerticesOut));
}
else
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_VERTICES_OUT_EXT, core::min_(verticesOut, Driver->MaxGeometryVerticesOut));
{
Driver->extGlProgramParameteri((GLuint)Program, GL_GEOMETRY_INPUT_TYPE_EXT, Driver->primitiveTypeToGL(inType));
Driver->extGlProgramParameteri((GLuint)Program, GL_GEOMETRY_OUTPUT_TYPE_EXT, Driver->primitiveTypeToGL(outType));
if (verticesOut==0)
Driver->extGlProgramParameteri((GLuint)Program, GL_GEOMETRY_VERTICES_OUT_EXT, Driver->MaxGeometryVerticesOut);
else
Driver->extGlProgramParameteri((GLuint)Program, GL_GEOMETRY_VERTICES_OUT_EXT, core::min_(verticesOut, Driver->MaxGeometryVerticesOut));
}
#elif defined(GL_NV_geometry_program4)
if (verticesOut==0)
Driver->extGlProgramVertexLimit(GL_GEOMETRY_PROGRAM_NV, Driver->MaxGeometryVerticesOut);
......@@ -171,7 +199,9 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material,
{
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{
if (Program)
if (Program2)
Driver->extGlUseProgram(Program2);
else if (Program)
Driver->extGlUseProgramObject(Program);
if (BaseMaterial)
......@@ -190,7 +220,10 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material,
void COpenGLSLMaterialRenderer::OnUnsetMaterial()
{
Driver->extGlUseProgramObject(0);
if (Program)
Driver->extGlUseProgramObject(0);
if (Program2)
Driver->extGlUseProgram(0);
if (BaseMaterial)
BaseMaterial->OnUnsetMaterial();
......@@ -206,120 +239,232 @@ bool COpenGLSLMaterialRenderer::isTransparent() const
bool COpenGLSLMaterialRenderer::createProgram()
{
Program = Driver->extGlCreateProgramObject();
if (Driver->Version>=200)
Program2 = Driver->extGlCreateProgram();
else
Program = Driver->extGlCreateProgramObject();
return true;
}
bool COpenGLSLMaterialRenderer::createShader(GLenum shaderType, const char* shader)
{
GLhandleARB shaderHandle = Driver->extGlCreateShaderObject(shaderType);
if (Program2)
{
GLuint shaderHandle = Driver->extGlCreateShader(shaderType);
Driver->extGlShaderSource(Program2, 1, &shader, NULL);
Driver->extGlCompileShader(shaderHandle);
Driver->extGlShaderSource(shaderHandle, 1, &shader, NULL);
Driver->extGlCompileShader(shaderHandle);
GLint status = 0;
int status = 0;
#ifdef GL_VERSION_2_0
Driver->extGlGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &status);
#endif
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(shaderHandle, GL_OBJECT_COMPILE_STATUS_ARB, &status);
if (!status)
{
os::Printer::log("GLSL shader failed to compile", ELL_ERROR);
// check error message and log it
GLint maxLength=0;
GLint length;
#ifdef GL_VERSION_2_0
Driver->extGlGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH,
&maxLength);
#endif
GLchar *infoLog = new GLchar[maxLength];
Driver->extGlGetShaderInfoLog(shaderHandle, maxLength, &length, infoLog);
os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR);
delete [] infoLog;
return false;
}
if (!status)
Driver->extGlAttachShader(Program2, shaderHandle);
}
else
{
os::Printer::log("GLSL shader failed to compile", ELL_ERROR);
// check error message and log it
int maxLength=0;
GLsizei length;
GLhandleARB shaderHandle = Driver->extGlCreateShaderObject(shaderType);
Driver->extGlShaderSourceARB(shaderHandle, 1, &shader, NULL);
Driver->extGlCompileShaderARB(shaderHandle);
GLint status = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(shaderHandle,
GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
Driver->extGlGetObjectParameteriv(shaderHandle, GL_OBJECT_COMPILE_STATUS_ARB, &status);
#endif
GLcharARB *pInfoLog = new GLcharARB[maxLength];
Driver->extGlGetInfoLog(shaderHandle, maxLength, &length, pInfoLog);
os::Printer::log(reinterpret_cast<const c8*>(pInfoLog), ELL_ERROR);
delete [] pInfoLog;
return false;
}
if (!status)
{
os::Printer::log("GLSL shader failed to compile", ELL_ERROR);
// check error message and log it
GLint maxLength=0;
GLsizei length;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(shaderHandle,
GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
#endif
GLcharARB *infoLog = new GLcharARB[maxLength];
Driver->extGlGetInfoLog(shaderHandle, maxLength, &length, infoLog);
os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR);
delete [] infoLog;
Driver->extGlAttachObject(Program, shaderHandle);
return false;
}
Driver->extGlAttachObject(Program, shaderHandle);
}
return true;
}
bool COpenGLSLMaterialRenderer::linkProgram()
{
Driver->extGlLinkProgram(Program);
if (Program2)
{
Driver->extGlLinkProgram(Program2);
int status = 0;
GLint status = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_LINK_STATUS_ARB, &status);
#ifdef GL_VERSION_2_0
Driver->extGlGetProgramiv(Program, GL_LINK_STATUS, &status);
#endif
if (!status)
{
os::Printer::log("GLSL shader program failed to link", ELL_ERROR);
// check error message and log it
int maxLength=0;
GLsizei length;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program,
GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
if (!status)
{
os::Printer::log("GLSL shader program failed to link", ELL_ERROR);
// check error message and log it
GLint maxLength=0;
GLsizei length;
#ifdef GL_VERSION_2_0
Driver->extGlGetProgramiv(Program, GL_INFO_LOG_LENGTH, &maxLength);
#endif
GLcharARB *pInfoLog = new GLcharARB[maxLength];
Driver->extGlGetInfoLog(Program, maxLength, &length, pInfoLog);
os::Printer::log(reinterpret_cast<const c8*>(pInfoLog), ELL_ERROR);
delete [] pInfoLog;
GLchar *infoLog = new GLchar[maxLength];
Driver->extGlGetProgramInfoLog(Program, maxLength, &length, infoLog);
os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR);
delete [] infoLog;
return false;
}
return false;
}
// get uniforms information
// get uniforms information
int num = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &num);
GLint num = 0;
#ifdef GL_VERSION_2_0
Driver->extGlGetProgramiv(Program, GL_ACTIVE_UNIFORMS, &num);
#endif
if (num == 0)
{
// no uniforms
return true;
if (num == 0)
{
// no uniforms
return true;
}
GLint maxlen = 0;
#ifdef GL_VERSION_2_0
Driver->extGlGetProgramiv(Program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxlen);
#endif
if (maxlen == 0)
{
os::Printer::log("GLSL: failed to retrieve uniform information", ELL_ERROR);
return false;
}
// seems that some implementations use an extra null terminator
++maxlen;
c8 *buf = new c8[maxlen];
UniformInfo.clear();
UniformInfo.reallocate(num);
for (GLint i=0; i < num; ++i)
{
SUniformInfo ui;
memset(buf, 0, maxlen);
GLint size;
Driver->extGlGetActiveUniform(Program, i, maxlen, 0, &size, &ui.type, reinterpret_cast<GLchar*>(buf));
ui.name = buf;
UniformInfo.push_back(ui);
}
delete [] buf;
}
else
{
Driver->extGlLinkProgram(Program);
GLint status = 0;
int maxlen = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB, &maxlen);
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_LINK_STATUS_ARB, &status);
#endif
if (maxlen == 0)
{
os::Printer::log("GLSL: failed to retrieve uniform information", ELL_ERROR);
return false;
}
if (!status)
{
os::Printer::log("GLSL shader program failed to link", ELL_ERROR);
// check error message and log it
GLint maxLength=0;
GLsizei length;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program,
GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
#endif
GLcharARB *infoLog = new GLcharARB[maxLength];
Driver->extGlGetInfoLog(Program, maxLength, &length, infoLog);
os::Printer::log(reinterpret_cast<const c8*>(infoLog), ELL_ERROR);
delete [] infoLog;
// seems that some implementations use an extra null terminator
++maxlen;
c8 *buf = new c8[maxlen];
return false;
}
UniformInfo.clear();
UniformInfo.reallocate(num);
// get uniforms information
for (int i=0; i < num; ++i)
{
SUniformInfo ui;
memset(buf, 0, maxlen);
GLint num = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &num);
#endif
GLint size;
Driver->extGlGetActiveUniform(Program, i, maxlen, 0, &size, &ui.type, reinterpret_cast<GLcharARB*>(buf));
ui.name = buf;
if (num == 0)
{
// no uniforms
return true;
}
UniformInfo.push_back(ui);
}
GLint maxlen = 0;
#ifdef GL_ARB_shader_objects
Driver->extGlGetObjectParameteriv(Program, GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB, &maxlen);
#endif
if (maxlen == 0)
{
os::Printer::log("GLSL: failed to retrieve uniform information", ELL_ERROR);
return false;
}
// seems that some implementations use an extra null terminator
++maxlen;
c8 *buf = new c8[maxlen];
UniformInfo.clear();
UniformInfo.reallocate(num);
for (int i=0; i < num; ++i)
{
SUniformInfo ui;
memset(buf, 0, maxlen);
GLint size;
Driver->extGlGetActiveUniformARB(Program, i, maxlen, 0, &size, &ui.type, reinterpret_cast<GLcharARB*>(buf));
ui.name = buf;
UniformInfo.push_back(ui);
}
delete [] buf;
delete [] buf;
}
return true;
}
......@@ -347,7 +492,8 @@ void COpenGLSLMaterialRenderer::setVertexShaderConstant(const f32* data, s32 sta
bool COpenGLSLMaterialRenderer::setPixelShaderConstant(const c8* name, const f32* floats, int count)
{
int i, num = static_cast<int>(UniformInfo.size());
u32 i;
const u32 num = UniformInfo.size();
for (i=0; i < num; ++i)
{
......@@ -358,8 +504,12 @@ bool COpenGLSLMaterialRenderer::setPixelShaderConstant(const c8* name, const f32
if (i == num)
return false;
#ifdef GL_ARB_shader_objects
GLint Location=Driver->extGlGetUniformLocation(Program,name);
#if defined(GL_VERSION_2_0)||defined(GL_ARB_shader_objects)
#ifdef GL_VERSION_2_0
GLint Location=Driver->extGlGetUniformLocation(Program2,name);
#elif defined(GL_ARB_shader_objects)
GLint Location=Driver->extGlGetUniformLocationARB(Program,name);
#endif
switch (UniformInfo[i].type)
{
......@@ -388,11 +538,13 @@ bool COpenGLSLMaterialRenderer::setPixelShaderConstant(const c8* name, const f32
Driver->extGlUniform1iv(Location, count, reinterpret_cast<const GLint*>(floats));
break;
}
#endif
return true;
#else
return false;
#endif
}
void COpenGLSLMaterialRenderer::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount)
{
os::Printer::log("Cannot set constant, use high level shader call.", ELL_WARNING);
......
......@@ -123,6 +123,7 @@ protected:
};
GLhandleARB Program;
GLuint Program2;
core::array<SUniformInfo> UniformInfo;
s32 UserData;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment