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