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; }