From 8f535997f86cdc4bc2dfdc182a33b97960fa4703 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 29 Aug 2016 11:33:20 +0200 Subject: [PATCH] - enable core profile by default on GL 3.x. After doing some profiling it was very obvious that this has better performance than client arrays. Persistent buffers are still better, though, especially for handling dynamic lights. --- src/gl/data/gl_vertexbuffer.cpp | 4 ++- src/gl/renderer/gl_renderer.cpp | 2 +- src/gl/system/gl_interface.cpp | 13 +------ src/win32/win32gliface.cpp | 60 +++++---------------------------- src/win32/win32gliface.h | 1 - 5 files changed, 14 insertions(+), 66 deletions(-) diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp index 31cb8d0b5..5833d3109 100644 --- a/src/gl/data/gl_vertexbuffer.cpp +++ b/src/gl/data/gl_vertexbuffer.cpp @@ -148,6 +148,7 @@ FFlatVertexBuffer::FFlatVertexBuffer(int width, int height) glBindBuffer(GL_ARRAY_BUFFER, vbo_id); glBufferStorage(GL_ARRAY_BUFFER, bytesize, NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); map = (FFlatVertex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, bytesize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + DPrintf(DMSG_NOTIFY, "Using persistent buffer\n"); break; } @@ -157,13 +158,14 @@ FFlatVertexBuffer::FFlatVertexBuffer(int width, int height) glBindBuffer(GL_ARRAY_BUFFER, vbo_id); glBufferData(GL_ARRAY_BUFFER, bytesize, NULL, GL_STREAM_DRAW); map = nullptr; + DPrintf(DMSG_NOTIFY, "Using deferred buffer\n"); break; } case BM_CLIENTARRAY: { - // The fallback path uses immediate mode rendering and does not set up an actual vertex buffer map = new FFlatVertex[BUFFER_SIZE]; + DPrintf(DMSG_NOTIFY, "Using client array buffer\n"); break; } } diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index eb0eebaa1..c8f2eb224 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -130,7 +130,7 @@ void FGLRenderer::Initialize(int width, int height) m2DDrawer = new F2DDrawer; // Only needed for the core profile, because someone decided it was a good idea to remove the default VAO. - if (gl.version >= 4.0) + if (gl.buffermethod != BM_CLIENTARRAY) { glGenVertexArrays(1, &mVAOID); glBindVertexArray(mVAOID); diff --git a/src/gl/system/gl_interface.cpp b/src/gl/system/gl_interface.cpp index 9eb1d779e..c54d96448 100644 --- a/src/gl/system/gl_interface.cpp +++ b/src/gl/system/gl_interface.cpp @@ -156,14 +156,6 @@ void gl_LoadExtensions() gl.version = strtod(version, NULL) + 0.01f; - bool iscore = false; - if (gl.version >= 3.2) - { - int v; - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &v); - iscore = !!(v & GL_CONTEXT_CORE_PROFILE_BIT); - } - // Don't even start if it's lower than 2.0 or no framebuffers are available if ((gl.version < 2.0 || !CheckExtension("GL_EXT_framebuffer_object")) && gl.version < 3.0) { @@ -186,10 +178,7 @@ void gl_LoadExtensions() if (gl.version > 3.0f && (gl.version >= 3.3f || CheckExtension("GL_ARB_uniform_buffer_object"))) { gl.lightmethod = LM_DEFERRED; - if (iscore) - { - gl.buffermethod = BM_DEFERRED; - } + gl.buffermethod = BM_DEFERRED; } if (CheckExtension("GL_ARB_texture_compression")) gl.flags |= RFL_TEXTURE_COMPRESSION; diff --git a/src/win32/win32gliface.cpp b/src/win32/win32gliface.cpp index 23f156592..494d94233 100644 --- a/src/win32/win32gliface.cpp +++ b/src/win32/win32gliface.cpp @@ -737,42 +737,6 @@ bool Win32GLVideo::SetupPixelFormat(int multisample) // //========================================================================== -// since we cannot use the extension loader here, before it gets initialized, -// we have to define the extended GL stuff we need, ourselves here. -// The headers generated by GLLoadGen only work if the loader gets initialized. -typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC)(GLenum, GLuint); -#define GL_NUM_EXTENSIONS 0x821D - -bool Win32GLVideo::checkCoreUsability() -{ - const char *version = Args->CheckValue("-glversion"); - if (version != NULL) - { - if (strtod(version, NULL) < 4.0) return false; - } - if (Args->CheckParm("-noshader")) return false; - - // GL 4.4 implies GL_ARB_buffer_storage - if (strcmp((char*)glGetString(GL_VERSION), "4.4") >= 0) return true; - - // at this point the extension loader has not been initialized so we have to retrieve glGetStringi ourselves. - PFNGLGETSTRINGIPROC myglGetStringi = (PFNGLGETSTRINGIPROC)wglGetProcAddress("glGetStringi"); - if (!myglGetStringi) return false; // this should not happen. - - const char *extension; - - int max = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &max); - - // step through all reported extensions and see if we got what we need... - for (int i = 0; i < max; i++) - { - extension = (const char*)myglGetStringi(GL_EXTENSIONS, i); - if (!strcmp(extension, "GL_ARB_buffer_storage")) return true; - } - return false; -} - bool Win32GLVideo::InitHardware (HWND Window, int multisample) { m_Window=Window; @@ -783,7 +747,14 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) return false; } - for (int prof = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; prof <= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; prof++) + int prof = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; + const char *lm = Args->CheckValue("-buffermethod"); + if (lm != NULL) + { + if (!stricmp(lm, "clientarray")) prof = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + } + + for (; prof <= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; prof++) { m_hRC = NULL; if (myWglCreateContextAttribsARB != NULL) @@ -802,8 +773,6 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) 0 }; - //Printf("Trying to create an OpenGL %d.%d %s profile context\n", versions[i] / 10, versions[i] % 10, prof == WGL_CONTEXT_CORE_PROFILE_BIT_ARB ? "Core" : "Compatibility"); - m_hRC = myWglCreateContextAttribsARB(m_hDC, 0, ctxAttribs); if (m_hRC != NULL) break; } @@ -811,7 +780,6 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) if (m_hRC == NULL && prof == WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) { - m_hRC = wglCreateContext(m_hDC); if (m_hRC == NULL) { @@ -823,17 +791,7 @@ bool Win32GLVideo::InitHardware (HWND Window, int multisample) if (m_hRC != NULL) { wglMakeCurrent(m_hDC, m_hRC); - - // we can only use core profile contexts if GL_ARB_buffer_storage is supported or GL version is >= 4.4 - if (prof == WGL_CONTEXT_CORE_PROFILE_BIT_ARB && !checkCoreUsability()) - { - wglMakeCurrent(0, 0); - wglDeleteContext(m_hRC); - } - else - { - return true; - } + return true; } } // We get here if the driver doesn't support the modern context creation API which always means an old driver. diff --git a/src/win32/win32gliface.h b/src/win32/win32gliface.h index 00e6cba81..6320e2903 100644 --- a/src/win32/win32gliface.h +++ b/src/win32/win32gliface.h @@ -86,7 +86,6 @@ protected: void MakeModesList(); void AddMode(int x, int y, int bits, int baseHeight, int refreshHz); void FreeModes(); - bool checkCoreUsability(); public: int GetTrueHeight() { return m_trueHeight; }