From f070d358e31542df4f016558be6bf30dfb07aa84 Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 12 Aug 2018 22:11:32 +0000 Subject: [PATCH] Use GL3.2 Core Profile context. Create and bind a vertex array object at start, since Core Profile requires it, but gains no benefit in performance from using multiple. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12457 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_backend.c | 11 +++++++++-- vid.h | 12 ------------ vid_sdl.c | 2 ++ vid_shared.c | 40 ++++++++++++++++++++++++++-------------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/gl_backend.c b/gl_backend.c index b99d654a..34895d13 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -156,6 +156,9 @@ typedef struct gl_state_s int defaultframebufferobject; // deal with platforms that use a non-zero default fbo qboolean pointer_color_enabled; + // GL3.2 Core requires that we have a GL_VERTEX_ARRAY_OBJECT, but... just one. + unsigned int defaultvao; + int pointer_vertex_components; int pointer_vertex_gltype; size_t pointer_vertex_stride; @@ -259,17 +262,21 @@ static void gl_backend_start(void) CHECKGLERROR - GL_Backend_ResetState(); - switch(vid.renderpath) { case RENDERPATH_GL32: + // GL3.2 Core requires that we have a VAO bound - but using more than one has no performance benefit so this is just placeholder + qglGenVertexArrays(1, &gl_state.defaultvao); + qglBindVertexArray(gl_state.defaultvao); + // fall through case RENDERPATH_GLES2: // fetch current fbo here (default fbo is not 0 on some GLES devices) CHECKGLERROR qglGetIntegerv(GL_FRAMEBUFFER_BINDING, &gl_state.defaultframebufferobject);CHECKGLERROR break; } + + GL_Backend_ResetState(); } static void gl_backend_shutdown(void) diff --git a/vid.h b/vid.h index ddd7a21e..df62a5a4 100644 --- a/vid.h +++ b/vid.h @@ -39,22 +39,10 @@ typedef struct viddef_support_s { int glshaderversion; // this is at least 150 (GL 3.2) qboolean amd_texture_texture4; - qboolean arb_draw_buffers; - qboolean arb_occlusion_query; - qboolean arb_query_buffer_object; - qboolean arb_texture_compression; qboolean arb_texture_gather; - qboolean ext_blend_minmax; - qboolean ext_blend_subtract; - qboolean ext_blend_func_separate; - qboolean ext_packed_depth_stencil; qboolean ext_texture_compression_s3tc; qboolean ext_texture_filter_anisotropic; qboolean ext_texture_srgb; - qboolean arb_texture_float; - qboolean arb_half_float_pixel; - qboolean arb_half_float_vertex; - qboolean arb_multisample; qboolean arb_debug_output; } viddef_support_t; diff --git a/vid_sdl.c b/vid_sdl.c index 2c1b2044..248baac7 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -1512,6 +1512,8 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute (SDL_GL_RETAINED_BACKING, 1); #else + 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, (gl_debug.integer > 0 ? SDL_GL_CONTEXT_DEBUG_FLAG : 0)); #endif diff --git a/vid_shared.c b/vid_shared.c index 9f4df42e..461b0ad4 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -754,15 +754,7 @@ void GL_Setup(void) #endif vid.support.amd_texture_texture4 = GL_CheckExtension("GL_AMD_texture_texture4", "-notexture4", false); - vid.support.arb_draw_buffers = true; - vid.support.arb_occlusion_query = true; - vid.support.arb_query_buffer_object = true; - vid.support.arb_texture_compression = true; vid.support.arb_texture_gather = GL_CheckExtension("GL_ARB_texture_gather", "-notexturegather", false); - vid.support.ext_blend_minmax = true; - vid.support.ext_blend_subtract = true; - vid.support.ext_blend_func_separate = true; - vid.support.ext_packed_depth_stencil = true; vid.support.ext_texture_compression_s3tc = GL_CheckExtension("GL_EXT_texture_compression_s3tc", "-nos3tc", false); vid.support.ext_texture_filter_anisotropic = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", "-noanisotropy", false); #ifndef USE_GLES2 @@ -777,13 +769,33 @@ void GL_Setup(void) // COMMANDLINEOPTION: GL: -notexturegather disables GL_ARB_texture_gather (which provides fetch4 sampling) // COMMANDLINEOPTION: GL: -nogldebugoutput disables GL_ARB_debug_output (which provides the gl_debug feature, if enabled) - if (vid.support.arb_draw_buffers) - qglGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint*)&vid.maxdrawbuffers); - +#ifdef GL_MAX_DRAW_BUFFERS + qglGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint*)&vid.maxdrawbuffers); + CHECKGLERROR +#endif qglGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_2d); - qglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, (GLint*)&vid.max_anisotropy); - qglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_cubemap); - qglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_3d); + CHECKGLERROR +#ifdef GL_MAX_CUBE_MAP_TEXTURE_SIZE +#ifdef USE_GLES2 + if (GL_CheckExtension("GL_ARB_texture_cube_map", "-nocubemap", false)) +#endif + { + qglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_cubemap); + Con_DPrintf("GL_MAX_CUBE_MAP_TEXTURE_SIZE = %i\n", vid.maxtexturesize_cubemap); + } + CHECKGLERROR +#endif +#ifdef GL_MAX_3D_TEXTURE_SIZE +#ifdef USE_GLES2 + if (GL_CheckExtension("GL_EXT_texture3D", "-notexture3d", false) + || GL_CheckExtension("GL_OES_texture3D", "-notexture3d", false)) +#endif + { + qglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_3d); + Con_DPrintf("GL_MAX_3D_TEXTURE_SIZE = %i\n", vid.maxtexturesize_3d); + } +#endif + CHECKGLERROR #ifdef USE_GLES2 Con_DPrint("Using GLES2 rendering path\n"); -- 2.39.2