diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index b73116accc5..ec7e11e20cd 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2904,12 +2904,18 @@ radv_flush_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer, bool pipeline_ if (pipeline->use_per_attribute_vb_descs) { uint32_t attrib_end = pipeline->attrib_ends[i]; - if (num_records < attrib_end) + if (num_records < attrib_end) { num_records = 0; /* not enough space for one vertex */ - else if (stride == 0) + } else if (stride == 0) { num_records = 1; /* only one vertex */ - else + } else { num_records = (num_records - attrib_end) / stride + 1; + /* If attrib_offset>stride, then the compiler will increase the vertex index by + * attrib_offset/stride and decrease the offset by attrib_offset%stride. This is + * only allowed with static strides. + */ + num_records += pipeline->attrib_index_offset[i]; + } /* GFX10 uses OOB_SELECT_RAW if stride==0, so convert num_records from elements into * into bytes in that case. GFX8 always uses bytes. diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index fb1d95e63cf..5de27eeb85f 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -5316,6 +5316,9 @@ radv_pipeline_init_vertex_input_state(struct radv_pipeline *pipeline, uint32_t end = desc->offset + vk_format_get_blocksize(desc->format); pipeline->attrib_ends[desc->location] = end; + if (pipeline->binding_stride[desc->binding]) + pipeline->attrib_index_offset[desc->location] = + desc->offset / pipeline->binding_stride[desc->binding]; pipeline->attrib_bindings[desc->location] = desc->binding; } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 39ab7b50322..7c8eee3de92 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1730,6 +1730,7 @@ struct radv_pipeline { uint8_t attrib_bindings[MAX_VERTEX_ATTRIBS]; uint32_t attrib_ends[MAX_VERTEX_ATTRIBS]; + uint32_t attrib_index_offset[MAX_VERTEX_ATTRIBS]; bool use_per_attribute_vb_descs; uint32_t vb_desc_usage_mask;