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