Commit 706bc26a authored by Jan Zerebecki's avatar Jan Zerebecki Committed by Alexandre Julliard

wined3d: Make CreateFakeGLContext thread safe.

parent 85d9b024
...@@ -78,11 +78,24 @@ static BOOL wined3d_fake_gl_context_foreign; ...@@ -78,11 +78,24 @@ static BOOL wined3d_fake_gl_context_foreign;
static BOOL wined3d_fake_gl_context_available = FALSE; static BOOL wined3d_fake_gl_context_available = FALSE;
static Display* wined3d_fake_gl_context_display = NULL; static Display* wined3d_fake_gl_context_display = NULL;
static CRITICAL_SECTION wined3d_fake_gl_context_cs;
static CRITICAL_SECTION_DEBUG wined3d_fake_gl_context_cs_debug =
{
0, 0, &wined3d_fake_gl_context_cs,
{ &wined3d_fake_gl_context_cs_debug.ProcessLocksList,
&wined3d_fake_gl_context_cs_debug.ProcessLocksList },
0, 0, { (DWORD_PTR)(__FILE__ ": wined3d_fake_gl_context_cs") }
};
static CRITICAL_SECTION wined3d_fake_gl_context_cs = { &wined3d_fake_gl_context_cs_debug, -1, 0, 0, 0, 0 };
static void WineD3D_ReleaseFakeGLContext(void) { static void WineD3D_ReleaseFakeGLContext(void) {
GLXContext glCtx; GLXContext glCtx;
EnterCriticalSection(&wined3d_fake_gl_context_cs);
if(!wined3d_fake_gl_context_available) { if(!wined3d_fake_gl_context_available) {
TRACE_(d3d_caps)("context not available\n"); TRACE_(d3d_caps)("context not available\n");
LeaveCriticalSection(&wined3d_fake_gl_context_cs);
return; return;
} }
...@@ -95,17 +108,21 @@ static void WineD3D_ReleaseFakeGLContext(void) { ...@@ -95,17 +108,21 @@ static void WineD3D_ReleaseFakeGLContext(void) {
glXMakeCurrent(wined3d_fake_gl_context_display, None, NULL); glXMakeCurrent(wined3d_fake_gl_context_display, None, NULL);
glXDestroyContext(wined3d_fake_gl_context_display, glCtx); glXDestroyContext(wined3d_fake_gl_context_display, glCtx);
} }
LEAVE_GL();
wined3d_fake_gl_context_available = FALSE; wined3d_fake_gl_context_available = FALSE;
} }
assert(wined3d_fake_gl_context_ref >= 0); assert(wined3d_fake_gl_context_ref >= 0);
LeaveCriticalSection(&wined3d_fake_gl_context_cs);
LEAVE_GL();
} }
static BOOL WineD3D_CreateFakeGLContext(void) { static BOOL WineD3D_CreateFakeGLContext(void) {
XVisualInfo* visInfo; XVisualInfo* visInfo;
GLXContext glCtx; GLXContext glCtx;
ENTER_GL();
EnterCriticalSection(&wined3d_fake_gl_context_cs);
TRACE_(d3d_caps)("getting context...\n"); TRACE_(d3d_caps)("getting context...\n");
if(wined3d_fake_gl_context_ref > 0) goto ret; if(wined3d_fake_gl_context_ref > 0) goto ret;
assert(0 == wined3d_fake_gl_context_ref); assert(0 == wined3d_fake_gl_context_ref);
...@@ -119,8 +136,6 @@ static BOOL WineD3D_CreateFakeGLContext(void) { ...@@ -119,8 +136,6 @@ static BOOL WineD3D_CreateFakeGLContext(void) {
ReleaseDC(0, device_context); ReleaseDC(0, device_context);
} }
ENTER_GL();
visInfo = NULL; visInfo = NULL;
glCtx = glXGetCurrentContext(); glCtx = glXGetCurrentContext();
...@@ -170,10 +185,12 @@ static BOOL WineD3D_CreateFakeGLContext(void) { ...@@ -170,10 +185,12 @@ static BOOL WineD3D_CreateFakeGLContext(void) {
TRACE_(d3d_caps)("incrementing ref from %i\n", wined3d_fake_gl_context_ref); TRACE_(d3d_caps)("incrementing ref from %i\n", wined3d_fake_gl_context_ref);
wined3d_fake_gl_context_ref++; wined3d_fake_gl_context_ref++;
wined3d_fake_gl_context_available = TRUE; wined3d_fake_gl_context_available = TRUE;
LeaveCriticalSection(&wined3d_fake_gl_context_cs);
return TRUE; return TRUE;
fail: fail:
if(visInfo) XFree(visInfo); if(visInfo) XFree(visInfo);
if(glCtx) glXDestroyContext(wined3d_fake_gl_context_display, glCtx); if(glCtx) glXDestroyContext(wined3d_fake_gl_context_display, glCtx);
LeaveCriticalSection(&wined3d_fake_gl_context_cs);
LEAVE_GL(); LEAVE_GL();
return FALSE; return FALSE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment