turnip: Store the computed iova in the tu_buffer.
We recently had a bug of forgeting to add the buf->bo_offset. Just make the easiest field to get be the bo->iova + buf->bo_offset already. Plus, a little less work at emit time. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14816>
This commit is contained in:
parent
ba44634e4d
commit
f460fb3f91
|
@ -1524,7 +1524,7 @@ tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd,
|
|||
for (uint32_t i = 0; i < layers; i++) {
|
||||
ops->dst(cs, &dst, i);
|
||||
|
||||
uint64_t src_va = tu_buffer_iova(src_buffer) + info->bufferOffset + layer_size * i;
|
||||
uint64_t src_va = src_buffer->iova + info->bufferOffset + layer_size * i;
|
||||
if ((src_va & 63) || (pitch & 63)) {
|
||||
for (uint32_t y = 0; y < extent.height; y++) {
|
||||
uint32_t x = (src_va & 63) / util_format_get_blocksize(src_format);
|
||||
|
@ -1602,7 +1602,7 @@ tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd,
|
|||
for (uint32_t i = 0; i < layers; i++) {
|
||||
ops->src(cmd, cs, &src, i, VK_FILTER_NEAREST);
|
||||
|
||||
uint64_t dst_va = tu_buffer_iova(dst_buffer) + info->bufferOffset + layer_size * i;
|
||||
uint64_t dst_va = dst_buffer->iova + info->bufferOffset + layer_size * i;
|
||||
if ((dst_va & 63) || (pitch & 63)) {
|
||||
for (uint32_t y = 0; y < extent.height; y++) {
|
||||
uint32_t x = (dst_va & 63) / util_format_get_blocksize(dst_format);
|
||||
|
@ -1915,8 +1915,8 @@ tu_CmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
|
|||
for (unsigned i = 0; i < pCopyBufferInfo->regionCount; ++i) {
|
||||
const VkBufferCopy2KHR *region = &pCopyBufferInfo->pRegions[i];
|
||||
copy_buffer(cmd,
|
||||
tu_buffer_iova(dst_buffer) + region->dstOffset,
|
||||
tu_buffer_iova(src_buffer) + region->srcOffset,
|
||||
dst_buffer->iova + region->dstOffset,
|
||||
src_buffer->iova + region->srcOffset,
|
||||
region->size, 1);
|
||||
}
|
||||
}
|
||||
|
@ -1939,7 +1939,7 @@ tu_CmdUpdateBuffer(VkCommandBuffer commandBuffer,
|
|||
}
|
||||
|
||||
memcpy(tmp.map, pData, dataSize);
|
||||
copy_buffer(cmd, tu_buffer_iova(buffer) + dstOffset, tmp.iova, dataSize, 4);
|
||||
copy_buffer(cmd, buffer->iova + dstOffset, tmp.iova, dataSize, 4);
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
|
@ -1957,7 +1957,7 @@ tu_CmdFillBuffer(VkCommandBuffer commandBuffer,
|
|||
if (fillSize == VK_WHOLE_SIZE)
|
||||
fillSize = buffer->size - dstOffset;
|
||||
|
||||
uint64_t dst_va = tu_buffer_iova(buffer) + dstOffset;
|
||||
uint64_t dst_va = buffer->iova + dstOffset;
|
||||
uint32_t blocks = fillSize / 4;
|
||||
|
||||
ops->setup(cmd, cs, PIPE_FORMAT_R32_UINT, VK_IMAGE_ASPECT_COLOR_BIT, 0, true, false,
|
||||
|
|
|
@ -1777,7 +1777,7 @@ tu_CmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer,
|
|||
cmd->state.vb[firstBinding + i].size = 0;
|
||||
} else {
|
||||
struct tu_buffer *buf = tu_buffer_from_handle(pBuffers[i]);
|
||||
cmd->state.vb[firstBinding + i].base = tu_buffer_iova(buf) + pOffsets[i];
|
||||
cmd->state.vb[firstBinding + i].base = buf->iova + pOffsets[i];
|
||||
cmd->state.vb[firstBinding + i].size = pSizes ? pSizes[i] : (buf->size - pOffsets[i]);
|
||||
}
|
||||
|
||||
|
@ -1843,7 +1843,7 @@ tu_CmdBindIndexBuffer(VkCommandBuffer commandBuffer,
|
|||
|
||||
assert(buf->size >= offset);
|
||||
|
||||
cmd->state.index_va = buf->bo->iova + buf->bo_offset + offset;
|
||||
cmd->state.index_va = buf->iova + offset;
|
||||
cmd->state.max_index_count = (buf->size - offset) >> index_shift;
|
||||
cmd->state.index_size = index_size;
|
||||
}
|
||||
|
@ -2076,8 +2076,8 @@ tu_CmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,
|
|||
|
||||
for (uint32_t i = 0; i < bindingCount; i++) {
|
||||
TU_FROM_HANDLE(tu_buffer, buf, pBuffers[i]);
|
||||
uint64_t iova = buf->bo->iova + buf->bo_offset + pOffsets[i];
|
||||
uint32_t size = buf->bo->size - buf->bo_offset - pOffsets[i];
|
||||
uint64_t iova = buf->iova + pOffsets[i];
|
||||
uint32_t size = buf->bo->size - (iova - buf->bo->iova);
|
||||
uint32_t idx = i + firstBinding;
|
||||
|
||||
if (pSizes && pSizes[i] != VK_WHOLE_SIZE)
|
||||
|
@ -2129,7 +2129,7 @@ tu_CmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit(cs, CP_MEM_TO_REG_0_REG(REG_A6XX_VPC_SO_BUFFER_OFFSET(idx)) |
|
||||
CP_MEM_TO_REG_0_UNK31 |
|
||||
CP_MEM_TO_REG_0_CNT(1));
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + counter_buffer_offset);
|
||||
tu_cs_emit_qw(cs, buf->iova + counter_buffer_offset);
|
||||
|
||||
if (offset) {
|
||||
tu_cs_emit_pkt7(cs, CP_REG_RMW, 3);
|
||||
|
@ -2195,7 +2195,7 @@ tu_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit_pkt7(cs, CP_REG_TO_MEM, 3);
|
||||
tu_cs_emit(cs, CP_REG_TO_MEM_0_REG(REG_A6XX_CP_SCRATCH_REG(0)) |
|
||||
CP_REG_TO_MEM_0_CNT(1));
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + counter_buffer_offset);
|
||||
tu_cs_emit_qw(cs, buf->iova + counter_buffer_offset);
|
||||
}
|
||||
|
||||
tu_cond_exec_end(cs);
|
||||
|
@ -4266,7 +4266,7 @@ tu_CmdDrawIndirect(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit(cs, A6XX_CP_DRAW_INDIRECT_MULTI_1_OPCODE(INDIRECT_OP_NORMAL) |
|
||||
A6XX_CP_DRAW_INDIRECT_MULTI_1_DST_OFF(vs_params_offset(cmd)));
|
||||
tu_cs_emit(cs, drawCount);
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset);
|
||||
tu_cs_emit_qw(cs, buf->iova + offset);
|
||||
tu_cs_emit(cs, stride);
|
||||
}
|
||||
|
||||
|
@ -4295,7 +4295,7 @@ tu_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit(cs, drawCount);
|
||||
tu_cs_emit_qw(cs, cmd->state.index_va);
|
||||
tu_cs_emit(cs, cmd->state.max_index_count);
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset);
|
||||
tu_cs_emit_qw(cs, buf->iova + offset);
|
||||
tu_cs_emit(cs, stride);
|
||||
}
|
||||
|
||||
|
@ -4329,8 +4329,8 @@ tu_CmdDrawIndirectCount(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit(cs, A6XX_CP_DRAW_INDIRECT_MULTI_1_OPCODE(INDIRECT_OP_INDIRECT_COUNT) |
|
||||
A6XX_CP_DRAW_INDIRECT_MULTI_1_DST_OFF(vs_params_offset(cmd)));
|
||||
tu_cs_emit(cs, drawCount);
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset);
|
||||
tu_cs_emit_qw(cs, count_buf->bo->iova + count_buf->bo_offset + countBufferOffset);
|
||||
tu_cs_emit_qw(cs, buf->iova + offset);
|
||||
tu_cs_emit_qw(cs, count_buf->iova + countBufferOffset);
|
||||
tu_cs_emit(cs, stride);
|
||||
}
|
||||
|
||||
|
@ -4361,8 +4361,8 @@ tu_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit(cs, drawCount);
|
||||
tu_cs_emit_qw(cs, cmd->state.index_va);
|
||||
tu_cs_emit(cs, cmd->state.max_index_count);
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset);
|
||||
tu_cs_emit_qw(cs, count_buf->bo->iova + count_buf->bo_offset + countBufferOffset);
|
||||
tu_cs_emit_qw(cs, buf->iova + offset);
|
||||
tu_cs_emit_qw(cs, count_buf->iova + countBufferOffset);
|
||||
tu_cs_emit(cs, stride);
|
||||
}
|
||||
|
||||
|
@ -4393,7 +4393,7 @@ tu_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,
|
|||
tu_cs_emit_pkt7(cs, CP_DRAW_AUTO, 6);
|
||||
tu_cs_emit(cs, tu_draw_initiator(cmd, DI_SRC_SEL_AUTO_XFB));
|
||||
tu_cs_emit(cs, instanceCount);
|
||||
tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + counterBufferOffset);
|
||||
tu_cs_emit_qw(cs, buf->iova + counterBufferOffset);
|
||||
tu_cs_emit(cs, counterOffset);
|
||||
tu_cs_emit(cs, vertexStride);
|
||||
}
|
||||
|
@ -4474,13 +4474,13 @@ tu_emit_compute_driver_params(struct tu_cmd_buffer *cmd,
|
|||
CP_LOAD_STATE6_0_STATE_SRC(SS6_INDIRECT) |
|
||||
CP_LOAD_STATE6_0_STATE_BLOCK(tu6_stage2shadersb(type)) |
|
||||
CP_LOAD_STATE6_0_NUM_UNIT(1));
|
||||
tu_cs_emit_qw(cs, tu_buffer_iova(info->indirect) + info->indirect_offset);
|
||||
tu_cs_emit_qw(cs, info->indirect->iova + info->indirect_offset);
|
||||
} else {
|
||||
/* Vulkan guarantees only 4 byte alignment for indirect_offset.
|
||||
* However, CP_LOAD_STATE.EXT_SRC_ADDR needs 16 byte alignment.
|
||||
*/
|
||||
|
||||
uint64_t indirect_iova = tu_buffer_iova(info->indirect) + info->indirect_offset;
|
||||
uint64_t indirect_iova = info->indirect->iova + info->indirect_offset;
|
||||
|
||||
for (uint32_t i = 0; i < 3; i++) {
|
||||
tu_cs_emit_pkt7(cs, CP_MEM_TO_MEM, 5);
|
||||
|
@ -4580,7 +4580,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd,
|
|||
trace_start_compute(&cmd->trace, cs);
|
||||
|
||||
if (info->indirect) {
|
||||
uint64_t iova = tu_buffer_iova(info->indirect) + info->indirect_offset;
|
||||
uint64_t iova = info->indirect->iova + info->indirect_offset;
|
||||
|
||||
tu_cs_emit_pkt7(cs, CP_EXEC_CS_INDIRECT, 4);
|
||||
tu_cs_emit(cs, 0x00000000);
|
||||
|
@ -4953,7 +4953,7 @@ tu_CmdBeginConditionalRenderingEXT(VkCommandBuffer commandBuffer,
|
|||
tu_emit_cache_flush(cmd, cs);
|
||||
|
||||
TU_FROM_HANDLE(tu_buffer, buf, pConditionalRenderingBegin->buffer);
|
||||
uint64_t iova = tu_buffer_iova(buf) + pConditionalRenderingBegin->offset;
|
||||
uint64_t iova = buf->iova + pConditionalRenderingBegin->offset;
|
||||
|
||||
/* qcom doesn't support 32-bit reference values, only 64-bit, but Vulkan
|
||||
* mandates 32-bit comparisons. Our workaround is to copy the the reference
|
||||
|
|
|
@ -858,7 +858,7 @@ write_buffer_descriptor(const struct tu_device *device,
|
|||
TU_FROM_HANDLE(tu_buffer, buffer, buffer_info->buffer);
|
||||
|
||||
assert((buffer_info->offset & 63) == 0); /* minStorageBufferOffsetAlignment */
|
||||
uint64_t va = tu_buffer_iova(buffer) + buffer_info->offset;
|
||||
uint64_t va = buffer->iova + buffer_info->offset;
|
||||
uint32_t range = get_range(buffer, buffer_info->offset, buffer_info->range);
|
||||
|
||||
/* newer a6xx allows using 16-bit descriptor for both 16-bit and 32-bit access */
|
||||
|
@ -891,7 +891,7 @@ write_ubo_descriptor(uint32_t *dst, const VkDescriptorBufferInfo *buffer_info)
|
|||
uint32_t range = get_range(buffer, buffer_info->offset, buffer_info->range);
|
||||
/* The HW range is in vec4 units */
|
||||
range = ALIGN_POT(range, 16) / 16;
|
||||
uint64_t va = tu_buffer_iova(buffer) + buffer_info->offset;
|
||||
uint64_t va = buffer->iova + buffer_info->offset;
|
||||
|
||||
dst[0] = A6XX_UBO_0_BASE_LO(va);
|
||||
dst[1] = A6XX_UBO_1_BASE_HI(va >> 32) | A6XX_UBO_1_SIZE(range);
|
||||
|
|
|
@ -2268,7 +2268,7 @@ tu_BindBufferMemory2(VkDevice device,
|
|||
|
||||
if (mem) {
|
||||
buffer->bo = &mem->bo;
|
||||
buffer->bo_offset = pBindInfos[i].memoryOffset;
|
||||
buffer->iova = mem->bo.iova + pBindInfos[i].memoryOffset;
|
||||
} else {
|
||||
buffer->bo = NULL;
|
||||
}
|
||||
|
@ -2731,7 +2731,7 @@ tu_GetBufferDeviceAddress(VkDevice _device,
|
|||
{
|
||||
TU_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer);
|
||||
|
||||
return tu_buffer_iova(buffer);
|
||||
return buffer->iova;
|
||||
}
|
||||
|
||||
uint64_t tu_GetBufferOpaqueCaptureAddress(
|
||||
|
|
|
@ -662,7 +662,7 @@ tu_buffer_view_init(struct tu_buffer_view *view,
|
|||
|
||||
fdl6_buffer_view_init(
|
||||
view->descriptor, tu_vk_format_to_pipe_format(pCreateInfo->format),
|
||||
swiz, tu_buffer_iova(buffer) + pCreateInfo->offset, range);
|
||||
swiz, buffer->iova + pCreateInfo->offset, range);
|
||||
}
|
||||
|
||||
VKAPI_ATTR VkResult VKAPI_CALL
|
||||
|
|
|
@ -748,15 +748,9 @@ struct tu_buffer
|
|||
VkBufferCreateFlags flags;
|
||||
|
||||
struct tu_bo *bo;
|
||||
VkDeviceSize bo_offset;
|
||||
uint64_t iova;
|
||||
};
|
||||
|
||||
static inline uint64_t
|
||||
tu_buffer_iova(struct tu_buffer *buffer)
|
||||
{
|
||||
return buffer->bo->iova + buffer->bo_offset;
|
||||
}
|
||||
|
||||
const char *
|
||||
tu_get_debug_option_name(int id);
|
||||
|
||||
|
|
|
@ -603,7 +603,7 @@ emit_copy_query_pool_results(struct tu_cmd_buffer *cmdbuf,
|
|||
for (uint32_t i = 0; i < queryCount; i++) {
|
||||
uint32_t query = firstQuery + i;
|
||||
uint64_t available_iova = query_available_iova(pool, query);
|
||||
uint64_t buffer_iova = tu_buffer_iova(buffer) + dstOffset + i * stride;
|
||||
uint64_t buffer_iova = buffer->iova + dstOffset + i * stride;
|
||||
uint32_t result_count = get_result_count(pool);
|
||||
uint32_t statistics = pool->pipeline_statistics;
|
||||
|
||||
|
|
Loading…
Reference in New Issue