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:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)),
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user