wined3d: Make calling a query from the wrong context a FIXME.
Henri Verbeet
hverbeet at codeweavers.com
Wed Jan 7 02:00:55 CST 2009
We want to know if this happens a lot. If the query is always called from a
different context than the one that created it, occlusion culling would
effectively be disabled, which could have a significant performance impact,
depending on the type of objects being culled.
---
dlls/wined3d/query.c | 60 ++++++++++++++++++++++++++++++--------------------
1 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index 7826325..c9989f2 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -281,32 +281,44 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
/* Msdn says this returns an error, but our tests show that S_FALSE is returned */
TRACE("Query is building, returning S_FALSE\n");
res = S_FALSE;
- } else 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;
+ }
+ else if (GL_SUPPORT(ARB_OCCLUSION_QUERY))
+ {
+ if (((WineQueryOcclusionData *)This->extendedData)->ctx != This->wineD3DDevice->activeContext
+ || This->wineD3DDevice->activeContext->tid != GetCurrentThreadId())
+ {
+ FIXME("%p Wrong context, returning 1.\n", This);
+ *data = 1;
+ res = S_OK;
+ }
+ else
+ {
+ GLuint available;
+ GLuint samples;
+ GLuint queryId = ((WineQueryOcclusionData *)This->extendedData)->queryId;
- ENTER_GL();
- GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_AVAILABLE_ARB, &available));
- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT_AVAILABLE)\n");
- TRACE("(%p) : available %d.\n", This, available);
-
- if (available) {
- if(data) {
- GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_ARB, &samples));
- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)\n");
- TRACE("(%p) : Returning %d samples.\n", This, samples);
- *data = samples;
+ ENTER_GL();
+ GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_AVAILABLE_ARB, &available));
+ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT_AVAILABLE)\n");
+ TRACE("(%p) : available %d.\n", This, available);
+
+ if (available)
+ {
+ if (data)
+ {
+ GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_ARB, &samples));
+ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)\n");
+ TRACE("(%p) : Returning %d samples.\n", This, samples);
+ *data = samples;
+ }
+ res = S_OK;
+ } else {
+ res = S_FALSE;
}
- res = S_OK;
- } else {
- res = S_FALSE;
+ LEAVE_GL();
}
- LEAVE_GL();
} else {
- WARN("(%p) : Occlusion queries not supported, or wrong context. Returning 1.\n", This);
+ WARN("(%p) : Occlusion queries not supported. Returning 1.\n", This);
*data = 1;
res = S_OK;
}
@@ -324,7 +336,7 @@ static HRESULT WINAPI IWineD3DEventQueryImpl_GetData(IWineD3DQuery* iface, void
return S_OK;
} if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
/* See comment in IWineD3DQuery::Issue, event query codeblock */
- WARN("Query context not active, reporting GPU idle\n");
+ FIXME("Query context not active, reporting GPU idle\n");
*data = TRUE;
} else if(GL_SUPPORT(APPLE_FENCE)) {
ENTER_GL();
@@ -460,7 +472,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
WineD3DContext *ctx = ((WineQueryOcclusionData *)This->extendedData)->ctx;
if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
- WARN("Not the owning context, can't start query\n");
+ FIXME("Not the owning context, can't start query\n");
} else {
ENTER_GL();
/* This is allowed according to msdn and our tests. Reset the query and restart */
--
1.6.0.6
--------------080001050906010806000400--
More information about the wine-patches
mailing list