diff options
author | Rob Clark <[email protected]> | 2014-10-03 12:48:31 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2014-10-03 14:19:52 -0400 |
commit | 7297bdbd50eb039878fe9e472dc736e1259710fb (patch) | |
tree | 053bf7c1259f187b79ad300c1ca87f4ef12d661a /src/gallium/drivers/freedreno | |
parent | a262c601d363aea2e6680df527e207cc9d5e235f (diff) |
freedreno: query fixes
Fixes a few issues, including a potential empty-IB (which triggers gpu
hangs in piglit occlusion_query_meta_no_fragments)
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_query.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_query_hw.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_util.h | 6 |
3 files changed, 13 insertions, 8 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_query.c b/src/gallium/drivers/freedreno/a3xx/fd3_query.c index 34e0b5adbd1..bc3a3ec69c7 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_query.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_query.c @@ -119,14 +119,14 @@ occlusion_predicate_accumulate_result(struct fd_context *ctx, static const struct fd_hw_sample_provider occlusion_counter = { .query_type = PIPE_QUERY_OCCLUSION_COUNTER, - .active = FD_STAGE_DRAW, /* | FD_STAGE_CLEAR ??? */ + .active = FD_STAGE_DRAW, .get_sample = occlusion_get_sample, .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, /* | FD_STAGE_CLEAR ??? */ + .active = FD_STAGE_DRAW, .get_sample = occlusion_get_sample, .accumulate_result = occlusion_predicate_accumulate_result, }; diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.c b/src/gallium/drivers/freedreno/freedreno_query_hw.c index 38bd3dedad4..b29f9d409ce 100644 --- a/src/gallium/drivers/freedreno/freedreno_query_hw.c +++ b/src/gallium/drivers/freedreno/freedreno_query_hw.c @@ -183,12 +183,16 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q, return false; /* if the app tries to read back the query result before the - * back is submitted, that forces us to flush so that there + * batch is submitted, that forces us to flush so that there * are actually results to wait for: */ if (!LIST_IS_EMPTY(&hq->list)) { + /* if app didn't actually trigger any cmdstream, then + * we have nothing to do: + */ + if (!ctx->needs_flush) + return true; DBG("reading query result forces flush!"); - ctx->needs_flush = true; fd_context_render(&ctx->base); } @@ -201,9 +205,6 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q, assert(LIST_IS_EMPTY(&hq->current_periods)); assert(!hq->period); - if (LIST_IS_EMPTY(&hq->periods)) - return true; - /* if !wait, then check the last sample (the one most likely to * not be ready yet) and bail if it is not ready: */ diff --git a/src/gallium/drivers/freedreno/freedreno_util.h b/src/gallium/drivers/freedreno/freedreno_util.h index a762c8f0575..f1a1e6e7c55 100644 --- a/src/gallium/drivers/freedreno/freedreno_util.h +++ b/src/gallium/drivers/freedreno/freedreno_util.h @@ -209,6 +209,10 @@ static inline void OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, struct fd_ringmarker *end) { + uint32_t dwords = fd_ringmarker_dwords(start, end); + + assert(dwords > 0); + /* for debug after a lock up, write a unique counter value * to scratch6 for each IB, to make it easier to match up * register dumps to cmdstream. The combination of IB and @@ -219,7 +223,7 @@ OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start, OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2); fd_ringbuffer_emit_reloc_ring(ring, start, end); - OUT_RING(ring, fd_ringmarker_dwords(start, end)); + OUT_RING(ring, dwords); emit_marker(ring, 6); } |