From 648d843813fe4af0a44bf2e2016a4e951e4d0df2 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sun, 2 Mar 2025 18:47:18 +0200 Subject: [PATCH] anv: move xfb buffer storage to 64bit address + mocs Signed-off-by: Lionel Landwerlin Reviewed-by: Ivan Briano Part-of: --- src/intel/vulkan/anv_cmd_buffer.c | 15 +++++++++------ src/intel/vulkan/anv_private.h | 6 +++--- src/intel/vulkan/genX_cmd_draw.c | 9 ++++----- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 4374fc5cfc4..95be41cd07a 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -1155,14 +1155,17 @@ void anv_CmdBindTransformFeedbackBuffersEXT( assert(firstBinding + bindingCount <= MAX_XFB_BUFFERS); for (uint32_t i = 0; i < bindingCount; i++) { if (pBuffers[i] == VK_NULL_HANDLE) { - xfb[firstBinding + i].buffer = NULL; + xfb[firstBinding + i] = (struct anv_xfb_binding) { 0 }; } else { ANV_FROM_HANDLE(anv_buffer, buffer, pBuffers[i]); - xfb[firstBinding + i].buffer = buffer; - xfb[firstBinding + i].offset = pOffsets[i]; - xfb[firstBinding + i].size = - vk_buffer_range(&buffer->vk, pOffsets[i], - pSizes ? pSizes[i] : VK_WHOLE_SIZE); + xfb[firstBinding + i] = (struct anv_xfb_binding) { + .addr = anv_address_physical( + anv_address_add(buffer->address, pOffsets[i])), + .size = vk_buffer_range(&buffer->vk, pOffsets[i], + pSizes ? pSizes[i] : VK_WHOLE_SIZE), + .mocs = anv_mocs(cmd_buffer->device, buffer->address.bo, + ISL_SURF_USAGE_STREAM_OUT_BIT), + }; } } } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 0b0e038d615..9dd7a1c3b3a 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3685,9 +3685,9 @@ struct anv_vertex_binding { }; struct anv_xfb_binding { - struct anv_buffer * buffer; - VkDeviceSize offset; - VkDeviceSize size; + uint64_t addr; + uint32_t mocs; + VkDeviceSize size; }; struct anv_push_constants { diff --git a/src/intel/vulkan/genX_cmd_draw.c b/src/intel/vulkan/genX_cmd_draw.c index 6465f35f060..0db35e1a91f 100644 --- a/src/intel/vulkan/genX_cmd_draw.c +++ b/src/intel/vulkan/genX_cmd_draw.c @@ -821,11 +821,10 @@ cmd_buffer_flush_gfx_state(struct anv_cmd_buffer *cmd_buffer) sob._3DCommandSubOpcode = SO_BUFFER_INDEX_0_CMD + idx; #endif - if (cmd_buffer->state.xfb_enabled && xfb->buffer && xfb->size != 0) { - sob.MOCS = anv_mocs(cmd_buffer->device, xfb->buffer->address.bo, - ISL_SURF_USAGE_STREAM_OUT_BIT); - sob.SurfaceBaseAddress = anv_address_add(xfb->buffer->address, - xfb->offset); + if (cmd_buffer->state.xfb_enabled && + xfb->addr != 0 && xfb->size != 0) { + sob.MOCS = xfb->mocs; + sob.SurfaceBaseAddress = anv_address_from_u64(xfb->addr); sob.SOBufferEnable = true; sob.StreamOffsetWriteEnable = false; /* Size is in DWords - 1 */