[Mesa-dev] [PATCH 01/13] gallium: add PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE and corresponding cap

Roland Scheidegger sroland at vmware.com
Thu Jul 27 21:17:09 UTC 2017


Am 27.07.2017 um 21:14 schrieb Nicolai Hähnle:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> ---
>  src/gallium/auxiliary/util/u_dump_defines.c      | 1 +
>  src/gallium/auxiliary/util/u_inlines.h           | 1 +
>  src/gallium/docs/source/context.rst              | 9 +++++++--
>  src/gallium/docs/source/screen.rst               | 2 ++
>  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, 30 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..2747c29 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -428,9 +428,14 @@ 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 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``. It is indexed by the
> +stream number.
> +
> +``PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE`` behaves like
> +``PIPE_QUERY_SO_OVERFLOW_PREDICATE``, except it returns a boolean value
> +indicating whether any of the streams have overflowed.
>  
>  ``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 32da228..4b88f59 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -396,6 +396,8 @@ The integer capabilities:
>    ``TGSI_PROPERTY_FS_POST_DEPTH_COVERAGE`` is supported.
>  * ``PIPE_CAP_BINDLESS_TEXTURE``: Whether bindless texture operations are
>    supported.
> +* ``PIPE_CAP_QUERY_SO_OVERFLOW_ANY``: Whether the
> +  ``PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE`` query is supported.
Shouldn't the cap actually be for both types of so overflow queries? The
other one doesn't have a cap bit, and it's the same GL extension.
(Some drivers, like llvmpipe, don't support multiple streams but
implement (a non-indexed really) PIPE_QUERY_SO_OVERFLOW_PREDICATE - they
could easily support the ANY query too since there's not really any
difference if there's just one stream.)
Albeit I'm actually wondering if the existing query shouldn't really be
the non-indexed one, and the new one should have STREAM in the name. I
think that would be less confusing. Also, the
ARB_transform_feedback_overflow_query spec says only the
TRANSFORM_FEEDBACK_OVERFLOW_ARB query is valid if
arb_transform_feedback3 is available. (It is, though, perfectly valid to
support arb_transform_feedback3 with just 1 vertex stream...)
So, imho the cap bit should just indicate if so_overflow queries are
supported, and if so without
STREAM_OUTPUT_INTERLEAVE_BUFFERINTERLEAVE_BUFFER (which governs arb_tf3)
only PIPE_QUERY_SO_OVERFLOW_PREDICATE needs to be supported, otherwise
PIPE_QUERY_SO_OVERFLOW_STREAM_PREDICATE too.
(drivers which only support one stream should be easily able to
implement the per-stream query trivially as it should be the same as the
all-stream query.)

Roland


>  
>  
>  .. _pipe_capf:
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 129b0cd..56514b2 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -260,6 +260,7 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        return 0;
>  
>     /* Stream output. */
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index a915d65..0247b06 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -321,6 +321,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>  	case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>  	case PIPE_CAP_POST_DEPTH_COVERAGE:
>  	case PIPE_CAP_BINDLESS_TEXTURE:
> +	case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>  		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 4ad98e2..72d7f16 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -310,6 +310,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>     case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 e98e30d..7241876 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -356,6 +356,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 a352ff5..3ac66ec 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -220,6 +220,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 78e11cf..f1a2863 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -272,6 +272,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 8bbe403..f1ec656 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -301,6 +301,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_INT64_DIVMOD:
>     case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 5cdb248..8812847 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -242,6 +242,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>          case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>          case PIPE_CAP_POST_DEPTH_COVERAGE:
>          case PIPE_CAP_BINDLESS_TEXTURE:
> +        case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>              return 0;
>  
>          /* SWTCL-only features. */
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index f0ea409..02c1113 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -398,6 +398,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>  	case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
>  	case PIPE_CAP_POST_DEPTH_COVERAGE:
>  	case PIPE_CAP_BINDLESS_TEXTURE:
> +	case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>  		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 2b0f9d3..458b218 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -598,6 +598,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_ANY:
>  		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 5c96a14..07e584b 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -306,6 +306,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 77223c9..b7ad7b8 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -450,6 +450,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        return 0;
>     }
>  
> diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp
> index 952ae0c..82c92e3 100644
> --- a/src/gallium/drivers/swr/swr_screen.cpp
> +++ b/src/gallium/drivers/swr/swr_screen.cpp
> @@ -339,6 +339,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 f3b47ca..554fbaa 100644
> --- a/src/gallium/drivers/vc4/vc4_screen.c
> +++ b/src/gallium/drivers/vc4/vc4_screen.c
> @@ -261,6 +261,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>  	case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>          case PIPE_CAP_POST_DEPTH_COVERAGE:
>          case PIPE_CAP_BINDLESS_TEXTURE:
> +        case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>                  return 0;
>  
>                  /* Stream output. */
> diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
> index 5df0840..3ea2686 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -265,6 +265,7 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
>     case PIPE_CAP_BINDLESS_TEXTURE:
> +   case PIPE_CAP_QUERY_SO_OVERFLOW_ANY:
>        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 2ccdf44..d1de80a 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,
> @@ -780,6 +781,7 @@ enum pipe_cap
>     PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION,
>     PIPE_CAP_POST_DEPTH_COVERAGE,
>     PIPE_CAP_BINDLESS_TEXTURE,
> +   PIPE_CAP_QUERY_SO_OVERFLOW_ANY,
>  };
>  
>  #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
> @@ -951,6 +953,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