From 6caf789c07a8fc1968d4849f662c2e74c7b6160e Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 14 Aug 2020 12:14:20 -0400 Subject: [PATCH] panfrost: Move attr_meta emission to the draw routine It's unfortunate that we can't do more at CSO time, but actually all we really need is the format after all, and this lets us group the state. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Tomeu Vizoso Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 21 ++++++++++++++------ src/gallium/drivers/panfrost/pan_context.c | 15 +++++--------- src/gallium/drivers/panfrost/pan_context.h | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 28607b4b7d5..b36afb29530 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -1431,10 +1431,17 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch, /* Add special gl_VertexID/gl_InstanceID buffers */ + struct mali_attr_meta hw[PIPE_MAX_ATTRIBS]; + panfrost_vertex_id(ctx->padded_count, &attrs[k]); - so->hw[PAN_VERTEX_ID].index = k++; + hw[PAN_VERTEX_ID].index = k++; + hw[PAN_VERTEX_ID].format = so->formats[PAN_VERTEX_ID]; + hw[PAN_VERTEX_ID].unknown1 = 0x2; + panfrost_instance_id(ctx->padded_count, &attrs[k]); - so->hw[PAN_INSTANCE_ID].index = k++; + hw[PAN_INSTANCE_ID].index = k++; + hw[PAN_INSTANCE_ID].format = so->formats[PAN_VERTEX_ID]; + hw[PAN_INSTANCE_ID].unknown1 = 0x2; /* Attribute addresses require 64-byte alignment, so let: * @@ -1466,16 +1473,18 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch, if (so->pipe[i].instance_divisor && ctx->instance_count > 1 && start) src_offset -= buf->stride * start; - so->hw[i].src_offset = src_offset; - so->hw[i].index = attrib_to_buffer[i]; + hw[i].src_offset = src_offset; + hw[i].index = attrib_to_buffer[i]; + hw[i].format = so->formats[i]; + hw[i].unknown1 = 0x2; } vertex_postfix->attributes = panfrost_pool_upload(&batch->pool, attrs, k * sizeof(*attrs)); - vertex_postfix->attribute_meta = panfrost_pool_upload(&batch->pool, so->hw, - sizeof(*so->hw) * + vertex_postfix->attribute_meta = panfrost_pool_upload(&batch->pool, hw, + sizeof(hw[0]) * PAN_MAX_ATTRIBUTE); } diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 72c435792c5..46cbfe896ff 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -445,12 +445,8 @@ panfrost_create_vertex_elements_state( memcpy(so->pipe, elements, sizeof(*elements) * num_elements); for (int i = 0; i < num_elements; ++i) { - so->hw[i].index = i; - enum pipe_format fmt = elements[i].src_format; const struct util_format_description *desc = util_format_description(fmt); - so->hw[i].unknown1 = 0x2; - unsigned swizzle = 0; if (dev->quirks & HAS_SWIZZLES) swizzle = panfrost_translate_swizzle_4(desc->swizzle); @@ -458,21 +454,20 @@ panfrost_create_vertex_elements_state( swizzle = panfrost_bifrost_swizzle(desc->nr_channels); enum mali_format hw_format = panfrost_pipe_format_table[desc->format].hw; - so->hw[i].format = (hw_format << 12) | swizzle; + so->formats[i] = (hw_format << 12) | swizzle; assert(hw_format); } /* Let's also prepare vertex builtins */ - so->hw[PAN_VERTEX_ID].format = MALI_R32UI; if (dev->quirks & HAS_SWIZZLES) - so->hw[PAN_VERTEX_ID].format = (MALI_R32UI << 12) | panfrost_get_default_swizzle(1); + so->formats[PAN_VERTEX_ID] = (MALI_R32UI << 12) | panfrost_get_default_swizzle(1); else - so->hw[PAN_VERTEX_ID].format = (MALI_R32UI << 12) | panfrost_bifrost_swizzle(1); + so->formats[PAN_VERTEX_ID] = (MALI_R32UI << 12) | panfrost_bifrost_swizzle(1); if (dev->quirks & HAS_SWIZZLES) - so->hw[PAN_INSTANCE_ID].format = (MALI_R32UI << 12) | panfrost_get_default_swizzle(1); + so->formats[PAN_INSTANCE_ID] = (MALI_R32UI << 12) | panfrost_get_default_swizzle(1); else - so->hw[PAN_INSTANCE_ID].format = (MALI_R32UI << 12) | panfrost_bifrost_swizzle(1); + so->formats[PAN_INSTANCE_ID] = (MALI_R32UI << 12) | panfrost_bifrost_swizzle(1); return so; } diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index a53db0d611f..e1a6dc8b5c2 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -254,7 +254,7 @@ struct panfrost_vertex_state { unsigned num_elements; struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS]; - struct mali_attr_meta hw[PIPE_MAX_ATTRIBS]; + unsigned formats[PIPE_MAX_ATTRIBS]; }; struct panfrost_zsa_state { -- 2.30.2