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@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16216>
This commit is contained in:
Jason Ekstrand
2022-04-27 17:28:26 -05:00
parent 631f47e83a
commit 763744aa8b
7 changed files with 52 additions and 34 deletions
+4 -3
View File
@@ -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);
+26
View File
@@ -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,
+5 -9
View File
@@ -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)),
};
+3 -4
View File
@@ -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]);
@@ -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
+3 -4
View File
@@ -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;
+7 -9
View File
@@ -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;