diff --git a/source/qcommon/common.c b/source/qcommon/common.c index 0de5a17522..7f5518f685 100644 --- a/source/qcommon/common.c +++ b/source/qcommon/common.c @@ -250,6 +250,7 @@ void Com_Printf( const char *format, ... ) Sys_ConsoleOutput( msg ); Con_Print( msg ); + printf("%s\n", msg); if( log_file ) { diff --git a/source/ref_gl/qgl.h b/source/ref_gl/qgl.h index 46adf6eb6d..cfca027d61 100644 --- a/source/ref_gl/qgl.h +++ b/source/ref_gl/qgl.h @@ -548,6 +548,37 @@ typedef unsigned short GLhalfARB; #define QGL_FUNC #endif +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D + + + // WGL Functions QGL_WGL(PROC, wglGetProcAddress, (LPCSTR)); QGL_WGL(int, wglChoosePixelFormat, (HDC, CONST PIXELFORMATDESCRIPTOR *)); @@ -592,6 +623,17 @@ QGL_EGL(EGLBoolean, eglSwapInterval, (EGLDisplay dpy, EGLint interval)); QGL_EGL(EGLBoolean, eglTerminate, (EGLDisplay dpy)); #endif +typedef void (APIENTRY *DEBUGPROC)(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const char*message, + const void *userParam); + +QGL_FUNC(void, glDebugMessageCallback, (DEBUGPROC cb, const void* userParam)); + + // GL Functions QGL_FUNC(void, glBindTexture, (GLenum target, GLuint texture)); QGL_FUNC(void, glClear, (GLbitfield mask)); @@ -640,7 +682,6 @@ QGL_FUNC(void, glGetShaderPrecisionFormat, (GLenum shaderType, GLenum precisionT #endif #endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glActiveTextureARB, (GLenum )); QGL_EXT(void, glClientActiveTextureARB, (GLenum )); QGL_EXT(void, glDrawRangeElementsEXT, (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *)); @@ -649,7 +690,9 @@ QGL_EXT(void, glDeleteBuffersARB, (GLsizei n, const GLuint *buffers)); QGL_EXT(void, glGenBuffersARB, (GLsizei n, GLuint *buffers)); QGL_EXT(void, glBufferDataARB, (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)); QGL_EXT(void, glBufferSubDataARB, (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)); -#else + +QGL_EXT(void, glClientActiveTexture, (GLenum )); + QGL_FUNC(void, glActiveTexture, (GLenum )); QGL_FUNC_OPT(void, glDrawRangeElements, (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *)); QGL_FUNC(void, glBindBuffer, (GLenum target, GLuint buffer)); @@ -657,16 +700,6 @@ QGL_FUNC(void, glDeleteBuffers, (GLsizei n, const GLuint *buffers)); QGL_FUNC(void, glGenBuffers, (GLsizei n, GLuint *buffers)); QGL_FUNC(void, glBufferData, (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)); QGL_FUNC(void, glBufferSubData, (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)); -#ifndef qglActiveTextureARB -#define qglActiveTextureARB qglActiveTexture -#define qglDrawRangeElementsEXT qglDrawRangeElements -#define qglBindBufferARB qglBindBuffer -#define qglDeleteBuffersARB qglDeleteBuffers -#define qglGenBuffersARB qglGenBuffers -#define qglBufferDataARB qglBufferData -#define qglBufferSubDataARB qglBufferSubData -#endif -#endif #ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glDeleteObjectARB, (GLhandleARB obj)); @@ -719,7 +752,7 @@ QGL_EXT(void, glGetShaderiv, (GLhandleARB shaderObj, GLenum pname, GLint *params QGL_EXT(void, glGetProgramInfoLog, (GLhandleARB programObj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)); QGL_EXT(void, glGetShaderInfoLog, (GLhandleARB shaderObj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)); QGL_EXT(void, glGetAttachedShaders, (GLhandleARB programObj, GLsizei maxCount, GLsizei *count, GLhandleARB *shaders)); -#else + QGL_FUNC(void, glDeleteProgram, (GLhandleARB programObj)); QGL_FUNC(void, glDeleteShader, (GLhandleARB shaderObj)); QGL_FUNC(void, glDetachShader, (GLhandleARB programObj, GLhandleARB shaderObj)); @@ -760,6 +793,9 @@ QGL_FUNC(void, glGetActiveUniform, (GLhandleARB programObj, GLuint index, GLsize QGL_FUNC(void, glGetUniformfv, (GLhandleARB programObj, GLint location, GLfloat *params)); QGL_FUNC(void, glGetUniformiv, (GLhandleARB programObj, GLint location, GLint *params)); QGL_FUNC(void, glGetShaderSource, (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source)); + + +#else #ifndef qglShaderSourceARB #define qglShaderSourceARB qglShaderSource #define qglCompileShaderARB qglCompileShader @@ -792,50 +828,30 @@ QGL_FUNC(void, glGetShaderSource, (GLhandleARB obj, GLsizei maxLength, GLsizei * #endif #endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glVertexAttribPointerARB, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)); QGL_EXT(void, glEnableVertexAttribArrayARB, (GLuint index)); QGL_EXT(void, glDisableVertexAttribArrayARB, (GLuint index)); QGL_EXT(void, glBindAttribLocationARB, (GLhandleARB programObj, GLuint index, const GLcharARB *name)); QGL_EXT(void, glGetActiveAttribARB, (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name)); QGL_EXT(GLint, glGetAttribLocationARB, (GLhandleARB programObj, const GLcharARB *name)); -#else + QGL_FUNC(void, glVertexAttribPointer, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)); QGL_FUNC(void, glEnableVertexAttribArray, (GLuint index)); QGL_FUNC(void, glDisableVertexAttribArray, (GLuint index)); QGL_FUNC(void, glBindAttribLocation, (GLhandleARB programObj, GLuint index, const GLcharARB *name)); QGL_FUNC(void, glGetActiveAttrib, (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name)); QGL_FUNC(GLint, glGetAttribLocation, (GLhandleARB programObj, const GLcharARB *name)); -#ifndef qglVertexAttribPointerARB -#define qglVertexAttribPointerARB qglVertexAttribPointer -#define qglEnableVertexAttribArrayARB qglEnableVertexAttribArray -#define qglDisableVertexAttribArrayARB qglDisableVertexAttribArray -#define qglBindAttribLocationARB qglBindAttribLocation -#define qglGetActiveAttribARB qglGetActiveAttrib -#define qglGetAttribLocationARB qglGetAttribLocationARB -#endif -#endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glBindFragDataLocation, (GLuint programObj, GLuint index, const GLcharARB *name)); -#endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glDrawArraysInstancedARB, (GLenum mode, GLint first, GLsizei count, GLsizei primcount)); QGL_EXT(void, glDrawElementsInstancedARB, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)); QGL_EXT(void, glVertexAttribDivisorARB, (GLuint index, GLuint divisor)); -#else + QGL_FUNC_OPT(void, glDrawArraysInstanced, (GLenum mode, GLint first, GLsizei count, GLsizei primcount)); QGL_FUNC_OPT(void, glDrawElementsInstanced, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)); QGL_FUNC_OPT(void, glVertexAttribDivisor, (GLuint index, GLuint divisor)); -#ifndef qglDrawArraysInstancedARB -#define qglDrawArraysInstancedARB qglDrawArraysInstanced -#define qglDrawElementsInstancedARB qglDrawElementsInstanced -#define qglVertexAttribDivisorARB qglVertexAttribDivisor -#endif -#endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(GLboolean, glIsRenderbufferEXT, (GLuint)); QGL_EXT(void, glBindRenderbufferEXT, (GLenum, GLuint)); QGL_EXT(void, glDeleteRenderbuffersEXT, (GLsizei, const GLuint *)); @@ -852,7 +868,7 @@ QGL_EXT(void, glFramebufferTexture2DEXT, (GLenum, GLenum, GLenum, GLuint, GLint) QGL_EXT(void, glFramebufferRenderbufferEXT, (GLenum, GLenum, GLenum, GLuint)); QGL_EXT(void, glGetFramebufferAttachmentParameterivEXT, (GLenum, GLenum, GLenum, GLint *)); QGL_EXT(void, glGenerateMipmapEXT, (GLenum)); -#else + QGL_FUNC(GLboolean, glIsRenderbuffer, (GLuint)); QGL_FUNC(void, glBindRenderbuffer, (GLenum, GLuint)); QGL_FUNC(void, glDeleteRenderbuffers, (GLsizei, const GLuint *)); @@ -868,24 +884,6 @@ QGL_FUNC(void, glFramebufferTexture2D, (GLenum, GLenum, GLenum, GLuint, GLint)); QGL_FUNC(void, glFramebufferRenderbuffer, (GLenum, GLenum, GLenum, GLuint)); QGL_FUNC(void, glGetFramebufferAttachmentParameteriv, (GLenum, GLenum, GLenum, GLint *)); QGL_FUNC(void, glGenerateMipmap, (GLenum)); -#ifndef qglIsRenderbufferEXT -#define qglIsRenderbufferEXT qglIsRenderbuffer -#define qglBindRenderbufferEXT qglBindRenderbuffer -#define qglDeleteRenderbuffersEXT qglDeleteRenderbuffers -#define qglGenRenderbuffersEXT qglGenRenderbuffers -#define qglRenderbufferStorageEXT qglRenderbufferStorage -#define qglGetRenderbufferParameterivEXT qglGetRenderbufferParameteriv -#define qglIsFramebufferEXT qglIsFramebuffer -#define qglBindFramebufferEXT qglBindFramebuffer -#define qglDeleteFramebuffersEXT qglDeleteFramebuffers -#define qglGenFramebuffersEXT qglGenFramebuffers -#define qglCheckFramebufferStatusEXT qglCheckFramebufferStatus -#define qglFramebufferTexture2DEXT qglFramebufferTexture2D -#define qglFramebufferRenderbufferEXT qglFramebufferRenderbuffer -#define qglGetFramebufferAttachmentParameterivEXT qglGetFramebufferAttachmentParameteriv -#define qglGenerateMipmapEXT qglGenerateMipmap -#endif -#endif #ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glBlitFramebufferEXT, (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)); @@ -915,17 +913,10 @@ QGL_FUNC_OPT(void, glGetProgramBinary, (GLuint program, GLsizei bufSize, GLsizei QGL_FUNC_OPT(void, glProgramBinary, (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)); #endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glCompressedTexImage2DARB, (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)); QGL_EXT(void, glCompressedTexSubImage2DARB, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)); -#else QGL_FUNC(void, glCompressedTexImage2D, (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)); QGL_FUNC(void, glCompressedTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)); -#ifndef qglCompressedTexImage2DARB -#define qglCompressedTexImage2DARB qglCompressedTexImage2D -#define qglCompressedTexSubImage2DARB qglCompressedTexSubImage2D -#endif -#endif #ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glBlendFuncSeparateEXT, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)); @@ -936,19 +927,11 @@ QGL_FUNC(void, glBlendFuncSeparate, (GLenum sfactorRGB, GLenum dfactorRGB, GLenu #endif #endif -#ifndef GL_ES_VERSION_2_0 QGL_EXT(void, glTexImage3DEXT, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)); QGL_EXT(void, glTexSubImage3DEXT, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)); -#else -QGL_EXT(void, glTexImage3DOES, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)); -QGL_EXT(void, glTexSubImage3DOES, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)); + QGL_FUNC_OPT(void, glTexImage3D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)); QGL_FUNC_OPT(void, glTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)); -#ifndef qglTexImage3DEXT -#define qglTexImage3DEXT qglTexImage3DOES -#define qglTexSubImage3DEXT qglTexSubImage3DOES -#endif -#endif // WGL_EXT Functions QGL_WGL_EXT(const char *, wglGetExtensionsStringEXT, (void)); diff --git a/source/ref_gl/r_backend.c b/source/ref_gl/r_backend.c index 6b7eadf70b..a4ab8fbb36 100644 --- a/source/ref_gl/r_backend.c +++ b/source/ref_gl/r_backend.c @@ -936,6 +936,7 @@ void RB_FlushDynamicMeshes( void ) m[13] = transy; RB_LoadObjectMatrix( m ); } + assert( qglGetError() == GL_NO_ERROR ); } /* @@ -960,6 +961,8 @@ static void RB_EnableVertexAttribs( void ) RB_EnableVertexAttrib( VATTRIB_POSITION, true ); qglVertexAttribPointerARB( VATTRIB_POSITION, 4, FLOAT_VATTRIB_GL_TYPE( VATTRIB_POSITION_BIT, hfa ), GL_FALSE, vbo->vertexSize, ( const GLvoid * )0 ); + assert( qglGetError() == GL_NO_ERROR ); + // normal if( vattribs & VATTRIB_NORMAL_BIT ) { @@ -1078,6 +1081,7 @@ static void RB_EnableVertexAttribs( void ) RB_EnableVertexAttrib( VATTRIB_INSTANCE_QUAT, false ); RB_EnableVertexAttrib( VATTRIB_INSTANCE_XYZS, false ); } + assert( qglGetError() == GL_NO_ERROR ); } /* @@ -1161,6 +1165,7 @@ void RB_DrawElementsReal( rbDrawElements_t *de ) if( rb.primitive == GL_TRIANGLES ) { rb.stats.c_totalTris += numElems * numInstances / 3; } + assert( qglGetError() == GL_NO_ERROR ); } /* diff --git a/source/ref_gl/r_register.c b/source/ref_gl/r_register.c index bbc65ebcdd..7ddea5aff7 100644 --- a/source/ref_gl/r_register.c +++ b/source/ref_gl/r_register.c @@ -297,6 +297,104 @@ static const gl_extension_func_t gl_ext_get_program_binary_ARB_funcs[] = ,GL_EXTENSION_FUNC_EXT(NULL,NULL) }; +static const gl_extension_func_t gl_core_functions_32[] = { + GL_EXTENSION_FUNC( TexImage3D ), + GL_EXTENSION_FUNC( TexSubImage3D ), + + GL_EXTENSION_FUNC( BindFramebuffer ), + GL_EXTENSION_FUNC( BindAttribLocation ), + + GL_EXTENSION_FUNC( ShaderSource ), + + GL_EXTENSION_FUNC( DrawArraysInstanced ), + GL_EXTENSION_FUNC( DrawElementsInstanced ), + GL_EXTENSION_FUNC( VertexAttribDivisor ), + + GL_EXTENSION_FUNC( VertexAttribPointer ), + GL_EXTENSION_FUNC( EnableVertexAttribArray ), + GL_EXTENSION_FUNC( DisableVertexAttribArray ), + GL_EXTENSION_FUNC( BindAttribLocation ), + GL_EXTENSION_FUNC( GetActiveAttrib ), + GL_EXTENSION_FUNC( GetAttribLocation ), + + GL_EXTENSION_FUNC( DeleteProgram ), + GL_EXTENSION_FUNC( DeleteShader ), + GL_EXTENSION_FUNC( DetachShader ), + GL_EXTENSION_FUNC( CreateShader ), + GL_EXTENSION_FUNC( ShaderSource ), + GL_EXTENSION_FUNC( CompileShader ), + GL_EXTENSION_FUNC( CreateProgram ), + GL_EXTENSION_FUNC( AttachShader ), + GL_EXTENSION_FUNC( LinkProgram ), + GL_EXTENSION_FUNC( UseProgram ), + GL_EXTENSION_FUNC( ValidateProgram ), + GL_EXTENSION_FUNC( Uniform1f ), + GL_EXTENSION_FUNC( Uniform2f ), + GL_EXTENSION_FUNC( Uniform3f ), + GL_EXTENSION_FUNC( Uniform4f ), + GL_EXTENSION_FUNC( Uniform1i ), + GL_EXTENSION_FUNC( Uniform2i ), + GL_EXTENSION_FUNC( Uniform3i ), + GL_EXTENSION_FUNC( Uniform4i ), + GL_EXTENSION_FUNC( Uniform1fv ), + GL_EXTENSION_FUNC( Uniform2fv ), + GL_EXTENSION_FUNC( Uniform3fv ), + GL_EXTENSION_FUNC( Uniform4fv ), + GL_EXTENSION_FUNC( Uniform1iv ), + GL_EXTENSION_FUNC( Uniform2iv ), + GL_EXTENSION_FUNC( Uniform3iv ), + GL_EXTENSION_FUNC( Uniform4iv ), + GL_EXTENSION_FUNC( UniformMatrix2fv ), + GL_EXTENSION_FUNC( UniformMatrix3fv ), + GL_EXTENSION_FUNC( UniformMatrix4fv ), + GL_EXTENSION_FUNC( GetProgramiv ), + GL_EXTENSION_FUNC( GetShaderiv ), + GL_EXTENSION_FUNC( GetProgramInfoLog ), + GL_EXTENSION_FUNC( GetShaderInfoLog ), + GL_EXTENSION_FUNC( GetAttachedShaders ), + GL_EXTENSION_FUNC( GetUniformLocation ), + GL_EXTENSION_FUNC( GetActiveUniform ), + GL_EXTENSION_FUNC( GetUniformfv ), + GL_EXTENSION_FUNC( GetUniformiv ), + GL_EXTENSION_FUNC( GetShaderSource ), + + GL_EXTENSION_FUNC( BindFragDataLocation ), + + GL_EXTENSION_FUNC( GenFramebuffers ), + + GL_EXTENSION_FUNC( DebugMessageCallback ), + + GL_EXTENSION_FUNC( BindBuffer ), + GL_EXTENSION_FUNC( DeleteBuffers ), + GL_EXTENSION_FUNC( GenBuffers ), + GL_EXTENSION_FUNC( BufferData ), + GL_EXTENSION_FUNC( BufferSubData ), + + GL_EXTENSION_FUNC(IsRenderbuffer), + GL_EXTENSION_FUNC(BindRenderbuffer), + GL_EXTENSION_FUNC(DeleteRenderbuffers), + GL_EXTENSION_FUNC(GenRenderbuffers), + GL_EXTENSION_FUNC(RenderbufferStorage), + GL_EXTENSION_FUNC(GetRenderbufferParameteriv), + GL_EXTENSION_FUNC(IsFramebuffer), + GL_EXTENSION_FUNC(BindFramebuffer), + GL_EXTENSION_FUNC(DeleteFramebuffers), + GL_EXTENSION_FUNC(GenFramebuffers), + GL_EXTENSION_FUNC(CheckFramebufferStatus), + GL_EXTENSION_FUNC(FramebufferTexture2D), + GL_EXTENSION_FUNC(FramebufferRenderbuffer), + GL_EXTENSION_FUNC(GetFramebufferAttachmentParameteriv), + GL_EXTENSION_FUNC(GenerateMipmap), + + GL_EXTENSION_FUNC(ActiveTexture), + GL_EXTENSION_FUNC(ClientActiveTexture), + + GL_EXTENSION_FUNC(CompressedTexImage2D), + GL_EXTENSION_FUNC(CompressedTexSubImage2D), + + GL_EXTENSION_FUNC_EXT( NULL, NULL ) +}; + /* GL_EXT_framebuffer_object */ static const gl_extension_func_t gl_ext_framebuffer_object_EXT_funcs[] = { @@ -450,83 +548,299 @@ static bool R_TryLoadGLProcAddress(const gl_extension_func_t *funcs) return true; } -/* -* R_RegisterGLExtensions -*/ -static bool R_RegisterGLExtensions( void ) -{ - memset( &glConfig.ext, 0, sizeof( glextinfo_t ) ); - - if( R_TryLoadGLProcAddress( gl_ext_vertex_buffer_object_ARB_funcs ) ) { - glConfig.ext.vertex_buffer_object = 1; - } else { - R_RegisterFatalExt( "gl_ext_vertex_buffer_object_ARB_funcs " ); +static void gl_callback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const char*msg, + const void *userParam) { + char* _source; + char* _type; + char *_severity; + + switch( source ) { + case GL_DEBUG_SOURCE_API: + _source = "API"; + break; + + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + _source = "WINDOW SYSTEM"; + break; + + case GL_DEBUG_SOURCE_SHADER_COMPILER: + _source = "SHADER COMPILER"; + break; + + case GL_DEBUG_SOURCE_THIRD_PARTY: + _source = "THIRD PARTY"; + break; + + case GL_DEBUG_SOURCE_APPLICATION: + _source = "APPLICATION"; + break; + + case GL_DEBUG_SOURCE_OTHER: + _source = "UNKNOWN"; + break; + + default: + _source = "UNKNOWN"; + break; } - if( R_TryLoadGLProcAddress( gl_ext_framebuffer_object_EXT_funcs ) ) { - glConfig.ext.framebuffer_object = 1; - } else { - R_RegisterFatalExt( "gl_ext_framebuffer_object_EXT_funcs" ); - } + switch( type ) { + case GL_DEBUG_TYPE_ERROR: + _type = "ERROR"; + break; - if( R_TryLoadGLProcAddress( gl_ext_multitexture_ARB_funcs ) ) { - glConfig.ext.multitexture = 1; - glConfig.ext.vertex_shader = 1; - glConfig.ext.fragment_shader = 1; - glConfig.ext.shader_objects = 1; - glConfig.ext.shading_language_100 = 1; - } else { - R_RegisterFatalExt( "gl_ext_multitexture_ARB_funcs" ); - } + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + _type = "DEPRECATED BEHAVIOR"; + break; - if( R_TryLoadGLProcAddress( gl_ext_GLSL_ARB_funcs ) ) { - glConfig.ext.GLSL = 1; - } else { - R_RegisterFatalExt( "gl_ext_GLSL_ARB_funcs" ); - } + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + _type = "UDEFINED BEHAVIOR"; + break; - if( R_TryLoadGLProcAddress( gl_ext_blend_func_separate_EXT_funcs ) ) { - glConfig.ext.blend_func_separate = 1; - } else { - R_RegisterFatalExt( "gl_ext_blend_func_separate_EXT_funcs" ); - } + case GL_DEBUG_TYPE_PORTABILITY: + _type = "PORTABILITY"; + break; - if( R_TryLoadGLProcAddress( gl_ext_GLSL_core_ARB_funcs ) ) { - glConfig.ext.GLSL_core = 1; - } + case GL_DEBUG_TYPE_PERFORMANCE: + _type = "PERFORMANCE"; + break; - if( R_TryLoadGLProcAddress( gl_ext_GLSL130_ARB_funcs ) ) { - glConfig.ext.GLSL130 = 1; - } - - if( R_TryLoadGLProcAddress( gl_ext_draw_range_elements_EXT_funcs ) ) { - glConfig.ext.draw_range_elements = 1; - } + case GL_DEBUG_TYPE_OTHER: + _type = "OTHER"; + break; - if( R_TryLoadGLProcAddress( gl_ext_framebuffer_blit_EXT_funcs ) ) { - glConfig.ext.framebuffer_blit = 1; - } + case GL_DEBUG_TYPE_MARKER: + _type = "MARKER"; + break; - if( R_TryLoadGLProcAddress( gl_ext_texture_compression_ARB_funcs ) ) { - glConfig.ext.texture_compression = 1; + default: + _type = "UNKNOWN"; + break; } - if( R_TryLoadGLProcAddress( gl_ext_draw_instanced_ARB_funcs ) ) { - glConfig.ext.draw_instanced = 1; - } - if( R_TryLoadGLProcAddress( gl_ext_instanced_arrays_ARB_funcs ) ) { - glConfig.ext.instanced_arrays = 1; - } + switch( severity ) { + case GL_DEBUG_SEVERITY_HIGH: + _severity = "HIGH"; + break; - if( R_TryLoadGLProcAddress( gl_ext_get_program_binary_ARB_funcs ) ) { - glConfig.ext.get_program_binary = 1; - } + case GL_DEBUG_SEVERITY_MEDIUM: + _severity = "MEDIUM"; + break; + + case GL_DEBUG_SEVERITY_LOW: + _severity = "LOW"; + break; - if( R_TryLoadGLProcAddress( gl_ext_texture3D_EXT_funcs ) ) { - glConfig.ext.texture3D = 1; - glConfig.ext.texture_array = 1; + case GL_DEBUG_SEVERITY_NOTIFICATION: + _severity = "NOTIFICATION"; + break; + + default: + _severity = "UNKNOWN"; + break; } + ri.Com_Printf("%d: %s of %s severity, raised from %s: %s\n", + id, _type, _severity, _source, msg); + if(severity == GL_DEBUG_SEVERITY_HIGH) { + assert(false); + } +} + +/* +* R_RegisterGLExtensions +*/ +static bool R_RegisterGLExtensions( void ) +{ + memset( &glConfig.ext, 0, sizeof( glextinfo_t ) ); + // if( R_TryLoadGLProcAddress( gl_ext_vertex_buffer_object_ARB_funcs ) ) { + // glConfig.ext.vertex_buffer_object = 1; + // } else { + // R_RegisterFatalExt( "gl_ext_vertex_buffer_object_ARB_funcs " ); + // } + + // if( R_TryLoadGLProcAddress( gl_ext_framebuffer_object_EXT_funcs ) ) { + // glConfig.ext.framebuffer_object = 1; + // } else { + // R_RegisterFatalExt( "gl_ext_framebuffer_object_EXT_funcs" ); + // } + + // if( R_TryLoadGLProcAddress( gl_ext_multitexture_ARB_funcs ) ) { + // glConfig.ext.multitexture = 1; + // glConfig.ext.vertex_shader = 1; + // glConfig.ext.fragment_shader = 1; + // glConfig.ext.shader_objects = 1; + // glConfig.ext.shading_language_100 = 1; + // } else { + // R_RegisterFatalExt( "gl_ext_multitexture_ARB_funcs" ); + // } + + // if( R_TryLoadGLProcAddress( gl_ext_GLSL_ARB_funcs ) ) { + // glConfig.ext.GLSL = 1; + // } else { + // R_RegisterFatalExt( "gl_ext_GLSL_ARB_funcs" ); + // } + + // if( R_TryLoadGLProcAddress( gl_ext_blend_func_separate_EXT_funcs ) ) { + // glConfig.ext.blend_func_separate = 1; + // } else { + // R_RegisterFatalExt( "gl_ext_blend_func_separate_EXT_funcs" ); + // } + + // if( R_TryLoadGLProcAddress( gl_ext_GLSL_core_ARB_funcs ) ) { + // glConfig.ext.GLSL_core = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_GLSL130_ARB_funcs ) ) { + // glConfig.ext.GLSL130 = 1; + // } + // + // if( R_TryLoadGLProcAddress( gl_ext_draw_range_elements_EXT_funcs ) ) { + // glConfig.ext.draw_range_elements = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_framebuffer_blit_EXT_funcs ) ) { + // glConfig.ext.framebuffer_blit = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_texture_compression_ARB_funcs ) ) { + // glConfig.ext.texture_compression = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_draw_instanced_ARB_funcs ) ) { + // glConfig.ext.draw_instanced = 1; + // } + // if( R_TryLoadGLProcAddress( gl_ext_instanced_arrays_ARB_funcs ) ) { + // glConfig.ext.instanced_arrays = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_get_program_binary_ARB_funcs ) ) { + // glConfig.ext.get_program_binary = 1; + // } + + // if( R_TryLoadGLProcAddress( gl_ext_texture3D_EXT_funcs ) ) { + // glConfig.ext.texture3D = 1; + // glConfig.ext.texture_array = 1; + // } + + if( R_TryLoadGLProcAddress( gl_core_functions_32 ) ) { + qglDebugMessageCallback(gl_callback, NULL); + + + qglTexImage3DEXT = qglTexImage3D; + qglTexSubImage3DEXT = qglTexSubImage3D; + qglVertexAttribPointerARB = qglVertexAttribPointer; + qglEnableVertexAttribArrayARB = qglEnableVertexAttribArray; + qglDisableVertexAttribArrayARB = qglDisableVertexAttribArray; + qglBindAttribLocationARB = qglBindAttribLocation; + qglGetActiveAttribARB = qglGetActiveAttrib; + qglGetAttribLocationARB = qglGetAttribLocation; + + qglBindFramebufferEXT = qglBindFramebuffer; + qglShaderSourceARB = qglShaderSource; + + qglDrawArraysInstancedARB = qglDrawArraysInstanced; + qglDrawElementsInstancedARB = qglDrawElementsInstanced; + qglVertexAttribDivisorARB = qglVertexAttribDivisor; + + qglCompileShaderARB = qglCompileShader; + + qglDeleteObjectARB = qglDeleteProgram; + // qglDeleteShader = qglDeleteShaderARB; + // qglDetachShader = qglDetachShaderARB; + // qglCreateShader = qglCreateShaderARB; + qglShaderSourceARB = qglShaderSource; + qglCompileShaderARB = qglCompileShader; + // qglCreateProgram = qglCreateProgramARB; + // qglAttachShader = qglAttachShaderARB; + qglLinkProgramARB = qglLinkProgram; + // qglUseProgram = qglUseProgramARB; + qglValidateProgramARB = qglValidateProgram; + qglUniform1fARB = qglUniform1f; + qglUniform2fARB = qglUniform2f; + qglUniform3fARB = qglUniform3f; + qglUniform4fARB = qglUniform4f; + qglUniform1iARB = qglUniform1i; + qglUniform2iARB = qglUniform2i; + qglUniform3iARB = qglUniform3i; + qglUniform4iARB = qglUniform4i; + qglUniform1fvARB = qglUniform1fv; + qglUniform2fvARB = qglUniform2fv; + qglUniform3fvARB = qglUniform3fv; + qglUniform4fvARB = qglUniform4fv; + qglUniform1ivARB = qglUniform1iv; + qglUniform2ivARB = qglUniform2iv; + qglUniform3ivARB = qglUniform3iv; + qglUniform4ivARB = qglUniform4iv; + qglUniformMatrix2fvARB = qglUniformMatrix2fv; + qglUniformMatrix3fvARB = qglUniformMatrix3fv; + qglUniformMatrix4fvARB = qglUniformMatrix4fv; + // qglGetProgramiv = qglGetProgramivARB; + // qglGetShaderiv = qglGetShaderivARB; + // qglGetProgramInfoLog = qglGetProgramInfoLogARB; + // qglGetShaderInfoLog = qglGetShaderInfoLogARB; + // qglGetAttachedShaders = qglGetAttachedShadersARB; + qglGetUniformLocationARB = qglGetUniformLocation; + qglGetActiveUniformARB = qglGetActiveUniform; + qglGetUniformfvARB = qglGetUniformfv; + qglGetUniformivARB = qglGetUniformiv; + qglGetShaderSourceARB = qglGetShaderSource; + + qglGenFramebuffersEXT = qglGenFramebuffers; + qglBufferDataARB = qglBufferData; + qglBindBufferARB = qglBindBuffer; + qglDeleteBuffersARB = qglDeleteBuffers; + qglGenBuffersARB = qglGenBuffers; + qglBufferSubDataARB = qglBufferSubData; + + qglFramebufferTexture2DEXT = qglFramebufferTexture2D; + + qglIsRenderbufferEXT = qglIsRenderbuffer; + qglBindRenderbufferEXT = qglBindRenderbuffer; + qglDeleteRenderbuffersEXT = qglDeleteRenderbuffers; + qglGenRenderbuffersEXT = qglGenRenderbuffers; + qglRenderbufferStorageEXT = qglRenderbufferStorage; + qglGetRenderbufferParameterivEXT = qglGetRenderbufferParameteriv; + qglIsFramebufferEXT = qglIsFramebuffer; + qglBindFramebufferEXT = qglBindFramebuffer; + qglDeleteFramebuffersEXT = qglDeleteFramebuffers; + qglGenFramebuffersEXT = qglGenFramebuffers; + qglCheckFramebufferStatusEXT = qglCheckFramebufferStatus; + qglFramebufferTexture2DEXT = qglFramebufferTexture2D; + qglFramebufferRenderbufferEXT = qglFramebufferRenderbuffer; + qglGetFramebufferAttachmentParameterivEXT = qglGetFramebufferAttachmentParameteriv; + qglGenerateMipmapEXT = qglGenerateMipmap; + + qglActiveTextureARB = qglActiveTexture; + qglClientActiveTextureARB = qglActiveTexture; + + qglCompressedTexImage2DARB = qglCompressedTexImage2D; + qglCompressedTexSubImage2DARB = qglCompressedTexSubImage2D; + + glConfig.ext.GLSL130 = 1; + glConfig.ext.blend_func_separate = 1; + glConfig.ext.multitexture = 1; + glConfig.ext.vertex_shader = 1; + glConfig.ext.fragment_shader = 1; + glConfig.ext.shader_objects = 1; + glConfig.ext.shading_language_100 = 1; + glConfig.ext.framebuffer_object = 1; + glConfig.ext.texture3D = 1; + glConfig.ext.texture_array = 1; + glConfig.ext.GLSL_core = 1; + glConfig.ext.GLSL = 1; + glConfig.ext.draw_range_elements = 1; + glConfig.ext.framebuffer_blit = 1; + glConfig.ext.texture_compression = 1; + glConfig.ext.vertex_buffer_object = 1; + } else { + R_RegisterFatalExt( "gl_ext_multitexture_ARB_funcs" ); + } glConfig.ext.bgra = 1; glConfig.ext.texture_filter_anisotropic = 1; glConfig.ext.meminfo = 1; diff --git a/source/sdl/sdl_glw.c b/source/sdl/sdl_glw.c index f2ff3fc6ca..1bf2aa009c 100644 --- a/source/sdl/sdl_glw.c +++ b/source/sdl/sdl_glw.c @@ -168,6 +168,10 @@ static int GLimp_InitGL( int stencilbits, bool stereo ) int colorBits, depthBits, stencilBits, stereo_; SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, max( 0, stencilbits ) ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 2); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); if( stereo ) { ri.Com_DPrintf( "...attempting to use stereo\n" );