Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Mon, Jul 27, 2015 at 3:49 AM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@redhat.com> > > This adds support for queries against the non-0 vertex streams. > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/drivers/radeon/r600_query.c | 18 ++++++++++++++++-- > src/gallium/drivers/radeon/r600d_common.h | 3 +++ > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/src/gallium/drivers/radeon/r600_query.c > b/src/gallium/drivers/radeon/r600_query.c > index a1d8241..f8072ea 100644 > --- a/src/gallium/drivers/radeon/r600_query.c > +++ b/src/gallium/drivers/radeon/r600_query.c > @@ -54,6 +54,8 @@ struct r600_query { > uint64_t end_result; > /* Fence for GPU_FINISHED. */ > struct pipe_fence_handle *fence; > + /* For transform feedback: which stream the query is for */ > + unsigned stream; > }; > > > @@ -155,6 +157,17 @@ static void r600_update_occlusion_query_state(struct > r600_common_context *rctx, > } > } > > +static unsigned event_type_for_stream(struct r600_query *query) > +{ > + switch (query->stream) { > + default: > + case 0: return EVENT_TYPE_SAMPLE_STREAMOUTSTATS; > + case 1: return EVENT_TYPE_SAMPLE_STREAMOUTSTATS1; > + case 2: return EVENT_TYPE_SAMPLE_STREAMOUTSTATS2; > + case 3: return EVENT_TYPE_SAMPLE_STREAMOUTSTATS3; > + } > +} > + > static void r600_emit_query_begin(struct r600_common_context *ctx, struct > r600_query *query) > { > struct radeon_winsys_cs *cs = ctx->rings.gfx.cs; > @@ -189,7 +202,7 @@ static void r600_emit_query_begin(struct > r600_common_context *ctx, struct r600_q > case PIPE_QUERY_SO_STATISTICS: > case PIPE_QUERY_SO_OVERFLOW_PREDICATE: > radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0)); > - radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SAMPLE_STREAMOUTSTATS) > | EVENT_INDEX(3)); > + radeon_emit(cs, EVENT_TYPE(event_type_for_stream(query)) | > EVENT_INDEX(3)); > radeon_emit(cs, va); > radeon_emit(cs, (va >> 32UL) & 0xFF); > break; > @@ -246,7 +259,7 @@ static void r600_emit_query_end(struct > r600_common_context *ctx, struct r600_que > case PIPE_QUERY_SO_OVERFLOW_PREDICATE: > va += query->buffer.results_end + query->result_size/2; > radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 2, 0)); > - radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SAMPLE_STREAMOUTSTATS) > | EVENT_INDEX(3)); > + radeon_emit(cs, EVENT_TYPE(event_type_for_stream(query)) | > EVENT_INDEX(3)); > radeon_emit(cs, va); > radeon_emit(cs, (va >> 32UL) & 0xFF); > break; > @@ -367,6 +380,7 @@ static struct pipe_query *r600_create_query(struct > pipe_context *ctx, unsigned q > /* NumPrimitivesWritten, PrimitiveStorageNeeded. */ > query->result_size = 32; > query->num_cs_dw = 6; > + query->stream = index; > break; > case PIPE_QUERY_PIPELINE_STATISTICS: > /* 11 values on EG, 8 on R600. */ > diff --git a/src/gallium/drivers/radeon/r600d_common.h > b/src/gallium/drivers/radeon/r600d_common.h > index 74c8d87..5a56a54 100644 > --- a/src/gallium/drivers/radeon/r600d_common.h > +++ b/src/gallium/drivers/radeon/r600d_common.h > @@ -66,6 +66,9 @@ > #define PKT3_SET_SH_REG 0x76 /* SI and later */ > #define PKT3_SET_UCONFIG_REG 0x79 /* CIK and later */ > > +#define EVENT_TYPE_SAMPLE_STREAMOUTSTATS1 0x1 /* EG and later */ > +#define EVENT_TYPE_SAMPLE_STREAMOUTSTATS2 0x2 /* EG and later */ > +#define EVENT_TYPE_SAMPLE_STREAMOUTSTATS3 0x3 /* EG and later */ > #define EVENT_TYPE_PS_PARTIAL_FLUSH 0x10 > #define EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT 0x14 > #define EVENT_TYPE_ZPASS_DONE 0x15 > -- > 2.4.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev