From db258503fa0d0d2d059a6aefe1747a8e38477e55 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 18 Nov 2024 14:26:59 +0200 Subject: [PATCH] anv: split vertex buffer emission in a different function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lionel Landwerlin Reviewed-by: Tapani Pälli Reviewed-by: José Roberto de Souza Part-of: --- src/intel/vulkan/genX_cmd_draw.c | 108 ++++++++++++++++--------------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_draw.c b/src/intel/vulkan/genX_cmd_draw.c index 8ab5944ab07..cb4a38d4944 100644 --- a/src/intel/vulkan/genX_cmd_draw.c +++ b/src/intel/vulkan/genX_cmd_draw.c @@ -698,6 +698,61 @@ cmd_buffer_maybe_flush_rt_writes(struct anv_cmd_buffer *cmd_buffer, #endif } +ALWAYS_INLINE static void +cmd_buffer_flush_vertex_buffers(struct anv_cmd_buffer *cmd_buffer, + uint32_t vb_emit) +{ + const struct vk_dynamic_graphics_state *dyn = + &cmd_buffer->vk.dynamic_graphics_state; + const uint32_t num_buffers = __builtin_popcount(vb_emit); + const uint32_t num_dwords = 1 + num_buffers * 4; + uint32_t *p = anv_batch_emitn(&cmd_buffer->batch, num_dwords, + GENX(3DSTATE_VERTEX_BUFFERS)); + uint32_t i = 0; + u_foreach_bit(vb, vb_emit) { + struct anv_buffer *buffer = cmd_buffer->state.vertex_bindings[vb].buffer; + uint32_t offset = cmd_buffer->state.vertex_bindings[vb].offset; + + struct GENX(VERTEX_BUFFER_STATE) state; + if (buffer) { + uint32_t stride = dyn->vi_binding_strides[vb]; + UNUSED uint32_t size = cmd_buffer->state.vertex_bindings[vb].size; + + state = (struct GENX(VERTEX_BUFFER_STATE)) { + .VertexBufferIndex = vb, + + .MOCS = anv_mocs(cmd_buffer->device, buffer->address.bo, + ISL_SURF_USAGE_VERTEX_BUFFER_BIT), + .AddressModifyEnable = true, + .BufferPitch = stride, + .BufferStartingAddress = anv_address_add(buffer->address, offset), + .NullVertexBuffer = offset >= buffer->vk.size, +#if GFX_VER >= 12 + .L3BypassDisable = true, +#endif + + .BufferSize = size, + }; + } else { + state = (struct GENX(VERTEX_BUFFER_STATE)) { + .VertexBufferIndex = vb, + .NullVertexBuffer = true, + .MOCS = anv_mocs(cmd_buffer->device, NULL, + ISL_SURF_USAGE_VERTEX_BUFFER_BIT), + }; + } + +#if GFX_VER == 9 + genX(cmd_buffer_set_binding_for_gfx8_vb_flush)(cmd_buffer, vb, + state.BufferStartingAddress, + state.BufferSize); +#endif + + GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, &p[1 + i * 4], &state); + i++; + } +} + ALWAYS_INLINE static void genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer) { @@ -705,7 +760,6 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer) anv_pipeline_to_graphics(cmd_buffer->state.gfx.base.pipeline); const struct vk_dynamic_graphics_state *dyn = &cmd_buffer->vk.dynamic_graphics_state; - uint32_t *p; assert((pipeline->base.base.active_stages & VK_SHADER_STAGE_COMPUTE_BIT) == 0); @@ -749,58 +803,10 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer) vb_emit |= dyn->vi->bindings_valid; if (vb_emit) { - const uint32_t num_buffers = __builtin_popcount(vb_emit); - const uint32_t num_dwords = 1 + num_buffers * 4; - - p = anv_batch_emitn(&cmd_buffer->batch, num_dwords, - GENX(3DSTATE_VERTEX_BUFFERS)); - uint32_t i = 0; - u_foreach_bit(vb, vb_emit) { - struct anv_buffer *buffer = cmd_buffer->state.vertex_bindings[vb].buffer; - uint32_t offset = cmd_buffer->state.vertex_bindings[vb].offset; - - struct GENX(VERTEX_BUFFER_STATE) state; - if (buffer) { - uint32_t stride = dyn->vi_binding_strides[vb]; - UNUSED uint32_t size = cmd_buffer->state.vertex_bindings[vb].size; - - state = (struct GENX(VERTEX_BUFFER_STATE)) { - .VertexBufferIndex = vb, - - .MOCS = anv_mocs(cmd_buffer->device, buffer->address.bo, - ISL_SURF_USAGE_VERTEX_BUFFER_BIT), - .AddressModifyEnable = true, - .BufferPitch = stride, - .BufferStartingAddress = anv_address_add(buffer->address, offset), - .NullVertexBuffer = offset >= buffer->vk.size, -#if GFX_VER >= 12 - .L3BypassDisable = true, -#endif - - .BufferSize = size, - }; - } else { - state = (struct GENX(VERTEX_BUFFER_STATE)) { - .VertexBufferIndex = vb, - .NullVertexBuffer = true, - .MOCS = anv_mocs(cmd_buffer->device, NULL, - ISL_SURF_USAGE_VERTEX_BUFFER_BIT), - }; - } - -#if GFX_VER == 9 - genX(cmd_buffer_set_binding_for_gfx8_vb_flush)(cmd_buffer, vb, - state.BufferStartingAddress, - state.BufferSize); -#endif - - GENX(VERTEX_BUFFER_STATE_pack)(&cmd_buffer->batch, &p[1 + i * 4], &state); - i++; - } + cmd_buffer_flush_vertex_buffers(cmd_buffer, vb_emit); + cmd_buffer->state.gfx.vb_dirty &= ~vb_emit; } - cmd_buffer->state.gfx.vb_dirty &= ~vb_emit; - const bool any_dynamic_state_dirty = vk_dynamic_graphics_state_any_dirty(dyn); uint32_t descriptors_dirty = cmd_buffer->state.descriptors_dirty &