[Mesa-dev] [PATCH 09/11] st/nine: Rework queries

Marek Olšák maraeo at gmail.com
Tue Nov 25 03:42:20 PST 2014


Calling pipe->flush is unnecessary before get_query_result, because
get_query_result flushes automatically if it has to (at least on
radeon).

Marek

On Sun, Nov 23, 2014 at 11:40 PM, David Heidelberg <david at ixit.cz> wrote:
> From: Axel Davy <axel.davy at ens.fr>
>
> From this moment we should handle errors same way as Wine does.
>
> Original patch from John Ettedgui <john.ettedgui at gmail.com>
>
> Cc: "10.4" <mesa-stable at lists.freedesktop.org>
> Tested-by: David Heidelberg <david at ixit.cz>
> Signed-off-by: Axel Davy <axel.davy at ens.fr>
> ---
>  src/gallium/state_trackers/nine/query9.c | 66 +++++++++++++++++++++-----------
>  1 file changed, 44 insertions(+), 22 deletions(-)
>
> diff --git a/src/gallium/state_trackers/nine/query9.c b/src/gallium/state_trackers/nine/query9.c
> index 908420c..34dfec7 100644
> --- a/src/gallium/state_trackers/nine/query9.c
> +++ b/src/gallium/state_trackers/nine/query9.c
> @@ -123,6 +123,15 @@ NineQuery9_ctor( struct NineQuery9 *This,
>          if (!This->pq)
>              return E_OUTOFMEMORY;
>      } else {
> +        /* we have a fallback when app create a query that is
> +           not supported. Wine has different behaviour. It won't fill the
> +           pointer with a valid NineQuery9, but let it NULL and return error.
> +           However even if driver doesn't support D3DQUERYTYPE_EVENT, it
> +           will say it is supported and have a fallback for it. Since we
> +           support more queries than wine we may hit different rendering paths
> +           than it, so perhaps these fallbacks are required.
> +           TODO: someone with a lot of different games should try to see
> +           if these dummy queries are needed. */
>          DBG("Returning dummy NineQuery9 for %s.\n",
>              nine_D3DQUERYTYPE_to_str(Type));
>      }
> @@ -174,10 +183,15 @@ NineQuery9_Issue( struct NineQuery9 *This,
>
>      DBG("This=%p dwIssueFlags=%d\n", This, dwIssueFlags);
>
> -    user_assert((dwIssueFlags == D3DISSUE_BEGIN && !This->instant) ||
> +    user_assert((dwIssueFlags == D3DISSUE_BEGIN) ||
>                  (dwIssueFlags == 0) ||
>                  (dwIssueFlags == D3DISSUE_END), D3DERR_INVALIDCALL);
>
> +    /* Wine tests: always return D3D_OK on D3DISSUE_BEGIN
> +     * even when the call is supposed to be forbidden */
> +    if (dwIssueFlags == D3DISSUE_BEGIN && This->instant)
> +        return D3D_OK;
> +
>      if (!This->pq) {
>          DBG("Issued dummy query.\n");
>          return D3D_OK;
> @@ -185,15 +199,17 @@ NineQuery9_Issue( struct NineQuery9 *This,
>
>      if (dwIssueFlags == D3DISSUE_BEGIN) {
>          if (This->state == NINE_QUERY_STATE_RUNNING) {
> -           pipe->end_query(pipe, This->pq);
> -       }
> +            pipe->end_query(pipe, This->pq);
> +        }
>          pipe->begin_query(pipe, This->pq);
>          This->state = NINE_QUERY_STATE_RUNNING;
>      } else {
> -        if (This->state == NINE_QUERY_STATE_RUNNING) {
> -            pipe->end_query(pipe, This->pq);
> -            This->state = NINE_QUERY_STATE_ENDED;
> -       }
> +        if (This->state != NINE_QUERY_STATE_RUNNING &&
> +            This->type != D3DQUERYTYPE_EVENT &&
> +            This->type != D3DQUERYTYPE_TIMESTAMP)
> +            pipe->begin_query(pipe, This->pq);
> +        pipe->end_query(pipe, This->pq);
> +        This->state = NINE_QUERY_STATE_ENDED;
>      }
>      return D3D_OK;
>  }
> @@ -220,7 +236,7 @@ NineQuery9_GetData( struct NineQuery9 *This,
>                      DWORD dwGetDataFlags )
>  {
>      struct pipe_context *pipe = This->base.device->pipe;
> -    boolean ok = !This->pq;
> +    boolean ok, should_flush, should_wait;
>      unsigned i;
>      union pipe_query_result presult;
>      union nine_query_result nresult;
> @@ -235,22 +251,28 @@ NineQuery9_GetData( struct NineQuery9 *This,
>
>      if (!This->pq) {
>          DBG("No pipe query available.\n");
> -        if (!dwSize)
> -           return S_OK;
> -    }
> -    if (This->state == NINE_QUERY_STATE_FRESH)
> -        return S_OK;
> +    } else {
> +        should_flush = dwGetDataFlags && This->state != NINE_QUERY_STATE_FLUSHED;
> +        /* Wine tests: D3DQUERYTYPE_TIMESTAMP always succeeds
> +         * directly when flushed */
> +        should_wait = dwGetDataFlags && This->type == D3DQUERYTYPE_TIMESTAMP;
> +
> +        if (This->state == NINE_QUERY_STATE_FRESH) {
> +            /* App forgot issue the request. Be nice and issue it. */
> +            (void) NineQuery9_Issue(This, D3DISSUE_END);
> +            /* Wine tests: we have to succeed. */
> +            should_flush = TRUE;
> +            should_wait = TRUE;
> +        }
>
> -    if (!ok) {
> -        ok = pipe->get_query_result(pipe, This->pq, FALSE, &presult);
> -        if (!ok) {
> -            if (dwGetDataFlags) {
> -                if (This->state != NINE_QUERY_STATE_FLUSHED)
> -                    pipe->flush(pipe, NULL, 0);
> -                This->state = NINE_QUERY_STATE_FLUSHED;
> -            }
> -            return S_FALSE;
> +        if (should_flush) {
> +            pipe->flush(pipe, NULL, 0);
> +            This->state = NINE_QUERY_STATE_FLUSHED;
>          }
> +
> +        ok = pipe->get_query_result(pipe, This->pq, should_wait, &presult);
> +        if (!ok)
> +            return S_FALSE;
>      }
>      if (!dwSize)
>          return S_OK;
> --
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list