mirror of https://gitlab.freedesktop.org/mesa/mesa
venus: optimize set update template data population
also avoids not-always-valid void * ptr arithmatic Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28686>
This commit is contained in:
parent
498f1d7eb1
commit
378db530ae
|
@ -1086,14 +1086,12 @@ struct vn_update_descriptor_sets *
|
||||||
vn_update_descriptor_set_with_template_locked(
|
vn_update_descriptor_set_with_template_locked(
|
||||||
struct vn_descriptor_update_template *templ,
|
struct vn_descriptor_update_template *templ,
|
||||||
VkDescriptorSet set_handle,
|
VkDescriptorSet set_handle,
|
||||||
const void *data)
|
const uint8_t *data)
|
||||||
{
|
{
|
||||||
struct vn_update_descriptor_sets *update = templ->update;
|
struct vn_update_descriptor_sets *update = templ->update;
|
||||||
struct vn_descriptor_set *set = vn_descriptor_set_from_handle(set_handle);
|
struct vn_descriptor_set *set = vn_descriptor_set_from_handle(set_handle);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < update->write_count; i++) {
|
for (uint32_t i = 0; i < update->write_count; i++) {
|
||||||
const struct vn_descriptor_update_template_entry *entry =
|
|
||||||
&templ->entries[i];
|
|
||||||
const struct vn_descriptor_set_layout *set_layout =
|
const struct vn_descriptor_set_layout *set_layout =
|
||||||
templ->push.set_layout ? templ->push.set_layout : set->layout;
|
templ->push.set_layout ? templ->push.set_layout : set->layout;
|
||||||
const struct vn_descriptor_set_layout_binding *binding =
|
const struct vn_descriptor_set_layout_binding *binding =
|
||||||
|
@ -1103,6 +1101,8 @@ vn_update_descriptor_set_with_template_locked(
|
||||||
|
|
||||||
write->dstSet = set_handle;
|
write->dstSet = set_handle;
|
||||||
|
|
||||||
|
const uint8_t *ptr = data + templ->entries[i].offset;
|
||||||
|
const size_t stride = templ->entries[i].stride;
|
||||||
switch (write->descriptorType) {
|
switch (write->descriptorType) {
|
||||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||||
|
@ -1117,23 +1117,23 @@ vn_update_descriptor_set_with_template_locked(
|
||||||
!binding->has_immutable_samplers;
|
!binding->has_immutable_samplers;
|
||||||
const bool need_view =
|
const bool need_view =
|
||||||
write->descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER;
|
write->descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER;
|
||||||
const VkDescriptorImageInfo *src =
|
const VkDescriptorImageInfo *src = (const void *)ptr;
|
||||||
data + entry->offset + entry->stride * j;
|
|
||||||
VkDescriptorImageInfo *dst =
|
VkDescriptorImageInfo *dst =
|
||||||
(VkDescriptorImageInfo *)&write->pImageInfo[j];
|
(VkDescriptorImageInfo *)&write->pImageInfo[j];
|
||||||
|
|
||||||
dst->sampler = need_sampler ? src->sampler : VK_NULL_HANDLE;
|
dst->sampler = need_sampler ? src->sampler : VK_NULL_HANDLE;
|
||||||
dst->imageView = need_view ? src->imageView : VK_NULL_HANDLE;
|
dst->imageView = need_view ? src->imageView : VK_NULL_HANDLE;
|
||||||
dst->imageLayout = src->imageLayout;
|
dst->imageLayout = src->imageLayout;
|
||||||
|
ptr += stride;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||||
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
||||||
const VkBufferView *src =
|
const VkBufferView *src = (const void *)ptr;
|
||||||
data + entry->offset + entry->stride * j;
|
|
||||||
VkBufferView *dst = (VkBufferView *)&write->pTexelBufferView[j];
|
VkBufferView *dst = (VkBufferView *)&write->pTexelBufferView[j];
|
||||||
*dst = *src;
|
*dst = *src;
|
||||||
|
ptr += stride;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||||
|
@ -1141,18 +1141,18 @@ vn_update_descriptor_set_with_template_locked(
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||||
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
||||||
const VkDescriptorBufferInfo *src =
|
const VkDescriptorBufferInfo *src = (const void *)ptr;
|
||||||
data + entry->offset + entry->stride * j;
|
|
||||||
VkDescriptorBufferInfo *dst =
|
VkDescriptorBufferInfo *dst =
|
||||||
(VkDescriptorBufferInfo *)&write->pBufferInfo[j];
|
(VkDescriptorBufferInfo *)&write->pBufferInfo[j];
|
||||||
*dst = *src;
|
*dst = *src;
|
||||||
|
ptr += stride;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
|
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
|
||||||
VkWriteDescriptorSetInlineUniformBlock *iub_data =
|
VkWriteDescriptorSetInlineUniformBlock *iub_data =
|
||||||
(VkWriteDescriptorSetInlineUniformBlock *)vk_find_struct_const(
|
(VkWriteDescriptorSetInlineUniformBlock *)vk_find_struct_const(
|
||||||
write->pNext, WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK);
|
write->pNext, WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK);
|
||||||
iub_data->pData = data + entry->offset;
|
iub_data->pData = (const void *)ptr;
|
||||||
break;
|
break;
|
||||||
case VK_DESCRIPTOR_TYPE_MUTABLE_EXT:
|
case VK_DESCRIPTOR_TYPE_MUTABLE_EXT:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -150,7 +150,7 @@ struct vn_update_descriptor_sets *
|
||||||
vn_update_descriptor_set_with_template_locked(
|
vn_update_descriptor_set_with_template_locked(
|
||||||
struct vn_descriptor_update_template *templ,
|
struct vn_descriptor_update_template *templ,
|
||||||
VkDescriptorSet set_handle,
|
VkDescriptorSet set_handle,
|
||||||
const void *data);
|
const uint8_t *data);
|
||||||
|
|
||||||
void
|
void
|
||||||
vn_descriptor_set_layout_destroy(struct vn_device *dev,
|
vn_descriptor_set_layout_destroy(struct vn_device *dev,
|
||||||
|
|
Loading…
Reference in New Issue