wined3d: Fake occlusion queries if the wrong context is active.
This commit is contained in:
parent
a99907d1d2
commit
e184b09a66
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1460,6 +1460,7 @@ extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl;
|
|||
/* Datastructures for IWineD3DQueryImpl.extendedData */
|
||||
typedef struct WineQueryOcclusionData {
|
||||
GLuint queryId;
|
||||
WineD3DContext *ctx;
|
||||
} WineQueryOcclusionData;
|
||||
|
||||
typedef struct WineQueryEventData {
|
||||
|
|
Loading…
Reference in New Issue