[PATCH 18/19] etnaviv: GC7000: Move etna_coalesce to emit header file
Christian Gmeiner
christian.gmeiner at gmail.com
Sun Nov 5 15:32:27 UTC 2017
2017-10-30 17:17 GMT+01:00 Wladimir J. van der Laan <laanwj at gmail.com>:
> Want to be able to emit state from the texture implementation.
>
> Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner at 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
More information about the etnaviv
mailing list