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.
This commit is contained in:
parent
735b844b1b
commit
078b163a9c
|
@ -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; \
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue