Stefan Dösinger : wined3d: Fake occlusion queries if the wrong context is active.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 23 07:26:03 CDT 2007


Module: wine
Branch: master
Commit: e184b09a6601f448eb000ebd6dcd10874b2bef21
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e184b09a6601f448eb000ebd6dcd10874b2bef21

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Aug 14 15:42:34 2007 +0200

wined3d: Fake occlusion queries if the wrong context is active.

---

 dlls/wined3d/device.c          |    1 +
 dlls/wined3d/query.c           |   26 +++++++++++++++++---------
 dlls/wined3d/wined3d_private.h |    1 +
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8509192..60f310a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1140,6 +1140,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINE
             TRACE("(%p) Allocating data for an occlusion query\n", This);
             object->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineQueryOcclusionData));
             GL_EXTCALL(glGenQueriesARB(1, &((WineQueryOcclusionData *)(object->extendedData))->queryId));
+            ((WineQueryOcclusionData *)(object->extendedData))->ctx = This->activeContext;
             break;
         }
     case WINED3DQUERYTYPE_EVENT:
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index f787c78..7c91f2e 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -187,7 +187,9 @@ static HRESULT  WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa
     case WINED3DQUERYTYPE_OCCLUSION:
     {
         DWORD* data = pData;
-        if (GL_SUPPORT(ARB_OCCLUSION_QUERY)) {
+        if (GL_SUPPORT(ARB_OCCLUSION_QUERY) &&
+            ((WineQueryOcclusionData *)This->extendedData)->ctx == This->wineD3DDevice->activeContext &&
+            This->wineD3DDevice->activeContext->tid == GetCurrentThreadId()) {
             GLuint available;
             GLuint samples;
             GLuint queryId = ((WineQueryOcclusionData *)This->extendedData)->queryId;
@@ -206,7 +208,7 @@ static HRESULT  WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa
                 res = S_FALSE;
             }
         } else {
-            FIXME("(%p) : Occlusion queries not supported. Returning 1.\n", This);
+            WARN("(%p) : Occlusion queries not supported, or wrong context. Returning 1.\n", This);
             *data = 1;
             res = S_OK;
         }
@@ -380,13 +382,19 @@ static HRESULT  WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIs
     switch (This->type) {
         case WINED3DQUERYTYPE_OCCLUSION:
             if (GL_SUPPORT(ARB_OCCLUSION_QUERY)) {
-                if (dwIssueFlags & WINED3DISSUE_BEGIN) {
-                    GL_EXTCALL(glBeginQueryARB(GL_SAMPLES_PASSED_ARB, ((WineQueryOcclusionData *)This->extendedData)->queryId));
-                    checkGLcall("glBeginQuery()");
-                }
-                if (dwIssueFlags & WINED3DISSUE_END) {
-                    GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
-                    checkGLcall("glEndQuery()");
+                WineD3DContext *ctx = ((WineQueryOcclusionData *)This->extendedData)->ctx;
+
+                if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
+                    WARN("Not the owning context, can't start query\n");
+                } else {
+                    if (dwIssueFlags & WINED3DISSUE_BEGIN) {
+                        GL_EXTCALL(glBeginQueryARB(GL_SAMPLES_PASSED_ARB, ((WineQueryOcclusionData *)This->extendedData)->queryId));
+                        checkGLcall("glBeginQuery()");
+                    }
+                    if (dwIssueFlags & WINED3DISSUE_END) {
+                        GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
+                        checkGLcall("glEndQuery()");
+                    }
                 }
             } else {
                 FIXME("(%p) : Occlusion queries not supported\n", This);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 84e0480..0328780 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1460,6 +1460,7 @@ extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl;
 /* Datastructures for IWineD3DQueryImpl.extendedData */
 typedef struct  WineQueryOcclusionData {
     GLuint  queryId;
+    WineD3DContext *ctx;
 } WineQueryOcclusionData;
 
 typedef struct  WineQueryEventData {




More information about the wine-cvs mailing list