Add GLXFBConfig on Wine_GLContext (we should remove XVisualInfo
references on code).
Hook glGetIntegerv on GL_ALPHA_BITS to query on GLXFBConfig instead of
glGetInteger (as it returns bad value).
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl
index 053eee7..db42154 100755
--- a/dlls/opengl32/make_opengl
+++ b/dlls/opengl32/make_opengl
@@ -261,6 +261,9 @@
if ( $func_ref->[0] eq "glGetString" ) {
$wine_func_ref_name = "internal_glGetString";
}
+ if ( $func_ref->[0] eq "glGetIntegerv" ) {
+ $wine_func_ref_name = "internal_glGetIntegerv";
+ }
$ret = "$ret$prefix$wine_func_ref_name( $call_arg);\n";
if ($thread_safe) {
$ret = "$ret LEAVE_GL();\n";
diff --git a/dlls/opengl32/opengl_ext.h b/dlls/opengl32/opengl_ext.h
index a586636..274f8d3 100644
--- a/dlls/opengl32/opengl_ext.h
+++ b/dlls/opengl32/opengl_ext.h
@@ -73,5 +73,6 @@
extern int extension_registry_size;
const GLubyte* internal_glGetString(GLenum name);
+void internal_glGetIntegerv(GLenum pname, GLint* params);
#endif /* __DLLS_OPENGL32_OPENGL_EXT_H */
diff --git a/dlls/opengl32/opengl_norm.c b/dlls/opengl32/opengl_norm.c
index 0870575..8374a86 100644
--- a/dlls/opengl32/opengl_norm.c
+++ b/dlls/opengl32/opengl_norm.c
@@ -1329,7 +1329,7 @@
void WINAPI wine_glGetIntegerv( GLenum pname, GLint* params ) {
TRACE("(%d, %p)\n", pname, params );
ENTER_GL();
- glGetIntegerv( pname, params );
+ internal_glGetIntegerv( pname, params );
LEAVE_GL();
}
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index a086602..d3bff02 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -64,8 +64,9 @@
typedef struct wine_glcontext {
HDC hdc;
Display *display;
- GLXContext ctx;
XVisualInfo *vis;
+ GLXFBConfig fb_conf;
+ GLXContext ctx;
struct wine_glcontext *next;
struct wine_glcontext *prev;
} Wine_GLContext;
@@ -186,6 +187,28 @@
ret->display = display;
ret->vis = vis;
+ {
+ int hdcPF = GetPixelFormat(hdc);
+ int nCfgs_fmt = 0;
+ GLXFBConfig* cfgs_fmt = NULL;
+ GLXFBConfig cur_cfg;
+ int value;
+ int gl_test = 0;
+ cfgs_fmt = glXGetFBConfigs(display, DefaultScreen(display), &nCfgs_fmt);
+ if (NULL == cfgs_fmt || 0 == nCfgs_fmt) {
+ ERR("Cannot get FB Configs, expect problems.\n");
+ return NULL;
+ }
+ cur_cfg = cfgs_fmt[hdcPF - 1];
+ gl_test = glXGetFBConfigAttrib(display, cur_cfg, GLX_FBCONFIG_ID, &value);
+ if (gl_test) {
+ ERR("Failed to retrieve FBCONFIG_ID from GLXFBConfig, expect problems.\n");
+ return NULL;
+ }
+ ret->fb_conf = cur_cfg;
+ XFree(cfgs_fmt);
+ }
+
TRACE(" creating context %p (GL context creation delayed)\n", ret);
return (HGLRC) ret;
}
@@ -442,7 +465,6 @@
} else {
Wine_GLContext *ctx = (Wine_GLContext *) hglrc;
Drawable drawable = get_drawable( hdc );
-
if (ctx->ctx == NULL) {
ctx->ctx = glXCreateContext(ctx->display, ctx->vis, NULL, True);
TRACE(" created a delayed OpenGL context (%p) for %p\n", ctx->ctx, ctx->vis);
@@ -799,6 +821,18 @@
return (const GLubyte *) internal_gl_extensions;
}
+void internal_glGetIntegerv(GLenum pname, GLint* params) {
+ glGetIntegerv(pname, params);
+ if (pname == GL_ALPHA_BITS) {
+ GLint tmp;
+ GLXContext gl_ctx = glXGetCurrentContext();
+ Wine_GLContext* ret = get_context_from_GLXContext(gl_ctx);
+ glXGetFBConfigAttrib(ret->display, ret->fb_conf, GLX_ALPHA_SIZE, &tmp);
+ TRACE("returns GL_ALPHA_BITS as '%d'\n", tmp);
+ *params = tmp;
+ }
+}
+
/* No need to load any other libraries as according to the ABI, libGL should be self-sufficient and
include all dependencies
diff --git a/dlls/opengl32/wgl_ext.c b/dlls/opengl32/wgl_ext.c
index c7b7974..72d1e4e 100644
--- a/dlls/opengl32/wgl_ext.c
+++ b/dlls/opengl32/wgl_ext.c
@@ -357,23 +357,23 @@
break;
case WGL_RED_BITS_ARB:
pop = iWGLAttr[++cur];
- TRACE("pAttr[%d] = GLX_RED_SIZE: %d\n", cur, pop);
PUSH2(oGLXAttr, GLX_RED_SIZE, pop);
+ TRACE("pAttr[%d] = GLX_RED_SIZE: %d\n", cur, pop);
break;
case WGL_GREEN_BITS_ARB:
pop = iWGLAttr[++cur];
- TRACE("pAttr[%d] = GLX_GREEN_SIZE: %d\n", cur, pop);
PUSH2(oGLXAttr, GLX_GREEN_SIZE, pop);
+ TRACE("pAttr[%d] = GLX_GREEN_SIZE: %d\n", cur, pop);
break;
case WGL_ALPHA_BITS_ARB:
pop = iWGLAttr[++cur];
- TRACE("pAttr[%d] = GLX_ALPHA_SIZE: %d\n", cur, pop);
PUSH2(oGLXAttr, GLX_ALPHA_SIZE, pop);
+ TRACE("pAttr[%d] = GLX_ALPHA_SIZE: %d\n", cur, pop);
break;
case WGL_DEPTH_BITS_ARB:
pop = iWGLAttr[++cur];
- TRACE("pAttr[%d] = GLX_DEPTH_SIZE: %d\n", cur, pop);
PUSH2(oGLXAttr, GLX_DEPTH_SIZE, pop);
+ TRACE("pAttr[%d] = GLX_DEPTH_SIZE: %d\n", cur, pop);
break;
case WGL_STENCIL_BITS_ARB:
pop = iWGLAttr[++cur];
@@ -689,8 +689,11 @@
continue ;
}
if (fmt_id == tmp_fmt_id) {
+ int tmp;
piFormats[pfmt_it] = it_fmt + 1;
++pfmt_it;
+ glXGetFBConfigAttrib(display, cfgs_fmt[it_fmt], GLX_ALPHA_SIZE, &tmp);
+ TRACE("for FBCONFIG_ID(%d/%d) found '%d'\n", it_fmt + 1, nCfgs_fmt, tmp);
break ;
}
}