Mesa (master): broadcom/vc5: Move most of the shader state attribute record to the CSO.

Eric Anholt anholt at kemper.freedesktop.org
Fri Oct 20 23:01:05 UTC 2017


Module: Mesa
Branch: master
Commit: fb15168919613fd913addc5d2d90673e506ae0cc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb15168919613fd913addc5d2d90673e506ae0cc

Author: Eric Anholt <eric at anholt.net>
Date:   Thu Oct 19 15:17:41 2017 -0700

broadcom/vc5: Move most of the shader state attribute record to the CSO.

This should reduce our draw-time overhead, and puts the code where it
should go long term.

---

 src/gallium/drivers/vc5/vc5_context.h |  5 ++-
 src/gallium/drivers/vc5/vc5_draw.c    | 83 ++++++++---------------------------
 src/gallium/drivers/vc5/vc5_screen.h  |  1 +
 src/gallium/drivers/vc5/vc5_state.c   | 66 ++++++++++++++++++++++++++++
 4 files changed, 90 insertions(+), 65 deletions(-)

diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h
index d4f9e1eac6..08d96f36ec 100644
--- a/src/gallium/drivers/vc5/vc5_context.h
+++ b/src/gallium/drivers/vc5/vc5_context.h
@@ -33,6 +33,7 @@
 #include "util/slab.h"
 #include "xf86drm.h"
 #include "vc5_drm.h"
+#include "vc5_screen.h"
 
 struct vc5_job;
 struct vc5_bo;
@@ -159,8 +160,10 @@ struct vc5_vertexbuf_stateobj {
 };
 
 struct vc5_vertex_stateobj {
-        struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
+        struct pipe_vertex_element pipe[VC5_MAX_ATTRIBUTES];
         unsigned num_elements;
+
+        uint8_t attrs[12 * VC5_MAX_ATTRIBUTES];
 };
 
 struct vc5_streamout_stateobj {
diff --git a/src/gallium/drivers/vc5/vc5_draw.c b/src/gallium/drivers/vc5/vc5_draw.c
index fe5a2c2129..f6c22c9d18 100644
--- a/src/gallium/drivers/vc5/vc5_draw.c
+++ b/src/gallium/drivers/vc5/vc5_draw.c
@@ -244,71 +244,26 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5,
                 struct pipe_vertex_buffer *vb =
                         &vertexbuf->vb[elem->vertex_buffer_index];
                 struct vc5_resource *rsc = vc5_resource(vb->buffer.resource);
-                const struct util_format_description *desc =
-                        util_format_description(elem->src_format);
-
-                uint32_t offset = vb->buffer_offset + elem->src_offset;
-
-                cl_emit(&job->indirect, GL_SHADER_STATE_ATTRIBUTE_RECORD, attr) {
-                        uint32_t r_size = desc->channel[0].size;
-
-                        /* vec_size == 0 means 4 */
-                        attr.vec_size = desc->nr_channels & 3;
-
-                        switch (desc->channel[0].type) {
-                        case UTIL_FORMAT_TYPE_FLOAT:
-                                if (r_size == 32) {
-                                        attr.type = ATTRIBUTE_FLOAT;
-                                } else {
-                                        assert(r_size == 16);
-                                        attr.type = ATTRIBUTE_HALF_FLOAT;
-                                }
-                                break;
-
-                        case UTIL_FORMAT_TYPE_SIGNED:
-                        case UTIL_FORMAT_TYPE_UNSIGNED:
-                                switch (r_size) {
-                                case 32:
-                                        attr.type = ATTRIBUTE_INT;
-                                        break;
-                                case 16:
-                                        attr.type = ATTRIBUTE_SHORT;
-                                        break;
-                                case 10:
-                                        attr.type = ATTRIBUTE_INT2_10_10_10;
-                                        break;
-                                case 8:
-                                        attr.type = ATTRIBUTE_BYTE;
-                                        break;
-                                default:
-                                        fprintf(stderr,
-                                                "format %s unsupported\n",
-                                                desc->name);
-                                        attr.type = ATTRIBUTE_BYTE;
-                                        abort();
-                                }
-                                break;
-
-                        default:
-                                fprintf(stderr,
-                                        "format %s unsupported\n",
-                                        desc->name);
-                                abort();
-                        }
 
-                        attr.signed_int_type =
-                                desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED;
-
-                        attr.normalized_int_type = desc->channel[0].normalized;
-                        attr.read_as_int_uint = desc->channel[0].pure_integer;
-                        attr.address = cl_address(rsc->bo, offset);
-                        attr.stride = vb->stride;
-                        attr.instance_divisor = elem->instance_divisor;
-                        attr.number_of_values_read_by_coordinate_shader =
-                                vc5->prog.cs->prog_data.vs->vattr_sizes[i];
-                        attr.number_of_values_read_by_vertex_shader =
-                                vc5->prog.vs->prog_data.vs->vattr_sizes[i];
-                }
+                struct V3D33_GL_SHADER_STATE_ATTRIBUTE_RECORD attr_unpacked = {
+                        .stride = vb->stride,
+                        .address = cl_address(rsc->bo,
+                                              vb->buffer_offset +
+                                              elem->src_offset),
+                        .number_of_values_read_by_coordinate_shader =
+                                vc5->prog.cs->prog_data.vs->vattr_sizes[i],
+                        .number_of_values_read_by_vertex_shader =
+                                vc5->prog.vs->prog_data.vs->vattr_sizes[i],
+                };
+                const uint32_t size =
+                        cl_packet_length(GL_SHADER_STATE_ATTRIBUTE_RECORD);
+                uint8_t attr_packed[size];
+                V3D33_GL_SHADER_STATE_ATTRIBUTE_RECORD_pack(&job->indirect,
+                                                            attr_packed,
+                                                            &attr_unpacked);
+                for (int j = 0; j < size; j++)
+                        attr_packed[j] |= vtx->attrs[i * size + j];
+                cl_emit_prepacked(&job->indirect, &attr_packed);
         }
 
         cl_emit(&job->bcl, GL_SHADER_STATE, state) {
diff --git a/src/gallium/drivers/vc5/vc5_screen.h b/src/gallium/drivers/vc5/vc5_screen.h
index d804efa1bb..28925d791c 100644
--- a/src/gallium/drivers/vc5/vc5_screen.h
+++ b/src/gallium/drivers/vc5/vc5_screen.h
@@ -38,6 +38,7 @@ struct vc5_bo;
 #define VC5_MAX_TEXTURE_SAMPLERS 32
 #define VC5_MAX_SAMPLES 4
 #define VC5_MAX_DRAW_BUFFERS 4
+#define VC5_MAX_ATTRIBUTES 16
 
 struct vc5_simulator_file;
 
diff --git a/src/gallium/drivers/vc5/vc5_state.c b/src/gallium/drivers/vc5/vc5_state.c
index b289d20cb6..98426de977 100644
--- a/src/gallium/drivers/vc5/vc5_state.c
+++ b/src/gallium/drivers/vc5/vc5_state.c
@@ -246,6 +246,72 @@ vc5_vertex_state_create(struct pipe_context *pctx, unsigned num_elements,
         memcpy(so->pipe, elements, sizeof(*elements) * num_elements);
         so->num_elements = num_elements;
 
+        for (int i = 0; i < so->num_elements; i++) {
+                const struct pipe_vertex_element *elem = &elements[i];
+                const struct util_format_description *desc =
+                        util_format_description(elem->src_format);
+                uint32_t r_size = desc->channel[0].size;
+
+                struct V3D33_GL_SHADER_STATE_ATTRIBUTE_RECORD attr_unpacked = {
+                        /* vec_size == 0 means 4 */
+                        .vec_size = desc->nr_channels & 3,
+                        .signed_int_type = (desc->channel[0].type ==
+                                            UTIL_FORMAT_TYPE_SIGNED),
+
+                        .normalized_int_type = desc->channel[0].normalized,
+                        .read_as_int_uint = desc->channel[0].pure_integer,
+                        .instance_divisor = elem->instance_divisor,
+                };
+
+                switch (desc->channel[0].type) {
+                case UTIL_FORMAT_TYPE_FLOAT:
+                        if (r_size == 32) {
+                                attr_unpacked.type = ATTRIBUTE_FLOAT;
+                        } else {
+                                assert(r_size == 16);
+                                attr_unpacked.type = ATTRIBUTE_HALF_FLOAT;
+                        }
+                        break;
+
+                case UTIL_FORMAT_TYPE_SIGNED:
+                case UTIL_FORMAT_TYPE_UNSIGNED:
+                        switch (r_size) {
+                        case 32:
+                                attr_unpacked.type = ATTRIBUTE_INT;
+                                break;
+                        case 16:
+                                attr_unpacked.type = ATTRIBUTE_SHORT;
+                                break;
+                        case 10:
+                                attr_unpacked.type = ATTRIBUTE_INT2_10_10_10;
+                                break;
+                        case 8:
+                                attr_unpacked.type = ATTRIBUTE_BYTE;
+                                break;
+                        default:
+                                fprintf(stderr,
+                                        "format %s unsupported\n",
+                                        desc->name);
+                                attr_unpacked.type = ATTRIBUTE_BYTE;
+                                abort();
+                        }
+                        break;
+
+                default:
+                        fprintf(stderr,
+                                "format %s unsupported\n",
+                                desc->name);
+                        abort();
+                }
+
+                const uint32_t size =
+                        cl_packet_length(GL_SHADER_STATE_ATTRIBUTE_RECORD);
+                V3D33_GL_SHADER_STATE_ATTRIBUTE_RECORD_pack(NULL,
+                                                            (uint8_t *)&so->attrs[i * size],
+                                                            &attr_unpacked);
+        }
+
+
         return so;
 }
 




More information about the mesa-commit mailing list