Mesa (main): panvk: Add address/range helpers for panvk_buffer

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 2 22:55:56 UTC 2022


Module: Mesa
Branch: main
Commit: 763744aa8b0bc592f972c131da304ab29f054c3b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=763744aa8b0bc592f972c131da304ab29f054c3b

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Wed Apr 27 17:28:26 2022 -0500

panvk: Add address/range helpers for panvk_buffer

The range helper is taken from ANV; the gpu_ptr one is original.  This
also fixes a few more bugs where we weren't adding offsets in properly.

Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16216>

---

 src/panfrost/vulkan/panvk_cmd_buffer.c        |  7 ++++---
 src/panfrost/vulkan/panvk_private.h           | 26 ++++++++++++++++++++++++++
 src/panfrost/vulkan/panvk_vX_cmd_buffer.c     | 14 +++++---------
 src/panfrost/vulkan/panvk_vX_cs.c             |  7 +++----
 src/panfrost/vulkan/panvk_vX_descriptor_set.c |  9 ++++-----
 src/panfrost/vulkan/panvk_vX_image.c          |  7 +++----
 src/panfrost/vulkan/panvk_vX_meta_copy.c      | 16 +++++++---------
 7 files changed, 52 insertions(+), 34 deletions(-)

diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c
index 8c7df9c4bac..2ad47183d25 100644
--- a/src/panfrost/vulkan/panvk_cmd_buffer.c
+++ b/src/panfrost/vulkan/panvk_cmd_buffer.c
@@ -47,11 +47,12 @@ panvk_CmdBindVertexBuffers(VkCommandBuffer commandBuffer,
    assert(firstBinding + bindingCount <= MAX_VBS);
 
    for (uint32_t i = 0; i < bindingCount; i++) {
-      struct panvk_buffer *buf = panvk_buffer_from_handle(pBuffers[i]);
+      VK_FROM_HANDLE(panvk_buffer, buffer, pBuffers[i]);
 
       cmdbuf->state.vb.bufs[firstBinding + i].address =
-        buf->bo->ptr.gpu + buf->bo_offset + pOffsets[i];
-      cmdbuf->state.vb.bufs[firstBinding + i].size = buf->size - pOffsets[i];
+         panvk_buffer_gpu_ptr(buffer, pOffsets[i]);
+      cmdbuf->state.vb.bufs[firstBinding + i].size =
+         panvk_buffer_range(buffer, pOffsets[i], VK_WHOLE_SIZE);
    }
 
    cmdbuf->state.vb.count = MAX2(cmdbuf->state.vb.count, firstBinding + bindingCount);
diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h
index e1e54bae0e2..350068542b5 100644
--- a/src/panfrost/vulkan/panvk_private.h
+++ b/src/panfrost/vulkan/panvk_private.h
@@ -512,6 +512,32 @@ struct panvk_buffer {
    VkDeviceSize bo_offset;
 };
 
+static inline mali_ptr
+panvk_buffer_gpu_ptr(const struct panvk_buffer *buffer, uint64_t offset)
+{
+   if (buffer->bo == NULL)
+      return 0;
+
+   return buffer->bo->ptr.gpu + buffer->bo_offset + offset;
+}
+
+static inline uint64_t
+panvk_buffer_range(const struct panvk_buffer *buffer,
+                   uint64_t offset, uint64_t range)
+{
+   if (buffer->bo == NULL)
+      return 0;
+
+   assert(offset <= buffer->size);
+   if (range == VK_WHOLE_SIZE) {
+      return buffer->size - offset;
+   } else {
+      assert(range + offset >= range);
+      assert(range + offset <= buffer->size);
+      return range;
+   }
+}
+
 enum panvk_dynamic_state_bits {
    PANVK_DYNAMIC_VIEWPORT = 1 << 0,
    PANVK_DYNAMIC_SCISSOR = 1 << 1,
diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c
index 0a613738d0c..ef1ab4b0881 100644
--- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c
+++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c
@@ -318,12 +318,9 @@ panvk_sysval_upload_ssbo_info(struct panvk_cmd_buffer *cmdbuf,
          ssbo = &desc_state->dyn.ssbos[ssbo_id - pipeline->layout->num_ssbos];
 
       if (ssbo) {
-         data->u64[0] = ssbo->buffer->bo->ptr.gpu +
-                        ssbo->buffer->bo_offset +
-                        ssbo->offset;
-         data->u32[2] = ssbo->size == VK_WHOLE_SIZE ?
-                        ssbo->buffer->size - ssbo->offset :
-                        ssbo->size;
+         data->u64[0] = panvk_buffer_gpu_ptr(ssbo->buffer, ssbo->offset);
+         data->u32[2] = panvk_buffer_range(ssbo->buffer,
+                                           ssbo->offset, ssbo->size);
       }
    }
 }
@@ -1067,9 +1064,8 @@ panvk_per_arch(CmdDrawIndexed)(VkCommandBuffer commandBuffer,
                              panfrost_padded_vertex_count(vertex_range) :
                              vertex_range,
       .offset_start = min_vertex + vertexOffset,
-      .indices = cmdbuf->state.ib.buffer->bo->ptr.gpu +
-                 cmdbuf->state.ib.buffer->bo_offset +
-                 cmdbuf->state.ib.offset +
+      .indices = panvk_buffer_gpu_ptr(cmdbuf->state.ib.buffer,
+                                      cmdbuf->state.ib.offset) +
                  (firstIndex * (cmdbuf->state.ib.index_size / 8)),
    };
 
diff --git a/src/panfrost/vulkan/panvk_vX_cs.c b/src/panfrost/vulkan/panvk_vX_cs.c
index 619f6c76c62..c4643e014ec 100644
--- a/src/panfrost/vulkan/panvk_vX_cs.c
+++ b/src/panfrost/vulkan/panvk_vX_cs.c
@@ -408,10 +408,9 @@ panvk_per_arch(emit_ubos)(const struct panvk_pipeline *pipeline,
    unsigned offset = pipeline->layout->num_ubos;
    for (unsigned i = 0; i < pipeline->layout->num_dyn_ubos; i++) {
       const struct panvk_buffer_desc *bdesc = &state->dyn.ubos[i];
-      size_t size = (bdesc->size == VK_WHOLE_SIZE && bdesc->buffer) ?
-                    (bdesc->buffer->bo->size - bdesc->offset) :
-                    bdesc->size;
-      mali_ptr address = bdesc->buffer ? bdesc->buffer->bo->ptr.gpu + bdesc->offset : 0;
+      mali_ptr address = panvk_buffer_gpu_ptr(bdesc->buffer, bdesc->offset);
+      size_t size = panvk_buffer_range(bdesc->buffer,
+                                       bdesc->offset, bdesc->size);
 
       if (size)
          panvk_per_arch(emit_ubo)(address, size, &ubos[offset + i]);
diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c
index 7ecc3fe99ca..371e1961c00 100644
--- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c
+++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c
@@ -205,11 +205,10 @@ panvk_per_arch(set_ubo_desc)(void *ubo,
                              const VkDescriptorBufferInfo *pBufferInfo)
 {
    VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer);
-   size_t size = pBufferInfo->range == VK_WHOLE_SIZE ?
-                 (buffer->bo->size - pBufferInfo->offset) :
-                 pBufferInfo->range;
-
-   panvk_per_arch(emit_ubo)(buffer->bo->ptr.gpu + pBufferInfo->offset, size,  ubo);
+   mali_ptr ptr = panvk_buffer_gpu_ptr(buffer, pBufferInfo->offset);
+   size_t size = panvk_buffer_range(buffer, pBufferInfo->offset,
+                                    pBufferInfo->range);
+   panvk_per_arch(emit_ubo)(ptr, size, ubo);
 }
 
 static void
diff --git a/src/panfrost/vulkan/panvk_vX_image.c b/src/panfrost/vulkan/panvk_vX_image.c
index 4692ee089a4..b35a8c19f92 100644
--- a/src/panfrost/vulkan/panvk_vX_image.c
+++ b/src/panfrost/vulkan/panvk_vX_image.c
@@ -197,10 +197,9 @@ panvk_per_arch(CreateBufferView)(VkDevice _device,
    view->fmt = vk_format_to_pipe_format(pCreateInfo->format);
 
    struct panfrost_device *pdev = &device->physical_device->pdev;
-   unsigned offset = buffer->bo_offset + pCreateInfo->offset;
-   mali_ptr address = buffer->bo->ptr.gpu + offset;
-   unsigned size = pCreateInfo->range == VK_WHOLE_SIZE ?
-                   buffer->bo->size - offset : pCreateInfo->range;
+   mali_ptr address = panvk_buffer_gpu_ptr(buffer, pCreateInfo->offset);
+   unsigned size = panvk_buffer_range(buffer, pCreateInfo->offset,
+                                      pCreateInfo->range);
    unsigned blksz = util_format_get_blocksize(view->fmt);
    unsigned width = size / blksz;
 
diff --git a/src/panfrost/vulkan/panvk_vX_meta_copy.c b/src/panfrost/vulkan/panvk_vX_meta_copy.c
index 36ef246f8c4..c29a857fbf4 100644
--- a/src/panfrost/vulkan/panvk_vX_meta_copy.c
+++ b/src/panfrost/vulkan/panvk_vX_meta_copy.c
@@ -1154,7 +1154,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf,
 
    unsigned buftexelsz = panvk_meta_copy_buf_texelsize(key.imgfmt, key.mask);
    struct panvk_meta_copy_buf2img_info info = {
-      .buf.ptr = buf->bo->ptr.gpu + buf->bo_offset + region->bufferOffset,
+      .buf.ptr = panvk_buffer_gpu_ptr(buf, region->bufferOffset),
       .buf.stride.line = (region->bufferRowLength ? : region->imageExtent.width) * buftexelsz,
    };
 
@@ -1598,7 +1598,7 @@ panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf,
       &cmdbuf->device->physical_device->meta.copy.img2buf[texdimidx][fmtidx].pushmap;
 
    struct panvk_meta_copy_img2buf_info info = {
-      .buf.ptr = buf->bo->ptr.gpu + buf->bo_offset + region->bufferOffset,
+      .buf.ptr = panvk_buffer_gpu_ptr(buf, region->bufferOffset),
       .buf.stride.line = (region->bufferRowLength ? : region->imageExtent.width) * buftexelsz,
       .img.offset.x = MAX2(region->imageOffset.x & ~15, 0),
       .img.extent.minx = MAX2(region->imageOffset.x, 0),
@@ -1832,8 +1832,8 @@ panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf,
    struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
 
    struct panvk_meta_copy_buf2buf_info info = {
-      .src = src->bo->ptr.gpu + src->bo_offset + region->srcOffset,
-      .dst = dst->bo->ptr.gpu + dst->bo_offset + region->dstOffset,
+      .src = panvk_buffer_gpu_ptr(src, region->srcOffset),
+      .dst = panvk_buffer_gpu_ptr(dst, region->dstOffset),
    };
 
    unsigned alignment = ffs((info.src | info.dst | region->size) & 15);
@@ -1994,13 +1994,11 @@ panvk_meta_fill_buf(struct panvk_cmd_buffer *cmdbuf,
 {
    struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
 
-   if (size == VK_WHOLE_SIZE)
-      size = (dst->size - offset) & ~3ULL;
-
    struct panvk_meta_fill_buf_info info = {
-      .start = dst->bo->ptr.gpu + dst->bo_offset + offset,
+      .start = panvk_buffer_gpu_ptr(dst, offset),
       .val = val,
    };
+   size = panvk_buffer_range(dst, offset, size);
 
    assert(!(offset & 3) && !(size & 3));
 
@@ -2060,7 +2058,7 @@ panvk_meta_update_buf(struct panvk_cmd_buffer *cmdbuf,
 
    struct panvk_meta_copy_buf2buf_info info = {
       .src = pan_pool_upload_aligned(&cmdbuf->desc_pool.base, data, size, 4),
-      .dst = dst->bo->ptr.gpu + dst->bo_offset + offset,
+      .dst = panvk_buffer_gpu_ptr(dst, offset),
    };
 
    unsigned log2blksz = ffs(sizeof(uint32_t)) - 1;



More information about the mesa-commit mailing list