From: Eric Anholt Date: Wed, 1 Nov 2017 22:16:59 +0000 (-0700) Subject: broadcom/vc5: Add a cl_emit() variant for merging with a pre-packed struct. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=078b163a9c581e5b0e7bcc7436f0bf569cbc020d;p=mesa.git 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. --- 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) {