2017-10-30 17:17 GMT+01:00 Wladimir J. van der Laan <laa...@gmail.com>: > Want to be able to emit state from the texture implementation. > > Signed-off-by: Wladimir J. van der Laan <laa...@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmei...@gmail.com> > --- > src/gallium/drivers/etnaviv/etnaviv_emit.c | 83 > ------------------------------ > src/gallium/drivers/etnaviv/etnaviv_emit.h | 83 > ++++++++++++++++++++++++++++++ > 2 files changed, 83 insertions(+), 83 deletions(-) > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c > b/src/gallium/drivers/etnaviv/etnaviv_emit.c > index bc0f567..b766005 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c > @@ -44,12 +44,6 @@ > #include "hw/state_blt.xml.h" > #include "util/u_math.h" > > -struct etna_coalesce { > - uint32_t start; > - uint32_t last_reg; > - uint32_t last_fixp; > -}; > - > /* Queue a STALL command (queues 2 words) */ > static inline void > CMD_STALL(struct etna_cmd_stream *stream, uint32_t from, uint32_t to) > @@ -88,83 +82,6 @@ etna_stall(struct etna_cmd_stream *stream, uint32_t from, > uint32_t to) > } > } > > -static void > -etna_coalesce_start(struct etna_cmd_stream *stream, > - struct etna_coalesce *coalesce) > -{ > - coalesce->start = etna_cmd_stream_offset(stream); > - coalesce->last_reg = 0; > - coalesce->last_fixp = 0; > -} > - > -static void > -etna_coalesce_end(struct etna_cmd_stream *stream, > - struct etna_coalesce *coalesce) > -{ > - uint32_t end = etna_cmd_stream_offset(stream); > - uint32_t size = end - coalesce->start; > - > - if (size) { > - uint32_t offset = coalesce->start - 1; > - uint32_t value = etna_cmd_stream_get(stream, offset); > - > - value |= VIV_FE_LOAD_STATE_HEADER_COUNT(size); > - etna_cmd_stream_set(stream, offset, value); > - } > - > - /* append needed padding */ > - if (end % 2 == 1) > - etna_cmd_stream_emit(stream, 0xdeadbeef); > -} > - > -static void > -check_coalsence(struct etna_cmd_stream *stream, struct etna_coalesce > *coalesce, > - uint32_t reg, uint32_t fixp) > -{ > - if (coalesce->last_reg != 0) { > - if (((coalesce->last_reg + 4) != reg) || (coalesce->last_fixp != > fixp)) { > - etna_coalesce_end(stream, coalesce); > - etna_emit_load_state(stream, reg >> 2, 0, fixp); > - coalesce->start = etna_cmd_stream_offset(stream); > - } > - } else { > - etna_emit_load_state(stream, reg >> 2, 0, fixp); > - coalesce->start = etna_cmd_stream_offset(stream); > - } > - > - coalesce->last_reg = reg; > - coalesce->last_fixp = fixp; > -} > - > -static inline void > -etna_coalsence_emit(struct etna_cmd_stream *stream, > - struct etna_coalesce *coalesce, uint32_t reg, > - uint32_t value) > -{ > - check_coalsence(stream, coalesce, reg, 0); > - etna_cmd_stream_emit(stream, value); > -} > - > -static inline void > -etna_coalsence_emit_fixp(struct etna_cmd_stream *stream, > - struct etna_coalesce *coalesce, uint32_t reg, > - uint32_t value) > -{ > - check_coalsence(stream, coalesce, reg, 1); > - etna_cmd_stream_emit(stream, value); > -} > - > -static inline void > -etna_coalsence_emit_reloc(struct etna_cmd_stream *stream, > - struct etna_coalesce *coalesce, uint32_t reg, > - const struct etna_reloc *r) > -{ > - if (r->bo) { > - check_coalsence(stream, coalesce, reg, 0); > - etna_cmd_stream_reloc(stream, r); > - } > -} > - > #define EMIT_STATE(state_name, src_value) \ > etna_coalsence_emit(stream, &coalesce, VIVS_##state_name, src_value) > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.h > b/src/gallium/drivers/etnaviv/etnaviv_emit.h > index 3c3d129..dd90127 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_emit.h > +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.h > @@ -34,6 +34,12 @@ > struct etna_context; > struct compiled_rs_state; > > +struct etna_coalesce { > + uint32_t start; > + uint32_t last_reg; > + uint32_t last_fixp; > +}; > + > static inline void > etna_emit_load_state(struct etna_cmd_stream *stream, const uint16_t offset, > const uint16_t count, const int fixp) > @@ -138,6 +144,83 @@ etna_draw_instanced(struct etna_cmd_stream *stream, > etna_cmd_stream_emit(stream, 0); > } > > +static inline void > +etna_coalesce_start(struct etna_cmd_stream *stream, > + struct etna_coalesce *coalesce) > +{ > + coalesce->start = etna_cmd_stream_offset(stream); > + coalesce->last_reg = 0; > + coalesce->last_fixp = 0; > +} > + > +static inline void > +etna_coalesce_end(struct etna_cmd_stream *stream, > + struct etna_coalesce *coalesce) > +{ > + uint32_t end = etna_cmd_stream_offset(stream); > + uint32_t size = end - coalesce->start; > + > + if (size) { > + uint32_t offset = coalesce->start - 1; > + uint32_t value = etna_cmd_stream_get(stream, offset); > + > + value |= VIV_FE_LOAD_STATE_HEADER_COUNT(size); > + etna_cmd_stream_set(stream, offset, value); > + } > + > + /* append needed padding */ > + if (end % 2 == 1) > + etna_cmd_stream_emit(stream, 0xdeadbeef); > +} > + > +static inline void > +check_coalsence(struct etna_cmd_stream *stream, struct etna_coalesce > *coalesce, > + uint32_t reg, uint32_t fixp) > +{ > + if (coalesce->last_reg != 0) { > + if (((coalesce->last_reg + 4) != reg) || (coalesce->last_fixp != > fixp)) { > + etna_coalesce_end(stream, coalesce); > + etna_emit_load_state(stream, reg >> 2, 0, fixp); > + coalesce->start = etna_cmd_stream_offset(stream); > + } > + } else { > + etna_emit_load_state(stream, reg >> 2, 0, fixp); > + coalesce->start = etna_cmd_stream_offset(stream); > + } > + > + coalesce->last_reg = reg; > + coalesce->last_fixp = fixp; > +} > + > +static inline void > +etna_coalsence_emit(struct etna_cmd_stream *stream, > + struct etna_coalesce *coalesce, uint32_t reg, > + uint32_t value) > +{ > + check_coalsence(stream, coalesce, reg, 0); > + etna_cmd_stream_emit(stream, value); > +} > + > +static inline void > +etna_coalsence_emit_fixp(struct etna_cmd_stream *stream, > + struct etna_coalesce *coalesce, uint32_t reg, > + uint32_t value) > +{ > + check_coalsence(stream, coalesce, reg, 1); > + etna_cmd_stream_emit(stream, value); > +} > + > +static inline void > +etna_coalsence_emit_reloc(struct etna_cmd_stream *stream, > + struct etna_coalesce *coalesce, uint32_t reg, > + const struct etna_reloc *r) > +{ > + if (r->bo) { > + check_coalsence(stream, coalesce, reg, 0); > + etna_cmd_stream_reloc(stream, r); > + } > +} > + > void > etna_emit_state(struct etna_context *ctx); > > -- > 2.7.4 > -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev