summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-11-01 15:16:59 -0700
committerEric Anholt <[email protected]>2017-11-07 09:19:48 -0800
commit078b163a9c581e5b0e7bcc7436f0bf569cbc020d (patch)
treedadb992d438dec013473a147831be2a021d5d9cb /src/gallium
parent735b844b1b32a440738b1a6096ea3aa4df6b52a7 (diff)
broadcom/vc5: Add a cl_emit() variant for merging with a pre-packed struct.
Cleans up the hand-written code, at the cost of another ugly macro.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/vc5/vc5_cl.h19
-rw-r--r--src/gallium/drivers/vc5/vc5_draw.c29
2 files changed, 29 insertions, 19 deletions
diff --git a/src/gallium/drivers/vc5/vc5_cl.h b/src/gallium/drivers/vc5/vc5_cl.h
index 64ccac80593..4c64f084d3d 100644
--- a/src/gallium/drivers/vc5/vc5_cl.h
+++ b/src/gallium/drivers/vc5/vc5_cl.h
@@ -221,8 +221,23 @@ cl_get_emit_space(struct vc5_cl_out **cl, size_t size)
({ \
struct vc5_cl_out *cl_out = cl_start(cl); \
cl_packet_pack(packet)(cl, (uint8_t *)cl_out, &name); \
- VG(VALGRIND_CHECK_MEM_IS_DEFINED(cl_out, \
- cl_packet_length(packet))); \
+ cl_advance(&cl_out, cl_packet_length(packet)); \
+ cl_end(cl, cl_out); \
+ _loop_terminate = NULL; \
+ })) \
+
+#define cl_emit_with_prepacked(cl, packet, prepacked, name) \
+ for (struct cl_packet_struct(packet) name = { \
+ cl_packet_header(packet) \
+ }, \
+ *_loop_terminate = &name; \
+ __builtin_expect(_loop_terminate != NULL, 1); \
+ ({ \
+ struct vc5_cl_out *cl_out = cl_start(cl); \
+ uint8_t packed[cl_packet_length(packet)]; \
+ cl_packet_pack(packet)(cl, packed, &name); \
+ for (int _i = 0; _i < cl_packet_length(packet); _i++) \
+ ((uint8_t *)cl_out)[_i] = packed[_i] | (prepacked)[_i]; \
cl_advance(&cl_out, cl_packet_length(packet)); \
cl_end(cl, cl_out); \
_loop_terminate = NULL; \
diff --git a/src/gallium/drivers/vc5/vc5_draw.c b/src/gallium/drivers/vc5/vc5_draw.c
index 2ff604f02f2..edc52859154 100644
--- a/src/gallium/drivers/vc5/vc5_draw.c
+++ b/src/gallium/drivers/vc5/vc5_draw.c
@@ -221,25 +221,20 @@ vc5_emit_gl_shader_state(struct vc5_context *vc5,
&vertexbuf->vb[elem->vertex_buffer_index];
struct vc5_resource *rsc = vc5_resource(vb->buffer.resource);
- 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_with_prepacked(&job->indirect,
+ GL_SHADER_STATE_ATTRIBUTE_RECORD,
+ &vtx->attrs[i * size], attr) {
+ attr.stride = vb->stride;
+ attr.address = cl_address(rsc->bo,
+ vb->buffer_offset +
+ elem->src_offset);
+ 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];
+ }
}
if (vtx->num_elements == 0) {