[Mesa-dev] [PATCH v2] gallium: add PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE and corresponding cap

Roland Scheidegger sroland at vmware.com
Mon Jul 31 22:39:10 UTC 2017


Am 31.07.2017 um 18:36 schrieb Nicolai Hähnle:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> v2: rename cap to PIPE_CAP_QUERY_SO_OVERFLOW and be a bit more explicit
>     in the documentation
> ---
> 
> I decided to keep the query names as they were, to avoid any possibility
> of regression. Perhaps the non-ANY query could separate be renamed to
> PIPE_QUERY_SO_OVERFLOW_STREAM_PREDICATE, but that seemed like excessive
> churn to me.
> 
> I did take most of the proposed doc update, though, and renamed the cap.
> 
> Cheers,
> Nicolai
> ---
>  src/gallium/auxiliary/util/u_dump_defines.c      |  1 +
>  src/gallium/auxiliary/util/u_inlines.h           |  1 +
>  src/gallium/docs/source/context.rst              | 12 ++++++++++--
>  src/gallium/docs/source/screen.rst               |  6 ++++++
>  src/gallium/drivers/etnaviv/etnaviv_screen.c     |  1 +
>  src/gallium/drivers/freedreno/freedreno_screen.c |  1 +
>  src/gallium/drivers/i915/i915_screen.c           |  1 +
>  src/gallium/drivers/llvmpipe/lp_screen.c         |  1 +
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   |  1 +
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   |  1 +
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   |  1 +
>  src/gallium/drivers/r300/r300_screen.c           |  1 +
>  src/gallium/drivers/r600/r600_pipe.c             |  1 +
>  src/gallium/drivers/radeonsi/si_pipe.c           |  1 +
>  src/gallium/drivers/softpipe/sp_screen.c         |  1 +
>  src/gallium/drivers/svga/svga_screen.c           |  1 +
>  src/gallium/drivers/swr/swr_screen.cpp           |  1 +
>  src/gallium/drivers/trace/tr_dump_state.c        |  1 +
>  src/gallium/drivers/vc4/vc4_screen.c             |  1 +
>  src/gallium/drivers/virgl/virgl_screen.c         |  1 +
>  src/gallium/include/pipe/p_defines.h             |  3 +++
>  21 files changed, 37 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/util/u_dump_defines.c b/src/gallium/auxiliary/util/u_dump_defines.c
> index 9d831ef..9126feb 100644
> --- a/src/gallium/auxiliary/util/u_dump_defines.c
> +++ b/src/gallium/auxiliary/util/u_dump_defines.c
> @@ -372,6 +372,7 @@ util_dump_query_type_names[] = {
>     "PIPE_QUERY_PRIMITIVES_EMITTED",
>     "PIPE_QUERY_SO_STATISTICS",
>     "PIPE_QUERY_SO_OVERFLOW_PREDICATE",
> +   "PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE",
>     "PIPE_QUERY_GPU_FINISHED",
>     "PIPE_QUERY_PIPELINE_STATISTICS",
>  };
> diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h
> index d57f61e..e0ed594 100644
> --- a/src/gallium/auxiliary/util/u_inlines.h
> +++ b/src/gallium/auxiliary/util/u_inlines.h
> @@ -537,6 +537,7 @@ util_query_clear_result(union pipe_query_result *result, unsigned type)
>     switch (type) {
>     case PIPE_QUERY_OCCLUSION_PREDICATE:
>     case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
> +   case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
>     case PIPE_QUERY_GPU_FINISHED:
>        result->b = FALSE;
>        break;
> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
> index a46131c..7002802 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -428,9 +428,17 @@ XXX the 2nd value is equivalent to ``PIPE_QUERY_PRIMITIVES_GENERATED`` but it is
>  unclear if it should be increased if stream output is not active.
>  
>  ``PIPE_QUERY_SO_OVERFLOW_PREDICATE`` returns a boolean value indicating
> -whether the stream output targets have overflowed as a result of the
> +whether a selected stream output target has overflowed as a result of the
>  commands issued between ``begin_query`` and ``end_query``.
> -This query can be used with ``render_condition``.
> +This query can be used with ``render_condition``. The output stream is
> +selected by the stream number passed to ``create_query``.
> +
> +``PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE`` returns a boolean value indicating
> +whether any stream output target has overflowed as a result of the commands
> +issued between ``begin_query`` and ``end_query``. This query can be used
> +with ``render_condition``, and its result is the logical OR of multiple
> +``PIPE_QUERY_SO_OVERFLOW_PREDICATE`` queries, one for each stream output
> +target.
>  
>  ``PIPE_QUERY_GPU_FINISHED`` returns a boolean value indicating whether
>  all commands issued before ``end_query`` have completed. However, this
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index ee7accb..88d27c2 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -398,6 +398,12 @@ The integer capabilities:
>    supported.
>  * ``PIPE_CAP_NIR_SAMPLERS_AS_DEREF``: Whether NIR tex instructions should
>    reference texture and sampler as NIR derefs instead of by indices.
> +* ``PIPE_CAP_QUERY_SO_OVERFLOW``: Whether the
> +  ``PIPE_QUERY_SO_OVERFLOW_PREDICATE`` and
> +  ``PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE`` query types are supported. Note that
> +  for a driver that does not support multiple output streams (i.e., it does not
> +  have ``PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS``), both query types are
> +  identical.

This wording is incorrect. PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS
only determines if ARB_tf3 is supported. As per the overflow so query
spec, if this isn't supported, then we should only ever see the ANY
query (but yes, mesa core doesn't check for this), and the per-stream
query does not need really need to be supported.
Multiple streams has its own cap bit, PIPE_CAP_MAX_VERTEX_STREAMS,
therefore if this is one the queries are the same (and both query types
must be supported if PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS is
supported).

With this wording fixed somehow (well I suppose only really the right
cap bit needs to be mentioned, we can easily require all drivers to
support both queries)
Reviewed-by: Roland Scheidegger <sroland at vmware.com>

(And yes, drivers only supporting the existing indexed query but
thinking it's really non-indexed, while also supporting just one stream
like llvmpipe should be fixed to just say this feature is supported and
both queries treated the same.)

>  
>  
>  .. _pipe_capf:
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 0e3d5d8..65aab83 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -261,6 +261,7 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     /* Stream output. */
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index c5772d2..2a1b1e7 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -322,6 +322,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>  	case PIPE_CAP_POST_DEPTH_COVERAGE:
>  	case PIPE_CAP_BINDLESS_TEXTURE:
>  	case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +	case PIPE_CAP_QUERY_SO_OVERFLOW:
>  		return 0;
>  
>  	case PIPE_CAP_MAX_VIEWPORTS:
> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
> index 3a0dade..f16141b 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -311,6 +311,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     case PIPE_CAP_MAX_VIEWPORTS:
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index 08edc08..fc4441f 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -357,6 +357,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>     }
>     /* should only get here on unhandled cases */
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> index 570a5d4..0b2e35b 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -221,6 +221,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index fbda514..8862967 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -273,6 +273,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index 6a7a575..3b3b381 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -302,6 +302,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index a994a05..c78c484 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -243,6 +243,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>          case PIPE_CAP_POST_DEPTH_COVERAGE:
>          case PIPE_CAP_BINDLESS_TEXTURE:
>          case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +        case PIPE_CAP_QUERY_SO_OVERFLOW:
>              return 0;
>  
>          /* SWTCL-only features. */
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index f09e468..0f30d09 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -399,6 +399,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>  	case PIPE_CAP_POST_DEPTH_COVERAGE:
>  	case PIPE_CAP_BINDLESS_TEXTURE:
>  	case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +	case PIPE_CAP_QUERY_SO_OVERFLOW:
>  		return 0;
>  
>  	case PIPE_CAP_DOUBLES:
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 877c23b..2904127 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -603,6 +603,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>  	case PIPE_CAP_UMA:
>  	case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
>  	case PIPE_CAP_POST_DEPTH_COVERAGE:
> +	case PIPE_CAP_QUERY_SO_OVERFLOW:
>  		return 0;
>  
>  	case PIPE_CAP_QUERY_BUFFER_OBJECT:
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
> index 6ed2ce1..5b387bb 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -307,6 +307,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>     case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>        return 4;
> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
> index fd849db..9849fe3 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -451,6 +451,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>     }
>  
> diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp
> index f44f583..1013403 100644
> --- a/src/gallium/drivers/swr/swr_screen.cpp
> +++ b/src/gallium/drivers/swr/swr_screen.cpp
> @@ -340,6 +340,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> diff --git a/src/gallium/drivers/trace/tr_dump_state.c b/src/gallium/drivers/trace/tr_dump_state.c
> index 41f7faf..0650f63 100644
> --- a/src/gallium/drivers/trace/tr_dump_state.c
> +++ b/src/gallium/drivers/trace/tr_dump_state.c
> @@ -879,6 +879,7 @@ trace_dump_query_result(unsigned query_type,
>     switch (query_type) {
>     case PIPE_QUERY_OCCLUSION_PREDICATE:
>     case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
> +   case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
>     case PIPE_QUERY_GPU_FINISHED:
>        trace_dump_bool(result->b);
>        break;
> diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
> index f5e913a..8a5c0fd 100644
> --- a/src/gallium/drivers/vc4/vc4_screen.c
> +++ b/src/gallium/drivers/vc4/vc4_screen.c
> @@ -262,6 +262,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>          case PIPE_CAP_POST_DEPTH_COVERAGE:
>          case PIPE_CAP_BINDLESS_TEXTURE:
>          case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +        case PIPE_CAP_QUERY_SO_OVERFLOW:
>                  return 0;
>  
>                  /* Stream output. */
> diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
> index e155b4a..07e09d8 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -266,6 +266,7 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
>     case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW:
>        return 0;
>     case PIPE_CAP_VENDOR_ID:
>        return 0x1af4;
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index b39612f..5a5b03c 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -546,6 +546,7 @@ enum pipe_query_type {
>     PIPE_QUERY_PRIMITIVES_EMITTED,
>     PIPE_QUERY_SO_STATISTICS,
>     PIPE_QUERY_SO_OVERFLOW_PREDICATE,
> +   PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE,
>     PIPE_QUERY_GPU_FINISHED,
>     PIPE_QUERY_PIPELINE_STATISTICS,
>     PIPE_QUERY_TYPES,
> @@ -781,6 +782,7 @@ enum pipe_cap
>     PIPE_CAP_POST_DEPTH_COVERAGE,
>     PIPE_CAP_BINDLESS_TEXTURE,
>     PIPE_CAP_NIR_SAMPLERS_AS_DEREF,
> +   PIPE_CAP_QUERY_SO_OVERFLOW,
>  };
>  
>  #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
> @@ -952,6 +954,7 @@ union pipe_query_result
>  {
>     /* PIPE_QUERY_OCCLUSION_PREDICATE */
>     /* PIPE_QUERY_SO_OVERFLOW_PREDICATE */
> +   /* PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE */
>     /* PIPE_QUERY_GPU_FINISHED */
>     boolean b;
>  
> 



More information about the mesa-dev mailing list