From 716438168f160885fe1d8cc2e076e97901bd436c Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Tue, 26 Jul 2016 00:41:31 -0700 Subject: [PATCH] OpenGL2: Use loader for all extension funcs. --- code/renderercommon/qgl.h | 202 ++++++++---------------------- code/renderergl2/tr_backend.c | 2 +- code/renderergl2/tr_bsp.c | 2 +- code/renderergl2/tr_extensions.c | 208 +++++++++++++------------------ code/renderergl2/tr_image.c | 7 +- code/renderergl2/tr_init.c | 2 +- code/renderergl2/tr_local.h | 1 - code/renderergl2/tr_shade.c | 8 +- code/renderergl2/tr_vbo.c | 14 +-- 9 files changed, 158 insertions(+), 288 deletions(-) diff --git a/code/renderercommon/qgl.h b/code/renderercommon/qgl.h index 6f27e130..6f70f644 100644 --- a/code/renderercommon/qgl.h +++ b/code/renderercommon/qgl.h @@ -438,14 +438,6 @@ extern void (APIENTRYP qglUnlockArraysEXT) (void); GLE(void, ValidateProgram, GLuint program) \ GLE(void, VertexAttribPointer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) \ -#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name; -QGL_1_2_PROCS -QGL_1_3_PROCS -QGL_1_4_PROCS -QGL_1_5_PROCS -QGL_2_0_PROCS -#undef GLE - // GL_NVX_gpu_memory_info #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info @@ -495,27 +487,18 @@ QGL_2_0_PROCS #endif // GL_EXT_framebuffer_object -extern GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer); -extern void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer); -extern void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers); -extern void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers); -extern void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -extern void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params); -extern GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer); -extern void (APIENTRY * qglBindFramebufferEXT)(GLenum target, GLuint framebuffer); -extern void (APIENTRY * qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers); -extern void (APIENTRY * qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers); -extern GLenum (APIENTRY * qglCheckFramebufferStatusEXT)(GLenum target); -extern void (APIENTRY * qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level); -extern void (APIENTRY * qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level); -extern void (APIENTRY * qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLint zoffset); -extern void (APIENTRY * qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer); -extern void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params); -extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target); +#define QGL_EXT_framebuffer_object_PROCS \ + GLE(void, BindRenderbufferEXT, GLenum target, GLuint renderbuffer) \ + GLE(void, DeleteRenderbuffersEXT, GLsizei n, const GLuint *renderbuffers) \ + GLE(void, GenRenderbuffersEXT, GLsizei n, GLuint *renderbuffers) \ + GLE(void, RenderbufferStorageEXT, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) \ + GLE(void, BindFramebufferEXT, GLenum target, GLuint framebuffer) \ + GLE(void, DeleteFramebuffersEXT, GLsizei n, const GLuint *framebuffers) \ + GLE(void, GenFramebuffersEXT, GLsizei n, GLuint *framebuffers) \ + GLE(GLenum, CheckFramebufferStatusEXT, GLenum target) \ + GLE(void, FramebufferTexture2DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \ + GLE(void, FramebufferRenderbufferEXT, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \ + GLE(void, GenerateMipmapEXT, GLenum target) \ #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object @@ -572,19 +555,9 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target); #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #endif -// GL_EXT_packed_depth_stencil -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif - // GL_EXT_framebuffer_blit -extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, - GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, - GLbitfield mask, GLenum filter); +#define QGL_EXT_framebuffer_blit_PROCS \ + GLE(void, BlitFramebufferEXT, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) \ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit @@ -595,8 +568,8 @@ extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint s #endif // GL_EXT_framebuffer_multisample -extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples, - GLenum internalformat, GLsizei width, GLsizei height); +#define QGL_EXT_framebuffer_multisample_PROCS \ + GLE(void, RenderbufferStorageMultisampleEXT, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample @@ -605,31 +578,6 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs #define GL_MAX_SAMPLES_EXT 0x8D57 #endif -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#endif - #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc #define GL_COMPRESSED_RED_RGTC1 0x8DBB @@ -657,91 +605,51 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs #endif // GL_ARB_vertex_array_object -extern void (APIENTRY * qglBindVertexArrayARB)(GLuint array); -extern void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays); -extern void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays); -extern GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array); +#define QGL_ARB_vertex_array_object_PROCS \ + GLE(void, BindVertexArray, GLuint array) \ + GLE(void, DeleteVertexArrays, GLsizei n, const GLuint *arrays) \ + GLE(void, GenVertexArrays, GLsizei n, GLuint *arrays) \ + #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object #define GL_VERTEX_ARRAY_BINDING_ARB 0x85B5 #endif // GL_EXT_direct_state_access -extern GLvoid(APIENTRY * qglBindMultiTexture)(GLenum texunit, GLenum target, GLuint texture); -extern GLvoid(APIENTRY * qglTextureParameterf)(GLuint texture, GLenum target, GLenum pname, GLfloat param); -extern GLvoid(APIENTRY * qglTextureParameteri)(GLuint texture, GLenum target, GLenum pname, GLint param); -extern GLvoid(APIENTRY * qglTextureImage2D)(GLuint texture, GLenum target, GLint level, GLint internalformat, - GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -extern GLvoid(APIENTRY * qglTextureSubImage2D)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -extern GLvoid(APIENTRY * qglCopyTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat, - GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -extern GLvoid(APIENTRY * qglCompressedTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat, - GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -extern GLvoid(APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target, GLint level, - GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, - GLsizei imageSize, const GLvoid *data); -extern GLvoid(APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target); +#define QGL_EXT_direct_state_access_PROCS \ + GLE(GLvoid, BindMultiTexture, GLenum texunit, GLenum target, GLuint texture) \ + GLE(GLvoid, TextureParameterf, GLuint texture, GLenum target, GLenum pname, GLfloat param) \ + GLE(GLvoid, TextureParameteri, GLuint texture, GLenum target, GLenum pname, GLint param) \ + GLE(GLvoid, TextureImage2D, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) \ + GLE(GLvoid, TextureSubImage2D, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) \ + GLE(GLvoid, CopyTextureImage2D, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) \ + GLE(GLvoid, CompressedTextureImage2D, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) \ + GLE(GLvoid, CompressedTextureSubImage2D, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) \ + GLE(GLvoid, GenerateTextureMipmap, GLuint texture, GLenum target) \ + GLE(GLvoid, ProgramUniform1i, GLuint program, GLint location, GLint v0) \ + GLE(GLvoid, ProgramUniform1f, GLuint program, GLint location, GLfloat v0) \ + GLE(GLvoid, ProgramUniform2f, GLuint program, GLint location, GLfloat v0, GLfloat v1) \ + GLE(GLvoid, ProgramUniform3f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \ + GLE(GLvoid, ProgramUniform4f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \ + GLE(GLvoid, ProgramUniform1fv, GLuint program, GLint location, GLsizei count, const GLfloat *value) \ + GLE(GLvoid, ProgramUniformMatrix4fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \ + GLE(GLvoid, NamedRenderbufferStorage, GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) \ + GLE(GLvoid, NamedRenderbufferStorageMultisample, GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \ + GLE(GLenum, CheckNamedFramebufferStatus, GLuint framebuffer, GLenum target) \ + GLE(GLvoid, NamedFramebufferTexture2D, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \ + GLE(GLvoid, NamedFramebufferRenderbuffer, GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \ -extern GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0); -extern GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0); -extern GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location, - GLfloat v0, GLfloat v1); -extern GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location, - GLfloat v0, GLfloat v1, GLfloat v2); -extern GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location, - GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -extern GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location, - GLsizei count, const GLfloat *value); -extern GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location, - GLsizei count, GLboolean transpose, - const GLfloat *value); - -extern GLvoid(APIENTRY * qglNamedRenderbufferStorage)(GLuint renderbuffer, - GLenum internalformat, GLsizei width, GLsizei height); - -extern GLvoid(APIENTRY * qglNamedRenderbufferStorageMultisample)(GLuint renderbuffer, - GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - -extern GLenum(APIENTRY * qglCheckNamedFramebufferStatus)(GLuint framebuffer, GLenum target); -extern GLvoid(APIENTRY * qglNamedFramebufferTexture2D)(GLuint framebuffer, - GLenum attachment, GLenum textarget, GLuint texture, GLint level); -extern GLvoid(APIENTRY * qglNamedFramebufferRenderbuffer)(GLuint framebuffer, - GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - - - - -#if defined(WIN32) -// WGL_ARB_create_context -#ifndef WGL_ARB_create_context -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define ERROR_INVALID_PROFILE_ARB 0x2096 -#endif - -extern HGLRC(APIENTRY * qwglCreateContextAttribsARB) (HDC hdC, HGLRC hShareContext, const int *attribList); -#endif - -#if 0 //defined(__linux__) -// GLX_ARB_create_context -#ifndef GLX_ARB_create_context -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 -#endif - -extern GLXContext (APIENTRY * qglXCreateContextAttribsARB) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); -#endif +#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name; +QGL_1_2_PROCS; +QGL_1_3_PROCS; +QGL_1_4_PROCS; +QGL_1_5_PROCS; +QGL_2_0_PROCS; +QGL_EXT_framebuffer_object_PROCS; +QGL_EXT_framebuffer_blit_PROCS; +QGL_EXT_framebuffer_multisample_PROCS; +QGL_ARB_vertex_array_object_PROCS; +QGL_EXT_direct_state_access_PROCS; +#undef GLE #endif diff --git a/code/renderergl2/tr_backend.c b/code/renderergl2/tr_backend.c index f9dcd038..b8ca113a 100644 --- a/code/renderergl2/tr_backend.c +++ b/code/renderergl2/tr_backend.c @@ -1184,7 +1184,7 @@ const void *RB_DrawSurfs( const void *data ) { RB_DrawSun(0.1, tr.sunShader); } - if (r_drawSunRays->integer) + if (glRefConfig.framebufferObject && r_drawSunRays->integer) { FBO_t *oldFbo = glState.currentFBO; FBO_Bind(tr.sunRaysFbo); diff --git a/code/renderergl2/tr_bsp.c b/code/renderergl2/tr_bsp.c index 2b3f0a55..2feeddb7 100644 --- a/code/renderergl2/tr_bsp.c +++ b/code/renderergl2/tr_bsp.c @@ -3526,7 +3526,7 @@ void RE_LoadWorldMap( const char *name ) { R_BindNullVao(); // Render or load all cubemaps - if (r_cubeMapping->integer && tr.numCubemaps) + if (r_cubeMapping->integer && tr.numCubemaps && glRefConfig.framebufferObject) { R_LoadCubemaps(); R_RenderMissingCubemaps(); diff --git a/code/renderergl2/tr_extensions.c b/code/renderergl2/tr_extensions.c index e1500790..3882434c 100644 --- a/code/renderergl2/tr_extensions.c +++ b/code/renderergl2/tr_extensions.c @@ -36,6 +36,11 @@ QGL_1_3_PROCS; QGL_1_4_PROCS; QGL_1_5_PROCS; QGL_2_0_PROCS; +QGL_EXT_framebuffer_object_PROCS; +QGL_EXT_framebuffer_blit_PROCS; +QGL_EXT_framebuffer_multisample_PROCS; +QGL_ARB_vertex_array_object_PROCS; +QGL_EXT_direct_state_access_PROCS; #undef GLE // GL_EXT_framebuffer_object @@ -142,18 +147,23 @@ void GLimp_InitExtraExtensions() char *extension; const char* result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" }; + // Check OpenGL version sscanf(glConfig.version_string, "%d.%d", &glRefConfig.openglMajorVersion, &glRefConfig.openglMinorVersion); if (glRefConfig.openglMajorVersion < 2) ri.Error(ERR_FATAL, "OpenGL 2.0 required!"); ri.Printf(PRINT_ALL, "...using OpenGL %s\n", glConfig.version_string); - // GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a + // set DSA fallbacks +#define GLE(ret, name, ...) qgl##name = GLDSA_##name; + QGL_EXT_direct_state_access_PROCS; +#undef GLE + // GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a #define GLE(ret, name, ...) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name); // OpenGL 1.2, was GL_EXT_draw_range_elements QGL_1_2_PROCS; - glRefConfig.drawRangeElements = r_ext_draw_range_elements->integer ? qtrue : qfalse; + glRefConfig.drawRangeElements = !!r_ext_draw_range_elements->integer; ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glDrawRangeElements()"); // OpenGL 1.3, was GL_ARB_texture_compression @@ -161,8 +171,8 @@ void GLimp_InitExtraExtensions() // OpenGL 1.4, was GL_EXT_multi_draw_arrays QGL_1_4_PROCS; - glRefConfig.drawRangeElements = r_ext_multi_draw_arrays->integer ? qtrue : qfalse; - ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glMultiDrawElements()"); + glRefConfig.multiDrawArrays = !!r_ext_multi_draw_arrays->integer; + ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], "glMultiDrawElements()"); // OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query QGL_1_5_PROCS; @@ -171,8 +181,7 @@ void GLimp_InitExtraExtensions() // OpenGL 2.0, was GL_ARB_shading_language_100, GL_ARB_vertex_program, GL_ARB_shader_objects, and GL_ARB_vertex_shader QGL_2_0_PROCS; -#undef GLE - + // Determine GLSL version if (1) { char version[256]; @@ -186,23 +195,45 @@ void GLimp_InitExtraExtensions() glRefConfig.memInfo = MI_NONE; - if( GLimp_HaveExtension( "GL_NVX_gpu_memory_info" ) ) + // GL_NVX_gpu_memory_info + extension = "GL_NVX_gpu_memory_info"; + if( GLimp_HaveExtension( extension ) ) { glRefConfig.memInfo = MI_NVX; + + ri.Printf(PRINT_ALL, result[1], extension); } - else if( GLimp_HaveExtension( "GL_ATI_meminfo" ) ) + else { - glRefConfig.memInfo = MI_ATI; + ri.Printf(PRINT_ALL, result[2], extension); } + // GL_ATI_meminfo + extension = "GL_ATI_meminfo"; + if( GLimp_HaveExtension( extension ) ) + { + if (glRefConfig.memInfo == MI_NONE) + { + glRefConfig.memInfo = MI_ATI; + + ri.Printf(PRINT_ALL, result[1], extension); + } + else + { + ri.Printf(PRINT_ALL, result[0], extension); + } + } + else + { + ri.Printf(PRINT_ALL, result[2], extension); + } + + // GL_ARB_texture_non_power_of_two extension = "GL_ARB_texture_non_power_of_two"; glRefConfig.textureNonPowerOfTwo = qfalse; if( GLimp_HaveExtension( extension ) ) { - if(1) //(r_ext_texture_non_power_of_two->integer) - { - glRefConfig.textureNonPowerOfTwo = qtrue; - } + glRefConfig.textureNonPowerOfTwo = qtrue; // !!r_ext_texture_non_power_of_two->integer ri.Printf(PRINT_ALL, result[glRefConfig.textureNonPowerOfTwo], extension); } @@ -216,10 +247,7 @@ void GLimp_InitExtraExtensions() glRefConfig.textureFloat = qfalse; if( GLimp_HaveExtension( extension ) ) { - if( r_ext_texture_float->integer ) - { - glRefConfig.textureFloat = qtrue; - } + glRefConfig.textureFloat = !!r_ext_texture_float->integer; ri.Printf(PRINT_ALL, result[glRefConfig.textureFloat], extension); } @@ -233,8 +261,7 @@ void GLimp_InitExtraExtensions() glRefConfig.halfFloatPixel = qfalse; if( GLimp_HaveExtension( extension ) ) { - if( r_arb_half_float_pixel->integer ) - glRefConfig.halfFloatPixel = qtrue; + glRefConfig.halfFloatPixel = !!r_arb_half_float_pixel->integer; ri.Printf(PRINT_ALL, result[glRefConfig.halfFloatPixel], extension); } @@ -248,29 +275,12 @@ void GLimp_InitExtraExtensions() glRefConfig.framebufferObject = qfalse; if( GLimp_HaveExtension( extension ) ) { + glRefConfig.framebufferObject = !!r_ext_framebuffer_object->integer; + glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glRefConfig.maxRenderbufferSize); glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glRefConfig.maxColorAttachments); - qglIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsRenderbufferEXT"); - qglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindRenderbufferEXT"); - qglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteRenderbuffersEXT"); - qglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenRenderbuffersEXT"); - qglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) SDL_GL_GetProcAddress("glRenderbufferStorageEXT"); - qglGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetRenderbufferParameterivEXT"); - qglIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsFramebufferEXT"); - qglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindFramebufferEXT"); - qglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteFramebuffersEXT"); - qglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenFramebuffersEXT"); - qglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT"); - qglFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture1DEXT"); - qglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture2DEXT"); - qglFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture3DEXT"); - qglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glFramebufferRenderbufferEXT"); - qglGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameterivEXT"); - qglGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) SDL_GL_GetProcAddress("glGenerateMipmapEXT"); - - if(r_ext_framebuffer_object->value) - glRefConfig.framebufferObject = qtrue; + QGL_EXT_framebuffer_object_PROCS; ri.Printf(PRINT_ALL, result[glRefConfig.framebufferObject], extension); } @@ -279,26 +289,15 @@ void GLimp_InitExtraExtensions() ri.Printf(PRINT_ALL, result[2], extension); } - // GL_EXT_packed_depth_stencil - extension = "GL_EXT_packed_depth_stencil"; - glRefConfig.packedDepthStencil = qfalse; - if( GLimp_HaveExtension(extension)) - { - glRefConfig.packedDepthStencil = qtrue; - ri.Printf(PRINT_ALL, result[glRefConfig.packedDepthStencil], extension); - } - else - { - ri.Printf(PRINT_ALL, result[2], extension); - } - // GL_EXT_framebuffer_blit extension = "GL_EXT_framebuffer_blit"; glRefConfig.framebufferBlit = qfalse; if (GLimp_HaveExtension(extension)) { - qglBlitFramebufferEXT = (void *)SDL_GL_GetProcAddress("glBlitFramebufferEXT"); glRefConfig.framebufferBlit = qtrue; + + QGL_EXT_framebuffer_blit_PROCS; + ri.Printf(PRINT_ALL, result[glRefConfig.framebufferBlit], extension); } else @@ -311,8 +310,10 @@ void GLimp_InitExtraExtensions() glRefConfig.framebufferMultisample = qfalse; if (GLimp_HaveExtension(extension)) { - qglRenderbufferStorageMultisampleEXT = (void *)SDL_GL_GetProcAddress("glRenderbufferStorageMultisampleEXT"); glRefConfig.framebufferMultisample = qtrue; + + QGL_EXT_framebuffer_multisample_PROCS; + ri.Printf(PRINT_ALL, result[glRefConfig.framebufferMultisample], extension); } else @@ -326,10 +327,12 @@ void GLimp_InitExtraExtensions() extension = "GL_ARB_texture_compression_rgtc"; if (GLimp_HaveExtension(extension)) { - if (r_ext_compressed_textures->integer) + qboolean useRgtc = r_ext_compressed_textures->integer >= 1; + + if (useRgtc) glRefConfig.textureCompression |= TCR_RGTC; - ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[useRgtc], extension); } else { @@ -342,10 +345,12 @@ void GLimp_InitExtraExtensions() extension = "GL_ARB_texture_compression_bptc"; if (GLimp_HaveExtension(extension)) { - if (r_ext_compressed_textures->integer >= 2) + qboolean useBptc = r_ext_compressed_textures->integer >= 2; + + if (useBptc) glRefConfig.textureCompression |= TCR_BPTC; - ri.Printf(PRINT_ALL, result[(r_ext_compressed_textures->integer >= 2) ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[useBptc], extension); } else { @@ -358,7 +363,8 @@ void GLimp_InitExtraExtensions() if( GLimp_HaveExtension( extension ) ) { glRefConfig.depthClamp = qtrue; - ri.Printf(PRINT_ALL, result[1], extension); + + ri.Printf(PRINT_ALL, result[glRefConfig.depthClamp], extension); } else { @@ -370,8 +376,7 @@ void GLimp_InitExtraExtensions() glRefConfig.seamlessCubeMap = qfalse; if( GLimp_HaveExtension( extension ) ) { - if (r_arb_seamless_cube_map->integer) - glRefConfig.seamlessCubeMap = qtrue; + glRefConfig.seamlessCubeMap = !!r_arb_seamless_cube_map->integer; ri.Printf(PRINT_ALL, result[glRefConfig.seamlessCubeMap], extension); } @@ -385,10 +390,12 @@ void GLimp_InitExtraExtensions() glRefConfig.packedNormalDataType = GL_BYTE; if( GLimp_HaveExtension( extension ) ) { - if (r_arb_vertex_type_2_10_10_10_rev->integer) + qboolean useExt = !!r_arb_vertex_type_2_10_10_10_rev->integer; + + if (useExt) glRefConfig.packedNormalDataType = GL_INT_2_10_10_10_REV; - ri.Printf(PRINT_ALL, result[r_arb_vertex_type_2_10_10_10_rev->integer ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[useExt], extension); } else { @@ -403,15 +410,11 @@ void GLimp_InitExtraExtensions() glRefConfig.vertexArrayObject = qfalse; if( GLimp_HaveExtension( extension ) ) { - qglBindVertexArrayARB = (void *) SDL_GL_GetProcAddress("glBindVertexArray"); - qglDeleteVertexArraysARB = (void *) SDL_GL_GetProcAddress("glDeleteVertexArrays"); - qglGenVertexArraysARB = (void *) SDL_GL_GetProcAddress("glGenVertexArrays"); - qglIsVertexArrayARB = (void *) SDL_GL_GetProcAddress("glIsVertexArray"); + glRefConfig.vertexArrayObject = !!r_arb_vertex_array_object->integer; - if (r_arb_vertex_array_object->integer) - glRefConfig.vertexArrayObject = qtrue; + QGL_ARB_vertex_array_object_PROCS; - ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject], extension); } else { @@ -426,7 +429,9 @@ void GLimp_InitExtraExtensions() glRefConfig.packedColorDataSize = sizeof(float) * 4; if( GLimp_HaveExtension( extension ) ) { - if (r_arb_half_float_vertex->integer) + qboolean useExt = !!r_arb_half_float_vertex->integer; + + if (useExt) { glRefConfig.packedTexcoordDataType = GL_HALF_FLOAT; glRefConfig.packedTexcoordDataSize = sizeof(uint16_t) * 2; @@ -434,7 +439,7 @@ void GLimp_InitExtraExtensions() glRefConfig.packedColorDataSize = sizeof(uint16_t) * 4; } - ri.Printf(PRINT_ALL, result[r_arb_half_float_vertex->integer ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[useExt], extension); } else { @@ -443,66 +448,23 @@ void GLimp_InitExtraExtensions() // GL_EXT_direct_state_access extension = "GL_EXT_direct_state_access"; - - qglBindMultiTexture = GLDSA_BindMultiTexture; - qglTextureParameterf = GLDSA_TextureParameterf; - qglTextureParameteri = GLDSA_TextureParameteri; - qglTextureImage2D = GLDSA_TextureImage2D; - qglTextureSubImage2D = GLDSA_TextureSubImage2D; - qglCopyTextureImage2D = GLDSA_CopyTextureImage2D; - qglCompressedTextureImage2D = GLDSA_CompressedTextureImage2D; - qglCompressedTextureSubImage2D = GLDSA_CompressedTextureSubImage2D; - qglGenerateTextureMipmap = GLDSA_GenerateTextureMipmap; - - qglProgramUniform1i = GLDSA_ProgramUniform1i; - qglProgramUniform1f = GLDSA_ProgramUniform1f; - qglProgramUniform2f = GLDSA_ProgramUniform2f; - qglProgramUniform3f = GLDSA_ProgramUniform3f; - qglProgramUniform4f = GLDSA_ProgramUniform4f; - qglProgramUniform1fv = GLDSA_ProgramUniform1fv; - qglProgramUniformMatrix4fv = GLDSA_ProgramUniformMatrix4fv; - - qglNamedRenderbufferStorage = GLDSA_NamedRenderbufferStorage; - qglNamedRenderbufferStorageMultisample = GLDSA_NamedRenderbufferStorageMultisample; - qglCheckNamedFramebufferStatus = GLDSA_CheckNamedFramebufferStatus; - qglNamedFramebufferTexture2D = GLDSA_NamedFramebufferTexture2D; - qglNamedFramebufferRenderbuffer = GLDSA_NamedFramebufferRenderbuffer; - glRefConfig.directStateAccess = qfalse; if (GLimp_HaveExtension(extension)) { - if (r_ext_direct_state_access->integer) + glRefConfig.directStateAccess = !!r_ext_direct_state_access->integer; + + // QGL_*_PROCS becomes several functions, do not remove {} + if (glRefConfig.directStateAccess) { - glRefConfig.directStateAccess = qtrue; - qglBindMultiTexture = (void *)SDL_GL_GetProcAddress("glBindMultiTextureEXT"); - qglTextureParameterf = (void *)SDL_GL_GetProcAddress("glTextureParameterfEXT"); - qglTextureParameteri = (void *)SDL_GL_GetProcAddress("glTextureParameteriEXT"); - qglTextureImage2D = (void *)SDL_GL_GetProcAddress("glTextureImage2DEXT"); - qglTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glTextureSubImage2DEXT"); - qglCopyTextureImage2D = (void *)SDL_GL_GetProcAddress("glCopyTextureImage2DEXT"); - qglCompressedTextureImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureImage2DEXT"); - qglCompressedTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureSubImage2DEXT"); - qglGenerateTextureMipmap = (void *)SDL_GL_GetProcAddress("glGenerateTextureMipmapEXT"); - - qglProgramUniform1i = (void *)SDL_GL_GetProcAddress("glProgramUniform1iEXT"); - qglProgramUniform1f = (void *)SDL_GL_GetProcAddress("glProgramUniform1fEXT"); - qglProgramUniform2f = (void *)SDL_GL_GetProcAddress("glProgramUniform2fEXT"); - qglProgramUniform3f = (void *)SDL_GL_GetProcAddress("glProgramUniform3fEXT"); - qglProgramUniform4f = (void *)SDL_GL_GetProcAddress("glProgramUniform4fEXT"); - qglProgramUniform1fv = (void *)SDL_GL_GetProcAddress("glProgramUniform1fvEXT"); - qglProgramUniformMatrix4fv = (void *)SDL_GL_GetProcAddress("glProgramUniformMatrix4fvEXT"); - - qglNamedRenderbufferStorage = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageEXT"); - qglNamedRenderbufferStorageMultisample = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageMultisampleEXT"); - qglCheckNamedFramebufferStatus = (void *)SDL_GL_GetProcAddress("glCheckNamedFramebufferStatusEXT"); - qglNamedFramebufferTexture2D = (void *)SDL_GL_GetProcAddress("glNamedFramebufferTexture2DEXT"); - qglNamedFramebufferRenderbuffer = (void *)SDL_GL_GetProcAddress("glNamedFramebufferRenderbufferEXT"); + QGL_EXT_direct_state_access_PROCS; } - ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess ? 1 : 0], extension); + ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } + +#undef GLE } diff --git a/code/renderergl2/tr_image.c b/code/renderergl2/tr_image.c index 7f8f2460..f2670699 100644 --- a/code/renderergl2/tr_image.c +++ b/code/renderergl2/tr_image.c @@ -2763,11 +2763,8 @@ void R_CreateBuiltinImages( void ) { if (r_drawSunRays->integer) tr.sunRaysImage = R_CreateImage("*sunRays", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat); - if (glRefConfig.framebufferObject) - { - tr.renderDepthImage = R_CreateImage("*renderdepth", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB); - tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB); - } + tr.renderDepthImage = R_CreateImage("*renderdepth", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB); + tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB); { unsigned short sdata[4]; diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index 73c1c55f..60c62abf 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -974,7 +974,7 @@ void GL_SetDefaultState( void ) GL_BindNullProgram(); if (glRefConfig.vertexArrayObject) - qglBindVertexArrayARB(0); + qglBindVertexArray(0); qglBindBuffer(GL_ARRAY_BUFFER, 0); qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index 202e1af9..e81f854b 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -1402,7 +1402,6 @@ typedef struct { qboolean textureNonPowerOfTwo; qboolean textureFloat; qboolean halfFloatPixel; - qboolean packedDepthStencil; textureCompressionRef_t textureCompression; qboolean swizzleNormalmap; diff --git a/code/renderergl2/tr_shade.c b/code/renderergl2/tr_shade.c index 356f2135..1cfc42d8 100644 --- a/code/renderergl2/tr_shade.c +++ b/code/renderergl2/tr_shade.c @@ -1292,7 +1292,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) if (r_sunlightMode->integer && (backEnd.viewParms.flags & VPF_USESUNLIGHT) && (pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK)) { - GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP); + // FIXME: screenShadowImage is NULL if no framebuffers + if (tr.screenShadowImage) + GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP); GLSL_SetUniformVec3(sp, UNIFORM_PRIMARYLIGHTAMBIENT, backEnd.refdef.sunAmbCol); if (r_pbr->integer) { @@ -1404,7 +1406,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input ) vec4_t vec; cubemap_t *cubemap = &tr.cubemaps[input->cubemapIndex - 1]; - GL_BindToTMU( cubemap->image, TB_CUBEMAP); + // FIXME: cubemap image could be NULL if cubemap isn't renderer or loaded + if (cubemap->image) + GL_BindToTMU( cubemap->image, TB_CUBEMAP); VectorSubtract(cubemap->origin, backEnd.viewParms.or.origin, vec); vec[3] = 1.0f; diff --git a/code/renderergl2/tr_vbo.c b/code/renderergl2/tr_vbo.c index 61ede4e1..b1ff3d60 100644 --- a/code/renderergl2/tr_vbo.c +++ b/code/renderergl2/tr_vbo.c @@ -262,8 +262,8 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind if (glRefConfig.vertexArrayObject) { - qglGenVertexArraysARB(1, &vao->vao); - qglBindVertexArrayARB(vao->vao); + qglGenVertexArrays(1, &vao->vao); + qglBindVertexArray(vao->vao); } @@ -383,8 +383,8 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num if (glRefConfig.vertexArrayObject) { - qglGenVertexArraysARB(1, &vao->vao); - qglBindVertexArrayARB(vao->vao); + qglGenVertexArrays(1, &vao->vao); + qglBindVertexArray(vao->vao); } @@ -480,7 +480,7 @@ void R_BindVao(vao_t * vao) if (glRefConfig.vertexArrayObject) { - qglBindVertexArrayARB(vao->vao); + qglBindVertexArray(vao->vao); // why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel? if (1) @@ -515,7 +515,7 @@ void R_BindNullVao(void) { if (glRefConfig.vertexArrayObject) { - qglBindVertexArrayARB(0); + qglBindVertexArray(0); // why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel? if (1) qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -654,7 +654,7 @@ void R_ShutdownVaos(void) vao = tr.vaos[i]; if(vao->vao) - qglDeleteVertexArraysARB(1, &vao->vao); + qglDeleteVertexArrays(1, &vao->vao); if(vao->vertexesVBO) {