From 763744aa8b0bc592f972c131da304ab29f054c3b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 27 Apr 2022 17:28:26 -0500 Subject: [PATCH] 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 Part-of: --- 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 8c7df9c..2ad4718 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 e1e54ba..3500685 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 0a61373..ef1ab4b 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 619f6c7..c4643e0 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 7ecc3fe..371e196 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 4692ee0..b35a8c1 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 36ef246..c29a857 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; -- 2.7.4