From a842f37dff72e4347c0917119425023b6c2e91f2 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 15 Jun 2023 07:50:59 +0200 Subject: [PATCH] radv: add dgc_emit_draw_indexed() helper For emitting VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_device_generated_commands.c | 57 +++++++++++++++---------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/src/amd/vulkan/radv_device_generated_commands.c b/src/amd/vulkan/radv_device_generated_commands.c index aa7afaf..00a19d8 100644 --- a/src/amd/vulkan/radv_device_generated_commands.c +++ b/src/amd/vulkan/radv_device_generated_commands.c @@ -250,8 +250,8 @@ dgc_emit_instance_count(nir_builder *b, struct dgc_cmdbuf *cs, nir_ssa_def *inst } static void -dgc_emit_draw_indexed(nir_builder *b, struct dgc_cmdbuf *cs, nir_ssa_def *index_offset, - nir_ssa_def *index_count, nir_ssa_def *max_index_count) +dgc_emit_draw_index_offset_2(nir_builder *b, struct dgc_cmdbuf *cs, nir_ssa_def *index_offset, + nir_ssa_def *index_count, nir_ssa_def *max_index_count) { nir_ssa_def *values[5] = {nir_imm_int(b, PKT3(PKT3_DRAW_INDEX_OFFSET_2, 3, false)), max_index_count, index_offset, index_count, @@ -338,6 +338,35 @@ dgc_emit_draw(nir_builder *b, struct dgc_cmdbuf *cs, nir_ssa_def *stream_buf, } /** + * Emit VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV. + */ +static void +dgc_emit_draw_indexed(nir_builder *b, struct dgc_cmdbuf *cs, nir_ssa_def *stream_buf, + nir_ssa_def *stream_base, nir_ssa_def *draw_params_offset, + nir_ssa_def *sequence_id, nir_ssa_def *max_index_count) +{ + nir_ssa_def *vtx_base_sgpr = load_param16(b, vtx_base_sgpr); + nir_ssa_def *stream_offset = nir_iadd(b, draw_params_offset, stream_base); + + nir_ssa_def *draw_data0 = nir_load_ssbo(b, 4, 32, stream_buf, stream_offset); + nir_ssa_def *draw_data1 = + nir_load_ssbo(b, 1, 32, stream_buf, nir_iadd_imm(b, stream_offset, 16)); + nir_ssa_def *index_count = nir_channel(b, draw_data0, 0); + nir_ssa_def *instance_count = nir_channel(b, draw_data0, 1); + nir_ssa_def *first_index = nir_channel(b, draw_data0, 2); + nir_ssa_def *vertex_offset = nir_channel(b, draw_data0, 3); + nir_ssa_def *first_instance = nir_channel(b, draw_data1, 0); + + nir_push_if(b, nir_iand(b, nir_ine_imm(b, index_count, 0), nir_ine_imm(b, instance_count, 0))); + { + dgc_emit_userdata_vertex(b, cs, vtx_base_sgpr, vertex_offset, first_instance, sequence_id); + dgc_emit_instance_count(b, cs, instance_count); + dgc_emit_draw_index_offset_2(b, cs, first_index, index_count, max_index_count); + } + nir_pop_if(b, 0); +} + +/** * Emit VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV. */ static void @@ -854,32 +883,14 @@ build_dgc_prepare_shader(struct radv_device *dev) nir_ssa_def *index_size = nir_load_var(&b, index_size_var); nir_ssa_def *max_index_count = nir_load_var(&b, max_index_count_var); - nir_ssa_def *vtx_base_sgpr = load_param16(&b, vtx_base_sgpr); - nir_ssa_def *stream_offset = - nir_iadd(&b, load_param16(&b, draw_params_offset), stream_base); index_size = nir_bcsel(&b, bind_index_buffer, nir_load_var(&b, index_size_var), index_size); max_index_count = nir_bcsel(&b, bind_index_buffer, nir_load_var(&b, max_index_count_var), max_index_count); - nir_ssa_def *draw_data0 = - nir_load_ssbo(&b, 4, 32, stream_buf, stream_offset); - nir_ssa_def *draw_data1 = nir_load_ssbo( - &b, 1, 32, stream_buf, nir_iadd_imm(&b, stream_offset, 16)); - nir_ssa_def *index_count = nir_channel(&b, draw_data0, 0); - nir_ssa_def *instance_count = nir_channel(&b, draw_data0, 1); - nir_ssa_def *first_index = nir_channel(&b, draw_data0, 2); - nir_ssa_def *vertex_offset = nir_channel(&b, draw_data0, 3); - nir_ssa_def *first_instance = nir_channel(&b, draw_data1, 0); - - nir_push_if(&b, nir_iand(&b, nir_ine_imm(&b, index_count, 0), nir_ine_imm(&b, instance_count, 0))); - { - dgc_emit_userdata_vertex(&b, &cmd_buf, vtx_base_sgpr, vertex_offset, first_instance, sequence_id); - dgc_emit_instance_count(&b, &cmd_buf, instance_count); - dgc_emit_draw_indexed(&b, &cmd_buf, first_index, index_count, - max_index_count); - } - nir_pop_if(&b, 0); + + dgc_emit_draw_indexed(&b, &cmd_buf, stream_buf, stream_base, + load_param16(&b, draw_params_offset), sequence_id, max_index_count); } nir_pop_if(&b, NULL); -- 2.7.4