Mesa (main): freedreno/a5xx: Reduce packet emits for SSBO state.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Aug 18 00:34:06 UTC 2021
Module: Mesa
Branch: main
Commit: c94ff7dd811ad9739b4df92f1cb1ff068ddfdd25
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c94ff7dd811ad9739b4df92f1cb1ff068ddfdd25
Author: Emma Anholt <emma at anholt.net>
Date: Fri Aug 6 15:39:02 2021 -0700
freedreno/a5xx: Reduce packet emits for SSBO state.
This is what I see happening in
dEQP-VK.spirv_assembly.instruction.compute.opatomic_storage_buffer.load on
pixel 2 (also where I found a buffer big enough to show how to encode the
size).
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12258>
---
src/gallium/drivers/freedreno/a5xx/fd5_emit.c | 37 +++++++++++++++------------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
index 85bb1b89231..08e1173d2d4 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
@@ -429,31 +429,34 @@ emit_ssbos(struct fd_context *ctx, struct fd_ringbuffer *ring,
{
unsigned count = util_last_bit(so->enabled_mask);
- for (unsigned i = 0; i < count; i++) {
- OUT_PKT7(ring, CP_LOAD_STATE4, 5);
- OUT_RING(ring, CP_LOAD_STATE4_0_DST_OFF(i) |
- CP_LOAD_STATE4_0_STATE_SRC(SS4_DIRECT) |
- CP_LOAD_STATE4_0_STATE_BLOCK(sb) |
- CP_LOAD_STATE4_0_NUM_UNIT(1));
- OUT_RING(ring, CP_LOAD_STATE4_1_STATE_TYPE(ST4_CONSTANTS) |
- CP_LOAD_STATE4_1_EXT_SRC_ADDR(0));
- OUT_RING(ring, CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI(0));
+ OUT_PKT7(ring, CP_LOAD_STATE4, 3 + 2 * count);
+ OUT_RING(ring, CP_LOAD_STATE4_0_DST_OFF(0) |
+ CP_LOAD_STATE4_0_STATE_SRC(SS4_DIRECT) |
+ CP_LOAD_STATE4_0_STATE_BLOCK(sb) |
+ CP_LOAD_STATE4_0_NUM_UNIT(count));
+ OUT_RING(ring, CP_LOAD_STATE4_1_STATE_TYPE(ST4_CONSTANTS) |
+ CP_LOAD_STATE4_1_EXT_SRC_ADDR(0));
+ OUT_RING(ring, CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI(0));
+ for (unsigned i = 0; i < count; i++) {
struct pipe_shader_buffer *buf = &so->sb[i];
unsigned sz = buf->buffer_size;
/* Unlike a6xx, SSBO size is in bytes. */
OUT_RING(ring, A5XX_SSBO_1_0_WIDTH(sz & MASK(16)));
OUT_RING(ring, A5XX_SSBO_1_1_HEIGHT(sz >> 16));
+ }
- OUT_PKT7(ring, CP_LOAD_STATE4, 5);
- OUT_RING(ring, CP_LOAD_STATE4_0_DST_OFF(i) |
- CP_LOAD_STATE4_0_STATE_SRC(SS4_DIRECT) |
- CP_LOAD_STATE4_0_STATE_BLOCK(sb) |
- CP_LOAD_STATE4_0_NUM_UNIT(1));
- OUT_RING(ring, CP_LOAD_STATE4_1_STATE_TYPE(ST4_UBO) |
- CP_LOAD_STATE4_1_EXT_SRC_ADDR(0));
- OUT_RING(ring, CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI(0));
+ OUT_PKT7(ring, CP_LOAD_STATE4, 3 + 2 * count);
+ OUT_RING(ring, CP_LOAD_STATE4_0_DST_OFF(0) |
+ CP_LOAD_STATE4_0_STATE_SRC(SS4_DIRECT) |
+ CP_LOAD_STATE4_0_STATE_BLOCK(sb) |
+ CP_LOAD_STATE4_0_NUM_UNIT(count));
+ OUT_RING(ring, CP_LOAD_STATE4_1_STATE_TYPE(ST4_UBO) |
+ CP_LOAD_STATE4_1_EXT_SRC_ADDR(0));
+ OUT_RING(ring, CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI(0));
+ for (unsigned i = 0; i < count; i++) {
+ struct pipe_shader_buffer *buf = &so->sb[i];
if (buf->buffer) {
struct fd_resource *rsc = fd_resource(buf->buffer);
More information about the mesa-commit
mailing list