diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_emit.c | 83 | ||||
-rw-r--r-- | 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 279aa625fcb..5ec9f167483 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 3c3d1294dc8..dd90127ddd4 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); |