Jan Zerebecki jan.wine@zerebecki.de writes:
+static void WineD3D_CreateFakeGLContext(void) {
- TRACE_(d3d_caps)("getting context...\n");
- if(wined3d_fake_gl_context_ref > 0) goto ret;
- assert(0 == wined3d_fake_gl_context_ref);
- wined3d_fake_gl_context_foreign = TRUE;
- Display* display = WineD3D_GetDisplay();
- XVisualInfo* visInfo = NULL;
- GLXContext glCtx = glXGetCurrentContext();
This isn't thread-safe. Also please avoid mixing declarations and code.
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_RED_SIZE, &rb);
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_GREEN_SIZE, &gb);
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_BLUE_SIZE, &bb);
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_ALPHA_SIZE, &ab);
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_RENDER_TYPE, &type);
- gl_test = glXGetFBConfigAttrib(ctx->display, cfgs, GLX_BUFFER_SIZE, &buf_sz);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_RED_SIZE, &rb);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_GREEN_SIZE, &gb);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_BLUE_SIZE, &bb);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_ALPHA_SIZE, &ab);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_RENDER_TYPE, &type);
- gl_test = glXGetFBConfigAttrib(WineD3D_GetDisplay(), cfgs, GLX_BUFFER_SIZE, &buf_sz);
This will be slow, you should retrieve the display only once.
- WineD3D_CreateFakeGLContext();
- if(wined3d_fake_gl_context_ref > 0)
cfgs = glXGetFBConfigs(WineD3D_GetDisplay(), DefaultScreen(WineD3D_GetDisplay()), &nCfgs);
The ref count should be internal to the get/release functions, you shouldn't use it here.
+extern int wined3d_fake_gl_context_ref; +extern BOOL wined3d_fake_gl_context_foreign;
No reason to export these, they should be static.