pavnk: Pass bind layouts to texture and image descriptor helpers

Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16276>
This commit is contained in:
Jason Ekstrand 2022-04-29 18:29:40 -05:00 committed by Marge Bot
parent 6ed298dce7
commit 714e125ae4
1 changed files with 34 additions and 25 deletions

View File

@ -392,62 +392,76 @@ panvk_set_sampler_desc(void *desc,
} }
static void static void
panvk_per_arch(set_texture_desc)(struct panvk_descriptor_set *set, panvk_set_tex_desc(struct panvk_descriptor_set *set,
unsigned idx, const struct panvk_descriptor_set_binding_layout *binding_layout,
unsigned elem,
const VkDescriptorImageInfo *pImageInfo) const VkDescriptorImageInfo *pImageInfo)
{ {
VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView); VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView);
unsigned tex_idx = binding_layout->tex_idx + elem;
#if PAN_ARCH >= 6 #if PAN_ARCH >= 6
memcpy(&((struct mali_texture_packed *)set->textures)[idx], memcpy(&((struct mali_texture_packed *)set->textures)[tex_idx],
view->descs.tex, pan_size(TEXTURE)); view->descs.tex, pan_size(TEXTURE));
#else #else
((mali_ptr *)set->textures)[idx] = view->bo->ptr.gpu; ((mali_ptr *)set->textures)[tex_idx] = view->bo->ptr.gpu;
#endif #endif
} }
static void static void
panvk_set_tex_buf_desc(struct panvk_device *dev, panvk_set_tex_buf_desc(struct panvk_descriptor_set *set,
struct panvk_descriptor_set *set, const struct panvk_descriptor_set_binding_layout *binding_layout,
unsigned idx, unsigned elem,
const VkBufferView bufferView) const VkBufferView bufferView)
{ {
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView); VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
unsigned tex_idx = binding_layout->tex_idx + elem;
#if PAN_ARCH >= 6 #if PAN_ARCH >= 6
memcpy(&((struct mali_texture_packed *)set->textures)[idx], memcpy(&((struct mali_texture_packed *)set->textures)[tex_idx],
view->descs.tex, pan_size(TEXTURE)); view->descs.tex, pan_size(TEXTURE));
#else #else
((mali_ptr *)set->textures)[idx] = view->bo->ptr.gpu; ((mali_ptr *)set->textures)[tex_idx] = view->bo->ptr.gpu;
#endif #endif
} }
static void static void
panvk_set_img_desc(struct panvk_device *dev, panvk_set_img_desc(struct panvk_device *dev,
struct panvk_descriptor_set *set, struct panvk_descriptor_set *set,
unsigned idx, const struct panvk_descriptor_set_binding_layout *binding_layout,
unsigned elem,
const VkDescriptorImageInfo *pImageInfo) const VkDescriptorImageInfo *pImageInfo)
{ {
const struct panfrost_device *pdev = &dev->physical_device->pdev; const struct panfrost_device *pdev = &dev->physical_device->pdev;
VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView); VK_FROM_HANDLE(panvk_image_view, view, pImageInfo->imageView);
void *attrib_buf = (uint8_t *)set->img_attrib_bufs + (pan_size(ATTRIBUTE_BUFFER) * 2 * idx);
set->img_fmts[idx] = pdev->formats[view->pview.format].hw; unsigned img_idx = binding_layout->img_idx + elem;
void *attrib_buf = (uint8_t *)set->img_attrib_bufs +
(pan_size(ATTRIBUTE_BUFFER) * 2 * img_idx);
set->img_fmts[img_idx] = pdev->formats[view->pview.format].hw;
memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2); memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2);
} }
static void static void
panvk_set_img_buf_desc(struct panvk_device *dev, panvk_set_img_buf_desc(struct panvk_device *dev,
struct panvk_descriptor_set *set, struct panvk_descriptor_set *set,
unsigned idx, const struct panvk_descriptor_set_binding_layout *binding_layout,
unsigned elem,
const VkBufferView bufferView) const VkBufferView bufferView)
{ {
const struct panfrost_device *pdev = &dev->physical_device->pdev; const struct panfrost_device *pdev = &dev->physical_device->pdev;
VK_FROM_HANDLE(panvk_buffer_view, view, bufferView); VK_FROM_HANDLE(panvk_buffer_view, view, bufferView);
void *attrib_buf = (uint8_t *)set->img_attrib_bufs + (pan_size(ATTRIBUTE_BUFFER) * 2 * idx); unsigned img_idx = binding_layout->img_idx + elem;
set->img_fmts[idx] = pdev->formats[view->fmt].hw; void *attrib_buf = (uint8_t *)set->img_attrib_bufs +
(pan_size(ATTRIBUTE_BUFFER) * 2 * img_idx);
set->img_fmts[img_idx] = pdev->formats[view->fmt].hw;
memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2); memcpy(attrib_buf, view->descs.img_attrib_buf, pan_size(ATTRIBUTE_BUFFER) * 2);
} }
@ -496,17 +510,15 @@ panvk_per_arch(write_descriptor_set)(struct panvk_device *dev,
if (pDescriptorWrite->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE || if (pDescriptorWrite->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ||
pDescriptorWrite->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { pDescriptorWrite->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
unsigned tex = binding_layout->tex_idx + dest_offset + i;
panvk_per_arch(set_texture_desc)(set, tex, info); panvk_set_tex_desc(set, binding_layout, dest_offset + i, info);
} }
} }
break; break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
for (unsigned i = 0; i < ndescs; i++) { for (unsigned i = 0; i < ndescs; i++) {
unsigned tex = binding_layout->tex_idx + dest_offset + i; panvk_set_tex_buf_desc(set, binding_layout, dest_offset + i,
panvk_set_tex_buf_desc(dev, set, tex,
pDescriptorWrite->pTexelBufferView[src_offset + i]); pDescriptorWrite->pTexelBufferView[src_offset + i]);
} }
break; break;
@ -515,16 +527,13 @@ panvk_per_arch(write_descriptor_set)(struct panvk_device *dev,
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
for (unsigned i = 0; i < ndescs; i++) { for (unsigned i = 0; i < ndescs; i++) {
const VkDescriptorImageInfo *info = &pDescriptorWrite->pImageInfo[src_offset + i]; const VkDescriptorImageInfo *info = &pDescriptorWrite->pImageInfo[src_offset + i];
unsigned img = binding_layout->img_idx + dest_offset + i; panvk_set_img_desc(dev, set, binding_layout, dest_offset + i, info);
panvk_set_img_desc(dev, set, img, info);
} }
break; break;
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
for (unsigned i = 0; i < ndescs; i++) { for (unsigned i = 0; i < ndescs; i++) {
unsigned img = binding_layout->img_idx + dest_offset + i; panvk_set_img_buf_desc(dev, set, binding_layout, dest_offset + i,
panvk_set_img_buf_desc(dev, set, img,
pDescriptorWrite->pTexelBufferView[src_offset + i]); pDescriptorWrite->pTexelBufferView[src_offset + i]);
} }
break; break;