Mesa (master): broadcom/vc5: Move default attribute value setup to the CSO and fix them.

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


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

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

broadcom/vc5: Move default attribute value setup to the CSO and fix them.

I was generating some stub values to bring the driver up, but fill them in
properly now.  We now set 1.0 or 1u as appropriate, and thanks to being in
their own BO it fixes piglit failures on the 7268 (where our 4-byte
alignment was insufficient).

Fixes const-packHalf2x16.shader_test

---

 src/gallium/drivers/vc5/vc5_context.h |  1 +
 src/gallium/drivers/vc5/vc5_draw.c    | 31 ++-----------------------------
 src/gallium/drivers/vc5/vc5_state.c   | 20 ++++++++++++++++++++
 3 files changed, 23 insertions(+), 29 deletions(-)

diff --git a/src/gallium/drivers/vc5/vc5_context.h b/src/gallium/drivers/vc5/vc5_context.h
index 08d96f36ec..a1017bd1a6 100644
--- a/src/gallium/drivers/vc5/vc5_context.h
+++ b/src/gallium/drivers/vc5/vc5_context.h
@@ -164,6 +164,7 @@ struct vc5_vertex_stateobj {
         unsigned num_elements;
 
         uint8_t attrs[12 * VC5_MAX_ATTRIBUTES];
+        struct vc5_bo *default_attribute_values;
 };
 
 struct vc5_streamout_stateobj {
diff --git a/src/gallium/drivers/vc5/vc5_draw.c b/src/gallium/drivers/vc5/vc5_draw.c
index f6c22c9d18..11d9e92a96 100644
--- a/src/gallium/drivers/vc5/vc5_draw.c
+++ b/src/gallium/drivers/vc5/vc5_draw.c
@@ -123,32 +123,6 @@ vc5_predraw_check_textures(struct pipe_context *pctx,
         }
 }
 
-static struct vc5_cl_reloc
-vc5_get_default_values(struct vc5_context *vc5)
-{
-        struct vc5_job *job = vc5->job;
-
-        /* VC5_DIRTY_VTXSTATE */
-        struct vc5_vertex_stateobj *vtx = vc5->vtx;
-
-        /* Set up the default values for attributes. */
-        vc5_cl_ensure_space(&job->indirect, 4 * 4 * vtx->num_elements, 4);
-        struct vc5_cl_reloc default_values =
-                cl_address(job->indirect.bo, cl_offset(&job->indirect));
-        vc5_bo_reference(default_values.bo);
-
-        struct vc5_cl_out *defaults = cl_start(&job->indirect);
-        for (int i = 0; i < vtx->num_elements; i++) {
-                cl_aligned_f(&defaults, 0.0);
-                cl_aligned_f(&defaults, 0.0);
-                cl_aligned_f(&defaults, 0.0);
-                cl_aligned_f(&defaults, 1.0);
-        }
-        cl_end(&job->indirect, defaults);
-
-        return default_values;
-}
-
 static void
 vc5_emit_gl_shader_state(struct vc5_context *vc5,
                          const struct pipe_draw_info *info)
@@ -172,7 +146,6 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5,
                 vc5_write_uniforms(vc5, vc5->prog.cs,
                                    &vc5->constbuf[PIPE_SHADER_VERTEX],
                                    &vc5->verttex);
-        struct vc5_cl_reloc default_values = vc5_get_default_values(vc5);
 
         uint32_t shader_rec_offset =
                 vc5_cl_ensure_space(&job->indirect,
@@ -236,7 +209,8 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5,
                 shader.instance_id_read_by_vertex_shader =
                         vc5->prog.vs->prog_data.vs->uses_iid;
 
-                shader.address_of_default_attribute_values = default_values;
+                shader.address_of_default_attribute_values =
+                        cl_address(vtx->default_attribute_values, 0);
         }
 
         for (int i = 0; i < vtx->num_elements; i++) {
@@ -274,7 +248,6 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5,
         vc5_bo_unreference(&cs_uniforms.bo);
         vc5_bo_unreference(&vs_uniforms.bo);
         vc5_bo_unreference(&fs_uniforms.bo);
-        vc5_bo_unreference(&default_values.bo);
 
         job->shader_rec_count++;
 }
diff --git a/src/gallium/drivers/vc5/vc5_state.c b/src/gallium/drivers/vc5/vc5_state.c
index 98426de977..eebf94b4b9 100644
--- a/src/gallium/drivers/vc5/vc5_state.c
+++ b/src/gallium/drivers/vc5/vc5_state.c
@@ -238,6 +238,7 @@ static void *
 vc5_vertex_state_create(struct pipe_context *pctx, unsigned num_elements,
                         const struct pipe_vertex_element *elements)
 {
+        struct vc5_context *vc5 = vc5_context(pctx);
         struct vc5_vertex_stateobj *so = CALLOC_STRUCT(vc5_vertex_stateobj);
 
         if (!so)
@@ -311,6 +312,25 @@ vc5_vertex_state_create(struct pipe_context *pctx, unsigned num_elements,
                                                             &attr_unpacked);
         }
 
+        /* Set up the default attribute values in case any of the vertex
+         * elements use them.
+         */
+        so->default_attribute_values = vc5_bo_alloc(vc5->screen,
+                                                    VC5_MAX_ATTRIBUTES *
+                                                    4 * sizeof(float),
+                                                    "default attributes");
+        uint32_t *attrs = vc5_bo_map(so->default_attribute_values);
+        for (int i = 0; i < VC5_MAX_ATTRIBUTES; i++) {
+                attrs[i * 4 + 0] = 0;
+                attrs[i * 4 + 1] = 0;
+                attrs[i * 4 + 2] = 0;
+                if (i < so->num_elements &&
+                    util_format_is_pure_integer(so->pipe[i].src_format)) {
+                        attrs[i * 4 + 3] = 1;
+                } else {
+                        attrs[i * 4 + 3] = fui(1.0);
+                }
+        }
 
         return so;
 }




More information about the mesa-commit mailing list