diff options
author | Axel Davy <[email protected]> | 2014-11-24 22:59:21 +0100 |
---|---|---|
committer | Axel Davy <[email protected]> | 2014-12-03 16:39:24 +0100 |
commit | b0302a95ece423f18a710dea391686e1a6557716 (patch) | |
tree | d2a86ce84ad84e2c2dd6ba7c00d285c7d4c9e937 /src/gallium/state_trackers/nine/query9.c | |
parent | 6b35662e30ed873673e539f109a83117176b8bfd (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]>
Diffstat (limited to 'src/gallium/state_trackers/nine/query9.c')
-rw-r--r-- | src/gallium/state_trackers/nine/query9.c | 43 |
1 files changed, 22 insertions, 21 deletions
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); |