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 <robclark@freedesktop.org>
This commit is contained in:
parent
a262c601d3
commit
7297bdbd50
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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:
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue