Module: wine Branch: master Commit: e184b09a6601f448eb000ebd6dcd10874b2bef21 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e184b09a6601f448eb000ebd6d...
Author: Stefan Dösinger stefan@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 {