From b0302a95ece423f18a710dea391686e1a6557716 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Mon, 24 Nov 2014 22:59:21 +0100 Subject: 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 Reviewed-by: David Heidelberg Signed-off-by: Axel Davy --- src/gallium/state_trackers/nine/device9.c | 2 +- src/gallium/state_trackers/nine/query9.c | 43 ++++++++++++++++--------------- src/gallium/state_trackers/nine/query9.h | 2 +- 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, -- cgit v1.2.3