On 18.09.2017 17:22, Jan Vesely wrote:
On Wed, 2017-09-13 at 18:53 +0200, Nicolai Hähnle wrote:
From: Nicolai Hähnle <nicolai.haeh...@amd.com>

To be able to properly distinguish between GL_ANY_SAMPLES_PASSED
and GL_ANY_SAMPLES_PASSED_CONSERVATIVE.

This patch goes through all drivers, having them treat the two
query types identically, except:

1. radeon incorrectly enabled conservative mode on
    PIPE_QUERY_OCCLUSION_PREDICATE. We now do it correctly, only
    on PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE.
2. st/mesa uses the new query type.

Fixes dEQP-GLES31.functional.fbo.no_attachments.*
---
  src/gallium/auxiliary/util/u_dump_defines.c      |  1 +
  src/gallium/auxiliary/util/u_inlines.h           |  1 +
  src/gallium/docs/source/context.rst              |  6 ++++++
  src/gallium/drivers/freedreno/a3xx/fd3_query.c   |  8 ++++++++
  src/gallium/drivers/freedreno/a4xx/fd4_query.c   |  8 ++++++++
  src/gallium/drivers/freedreno/a5xx/fd5_query.c   | 10 ++++++++++
  src/gallium/drivers/freedreno/freedreno_query.h  |  1 +
  src/gallium/drivers/llvmpipe/lp_query.c          |  3 +++
  src/gallium/drivers/llvmpipe/lp_rast.c           |  2 ++
  src/gallium/drivers/llvmpipe/lp_setup.c          |  3 +++
  src/gallium/drivers/nouveau/nv30/nv30_query.c    |  4 +++-
  src/gallium/drivers/nouveau/nv50/nv50_query.c    |  1 +
  src/gallium/drivers/nouveau/nv50/nv50_query_hw.c |  4 ++++
  src/gallium/drivers/nouveau/nvc0/nvc0_query.c    |  1 +
  src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c |  7 ++++++-
  src/gallium/drivers/r300/r300_query.c            |  7 +++++--
  src/gallium/drivers/radeon/r600_pipe_common.c    |  3 ++-
  src/gallium/drivers/radeon/r600_query.c          | 19 ++++++++++++++-----
  src/gallium/drivers/softpipe/sp_query.c          |  4 ++++
  src/gallium/drivers/svga/svga_pipe_query.c       |  7 ++++++-
  src/gallium/drivers/swr/swr_query.cpp            |  1 +
  src/gallium/drivers/trace/tr_dump_state.c        |  1 +
  src/gallium/include/pipe/p_defines.h             |  2 ++
  src/mesa/state_tracker/st_cb_queryobj.c          |  5 ++++-
  24 files changed, 97 insertions(+), 12 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_dump_defines.c 
b/src/gallium/auxiliary/util/u_dump_defines.c
index 5032974a880..e87e5301600 100644
--- a/src/gallium/auxiliary/util/u_dump_defines.c
+++ b/src/gallium/auxiliary/util/u_dump_defines.c
@@ -358,20 +358,21 @@ util_tex_filter_short_names[] = {
     "linear"
  };
DEFINE_UTIL_STR_CONTINUOUS(tex_filter) static const char *
  util_query_type_names[] = {
     "PIPE_QUERY_OCCLUSION_COUNTER",
     "PIPE_QUERY_OCCLUSION_PREDICATE",
+   "PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE",
     "PIPE_QUERY_TIMESTAMP",
     "PIPE_QUERY_TIMESTAMP_DISJOINT",
     "PIPE_QUERY_TIME_ELAPSED",
     "PIPE_QUERY_PRIMITIVES_GENERATED",
     "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 e0ed594c9fe..79f62c32266 100644
--- a/src/gallium/auxiliary/util/u_inlines.h
+++ b/src/gallium/auxiliary/util/u_inlines.h
@@ -529,20 +529,21 @@ util_get_min_point_size(const struct 
pipe_rasterizer_state *state)
     return !state->point_quad_rasterization &&
            !state->point_smooth &&
            !state->multisample ? 1.0f : 0.0f;
  }
static inline void
  util_query_clear_result(union pipe_query_result *result, unsigned type)
  {
     switch (type) {
     case PIPE_QUERY_OCCLUSION_PREDICATE:
+   case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
     case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
     case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
     case PIPE_QUERY_GPU_FINISHED:
        result->b = FALSE;
        break;
     case PIPE_QUERY_OCCLUSION_COUNTER:
     case PIPE_QUERY_TIMESTAMP:
     case PIPE_QUERY_TIME_ELAPSED:
     case PIPE_QUERY_PRIMITIVES_GENERATED:
     case PIPE_QUERY_PRIMITIVES_EMITTED:
diff --git a/src/gallium/docs/source/context.rst 
b/src/gallium/docs/source/context.rst
index 6ac45819a66..ba7fef8301d 100644
--- a/src/gallium/docs/source/context.rst
+++ b/src/gallium/docs/source/context.rst
@@ -387,20 +387,26 @@ are written to the framebuffer without being culled by
  The result is an unsigned 64-bit integer.
  This query can be used with ``render_condition``.
In cases where a boolean result of an occlusion query is enough,
  ``PIPE_QUERY_OCCLUSION_PREDICATE`` should be used. It is just like
  ``PIPE_QUERY_OCCLUSION_COUNTER`` except that the result is a boolean
  value of FALSE for cases where COUNTER would result in 0 and TRUE
  for all other cases.
  This query can be used with ``render_condition``.
+In cases where a conservative approximation of an occlusion query is enough,
+``PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE`` should be used. It behaves
+like ``PIPE_QUERY_OCCLUSION_PREDICATE``, except that it may return TRUE in
+additional, implementation-dependent cases.
+This query can be used with ``render_condition``.
+
  ``PIPE_QUERY_TIME_ELAPSED`` returns the amount of time, in nanoseconds,
  the context takes to perform operations.
  The result is an unsigned 64-bit integer.
``PIPE_QUERY_TIMESTAMP`` returns a device/driver internal timestamp,
  scaled to nanoseconds, recorded after all commands issued prior to
  ``end_query`` have been processed.
  This query does not require a call to ``begin_query``.
  The result is an unsigned 64-bit integer.
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_query.c b/src/gallium/drivers/freedreno/a3xx/fd3_query.c
index cde42c37313..97a95b21546 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_query.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_query.c
@@ -124,22 +124,30 @@ static const struct fd_hw_sample_provider 
occlusion_counter = {
                .accumulate_result = occlusion_counter_accumulate_result,
  };
static const struct fd_hw_sample_provider occlusion_predicate = {
                .query_type = PIPE_QUERY_OCCLUSION_PREDICATE,
                .active = FD_STAGE_DRAW,
                .get_sample = occlusion_get_sample,
                .accumulate_result = occlusion_predicate_accumulate_result,
  };
+static const struct fd_hw_sample_provider occlusion_predicate_conservative = {
+               .query_type = PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE,
+               .active = FD_STAGE_DRAW,
+               .get_sample = occlusion_get_sample,
+               .accumulate_result = occlusion_predicate_accumulate_result,
+};
+
  void fd3_query_context_init(struct pipe_context *pctx)
  {
        struct fd_context *ctx = fd_context(pctx);
ctx->create_query = fd_hw_create_query;
        ctx->query_prepare = fd_hw_query_prepare;
        ctx->query_prepare_tile = fd_hw_query_prepare_tile;
        ctx->query_set_stage = fd_hw_query_set_stage;
fd_hw_query_register_provider(pctx, &occlusion_counter);
        fd_hw_query_register_provider(pctx, &occlusion_predicate);
+       fd_hw_query_register_provider(pctx, &occlusion_predicate_conservative);
  }
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_query.c 
b/src/gallium/drivers/freedreno/a4xx/fd4_query.c
index f7b385d552d..809e7570b48 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_query.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_query.c
@@ -244,20 +244,27 @@ static const struct fd_hw_sample_provider 
occlusion_counter = {
                .accumulate_result = occlusion_counter_accumulate_result,
  };
static const struct fd_hw_sample_provider occlusion_predicate = {
                .query_type = PIPE_QUERY_OCCLUSION_PREDICATE,
                .active = FD_STAGE_DRAW,
                .get_sample = occlusion_get_sample,
                .accumulate_result = occlusion_predicate_accumulate_result,
  };
+static const struct fd_hw_sample_provider occlusion_predicate = {

Guess this should have been 'fd_hw_sample_provider 
occlusion_predicate_conservative' ?
Otherwise it is the same struct name as above and breaks build.

Right, thanks for spotting this. I've pushed a one-line fix.

Cheers,
Nicolai


Jan

--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to