diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index fe237d024a0..4374fc5cfc4 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -1088,15 +1088,15 @@ void anv_CmdBindVertexBuffers2( ANV_FROM_HANDLE(anv_buffer, buffer, pBuffers[i]); if (buffer == NULL) { - vb[firstBinding + i] = (struct anv_vertex_binding) { - .buffer = NULL, - }; + vb[firstBinding + i] = (struct anv_vertex_binding) { 0 }; } else { vb[firstBinding + i] = (struct anv_vertex_binding) { - .buffer = buffer, - .offset = pOffsets[i], + .addr = anv_address_physical( + anv_address_add(buffer->address, pOffsets[i])), .size = vk_buffer_range(&buffer->vk, pOffsets[i], pSizes ? pSizes[i] : VK_WHOLE_SIZE), + .mocs = anv_mocs(cmd_buffer->device, buffer->address.bo, + ISL_SURF_USAGE_VERTEX_BUFFER_BIT), }; } cmd_buffer->state.gfx.vb_dirty |= 1 << (firstBinding + i); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index dc29b813b76..0b0e038d615 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3679,9 +3679,9 @@ anv_pipe_flush_bit_to_ds_stall_flag(enum anv_pipe_bits bits); VK_IMAGE_ASPECT_PLANES_BITS_ANV) struct anv_vertex_binding { - struct anv_buffer * buffer; - VkDeviceSize offset; - VkDeviceSize size; + uint64_t addr; + uint32_t mocs; + VkDeviceSize size; }; struct anv_xfb_binding { diff --git a/src/intel/vulkan/genX_cmd_draw.c b/src/intel/vulkan/genX_cmd_draw.c index d3f762619cc..6465f35f060 100644 --- a/src/intel/vulkan/genX_cmd_draw.c +++ b/src/intel/vulkan/genX_cmd_draw.c @@ -681,28 +681,25 @@ cmd_buffer_flush_vertex_buffers(struct anv_cmd_buffer *cmd_buffer, 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; + const struct anv_vertex_binding *binding = + &cmd_buffer->state.vertex_bindings[vb]; struct GENX(VERTEX_BUFFER_STATE) state; - if (buffer) { + if (binding->size > 0) { 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), + .MOCS = binding->mocs, .AddressModifyEnable = true, .BufferPitch = stride, - .BufferStartingAddress = anv_address_add(buffer->address, offset), - .NullVertexBuffer = offset >= buffer->vk.size, + .BufferStartingAddress = anv_address_from_u64(binding->addr), #if GFX_VER >= 12 .L3BypassDisable = true, #endif - .BufferSize = size, + .BufferSize = binding->size, }; } else { state = (struct GENX(VERTEX_BUFFER_STATE)) {