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