summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2014-11-24 22:59:21 +0100
committerAxel Davy <[email protected]>2014-12-03 16:39:24 +0100
commitb0302a95ece423f18a710dea391686e1a6557716 (patch)
treed2a86ce84ad84e2c2dd6ba7c00d285c7d4c9e937
parent6b35662e30ed873673e539f109a83117176b8bfd (diff)
st/nine: Queries: Use gallium caps to get if queries are supported. (v2)
Some queries need the driver to advertise a cap to be supported. For example r300 doesn't support them. v2 (David): check also for PIPE_CAP_QUERY_PIPELINE_STATISTICS, fix wine tests on r300g Reviewed-by: Ilia Mirkin <[email protected]> Reviewed-by: David Heidelberg <[email protected]> Signed-off-by: Axel Davy <[email protected]>
-rw-r--r--src/gallium/state_trackers/nine/device9.c2
-rw-r--r--src/gallium/state_trackers/nine/query9.c43
-rw-r--r--src/gallium/state_trackers/nine/query9.h2
3 files changed, 24 insertions, 23 deletions
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index c16f7284799..e9599b853c0 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -3359,7 +3359,7 @@ NineDevice9_CreateQuery( struct NineDevice9 *This,
DBG("This=%p Type=%d ppQuery=%p\n", This, Type, ppQuery);
- hr = nine_is_query_supported(Type);
+ hr = nine_is_query_supported(This->screen, Type);
if (!ppQuery || hr != D3D_OK)
return hr;
diff --git a/src/gallium/state_trackers/nine/query9.c b/src/gallium/state_trackers/nine/query9.c
index 5e301442dea..17c36e510fc 100644
--- a/src/gallium/state_trackers/nine/query9.c
+++ b/src/gallium/state_trackers/nine/query9.c
@@ -23,34 +23,35 @@
#include "device9.h"
#include "query9.h"
#include "nine_helpers.h"
+#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "util/u_math.h"
#include "nine_dump.h"
#define DBG_CHANNEL DBG_QUERY
-#define QUERY_TYPE_MAP_CASE(a, b) case D3DQUERYTYPE_##a: return PIPE_QUERY_##b
static inline unsigned
-d3dquerytype_to_pipe_query(D3DQUERYTYPE type)
+d3dquerytype_to_pipe_query(struct pipe_screen *screen, D3DQUERYTYPE type)
{
switch (type) {
- QUERY_TYPE_MAP_CASE(EVENT, GPU_FINISHED);
- QUERY_TYPE_MAP_CASE(OCCLUSION, OCCLUSION_COUNTER);
- QUERY_TYPE_MAP_CASE(TIMESTAMP, TIMESTAMP);
- QUERY_TYPE_MAP_CASE(TIMESTAMPDISJOINT, TIMESTAMP_DISJOINT);
- QUERY_TYPE_MAP_CASE(TIMESTAMPFREQ, TIMESTAMP_DISJOINT);
- QUERY_TYPE_MAP_CASE(VERTEXSTATS, PIPELINE_STATISTICS);
- case D3DQUERYTYPE_VCACHE:
- case D3DQUERYTYPE_RESOURCEMANAGER:
- case D3DQUERYTYPE_PIPELINETIMINGS:
- case D3DQUERYTYPE_INTERFACETIMINGS:
- case D3DQUERYTYPE_VERTEXTIMINGS:
- case D3DQUERYTYPE_PIXELTIMINGS:
- case D3DQUERYTYPE_BANDWIDTHTIMINGS:
- case D3DQUERYTYPE_CACHEUTILIZATION:
- return PIPE_QUERY_TYPES;
+ case D3DQUERYTYPE_EVENT:
+ return PIPE_QUERY_GPU_FINISHED;
+ case D3DQUERYTYPE_OCCLUSION:
+ return screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY) ?
+ PIPE_QUERY_OCCLUSION_COUNTER : PIPE_QUERY_TYPES;
+ case D3DQUERYTYPE_TIMESTAMP:
+ return screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP) ?
+ PIPE_QUERY_TIMESTAMP : PIPE_QUERY_TYPES;
+ case D3DQUERYTYPE_TIMESTAMPDISJOINT:
+ case D3DQUERYTYPE_TIMESTAMPFREQ:
+ return screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP) ?
+ PIPE_QUERY_TIMESTAMP_DISJOINT : PIPE_QUERY_TYPES;
+ case D3DQUERYTYPE_VERTEXSTATS:
+ return screen->get_param(screen,
+ PIPE_CAP_QUERY_PIPELINE_STATISTICS) ?
+ PIPE_QUERY_PIPELINE_STATISTICS : PIPE_QUERY_TYPES;
default:
- return ~0;
+ return PIPE_QUERY_TYPES; /* Query not supported */
}
}
@@ -73,9 +74,9 @@ nine_query_result_size(D3DQUERYTYPE type)
}
HRESULT
-nine_is_query_supported(D3DQUERYTYPE type)
+nine_is_query_supported(struct pipe_screen *screen, D3DQUERYTYPE type)
{
- const unsigned ptype = d3dquerytype_to_pipe_query(type);
+ const unsigned ptype = d3dquerytype_to_pipe_query(screen, type);
user_assert(ptype != ~0, D3DERR_INVALIDCALL);
@@ -93,7 +94,7 @@ NineQuery9_ctor( struct NineQuery9 *This,
D3DQUERYTYPE Type )
{
struct pipe_context *pipe = pParams->device->pipe;
- const unsigned ptype = d3dquerytype_to_pipe_query(Type);
+ const unsigned ptype = d3dquerytype_to_pipe_query(pParams->device->screen, Type);
HRESULT hr;
DBG("This=%p pParams=%p Type=%d\n", This, pParams, Type);
diff --git a/src/gallium/state_trackers/nine/query9.h b/src/gallium/state_trackers/nine/query9.h
index abd43521862..ad1ca50f26d 100644
--- a/src/gallium/state_trackers/nine/query9.h
+++ b/src/gallium/state_trackers/nine/query9.h
@@ -48,7 +48,7 @@ NineQuery9( void *data )
}
HRESULT
-nine_is_query_supported(D3DQUERYTYPE);
+nine_is_query_supported(struct pipe_screen *screen, D3DQUERYTYPE);
HRESULT
NineQuery9_new( struct NineDevice9 *Device,