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:
Emma Anholt 2022-01-31 21:24:54 -08:00 committed by Marge Bot
parent ba44634e4d
commit f460fb3f91
7 changed files with 30 additions and 36 deletions

View File

@ -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,

View File

@ -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

View File

@ -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);

View File

@ -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(

View File

@ -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

View File

@ -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);

View File

@ -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;