Module: wine Branch: master Commit: 1e48bbb7acf3bfc43c5d041a2680d73aed9e40c4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e48bbb7acf3bfc43c5d041a26...
Author: Matteo Bruni mbruni@codeweavers.com Date: Thu Jan 29 18:45:00 2015 +0100
opengl32: Don't use deprecated functions for extension checking purposes on core profile contexts.
---
dlls/opengl32/wgl.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 32d241c..cb91699 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -162,6 +162,12 @@ static void free_handle_ptr( struct wgl_handle *ptr ) LeaveCriticalSection( &wgl_section ); }
+static inline enum wgl_handle_type get_current_context_type(void) +{ + if (!NtCurrentTeb()->glCurrentRC) return HANDLE_CONTEXT; + return (LOWORD(NtCurrentTeb()->glCurrentRC) & HANDLE_TYPE_MASK) >> 12; +} + /*********************************************************************** * wglCopyContext (OPENGL32.@) */ @@ -684,6 +690,30 @@ int WINAPI wglGetLayerPaletteEntries(HDC hdc, /* check if the extension is present in the list */ static BOOL has_extension( const char *list, const char *ext, size_t len ) { + if (!list) + { + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + const char *gl_ext; + unsigned int i; + GLint extensions_count; + + if (!funcs->ext.p_glGetStringi) + { + void **func_ptr = (void **)&funcs->ext.p_glGetStringi; + + *func_ptr = funcs->wgl.p_wglGetProcAddress("glGetStringi"); + } + + glGetIntegerv(GL_NUM_EXTENSIONS, &extensions_count); + for (i = 0; i < extensions_count; ++i) + { + gl_ext = (const char *)funcs->ext.p_glGetStringi(GL_EXTENSIONS, i); + if (!strncmp(gl_ext, ext, len) && !gl_ext[len]) + return TRUE; + } + return FALSE; + } + while (list) { while (*list == ' ') list++; @@ -701,15 +731,21 @@ static int compar(const void *elt_a, const void *elt_b) { /* Check if a GL extension is supported */ static BOOL is_extension_supported(const char* extension) { + enum wgl_handle_type type = get_current_context_type(); const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; - const char *gl_ext_string = (const char*)glGetString(GL_EXTENSIONS); + const char *gl_ext_string = NULL; size_t len;
TRACE("Checking for extension '%s'\n", extension);
- if(!gl_ext_string) { - ERR("No OpenGL extensions found, check if your OpenGL setup is correct!\n"); - return FALSE; + if (type == HANDLE_CONTEXT) + { + gl_ext_string = (const char*)glGetString(GL_EXTENSIONS); + if (!gl_ext_string) + { + ERR("No OpenGL extensions found, check if your OpenGL setup is correct!\n"); + return FALSE; + } }
/* We use the GetProcAddress function from the display driver to retrieve function pointers