Mesa (master): turnip: implement CmdDrawIndirectByteCountEXT

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 23 11:04:49 UTC 2020


Module: Mesa
Branch: master
Commit: 20e12d9ef4e29bd64964c3c22fc8876d1c1c2977
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=20e12d9ef4e29bd64964c3c22fc8876d1c1c2977

Author: Jonathan Marek <jonathan at marek.ca>
Date:   Sat Jun 20 15:09:05 2020 -0400

turnip: implement CmdDrawIndirectByteCountEXT

Fixes these deqp tests:
dEQP-VK.transform_feedback.simple.backward_dependency*
dEQP-VK.transform_feedback.simple.draw_indirect*

Signed-off-by: Jonathan Marek <jonathan at marek.ca>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5579>

---

 src/freedreno/registers/adreno_pm4.xml |  2 +-
 src/freedreno/vulkan/tu_cmd_buffer.c   | 27 ++++++++++++++++++++-------
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/freedreno/registers/adreno_pm4.xml b/src/freedreno/registers/adreno_pm4.xml
index fb2d8f4f639..76ecd1a327a 100644
--- a/src/freedreno/registers/adreno_pm4.xml
+++ b/src/freedreno/registers/adreno_pm4.xml
@@ -107,7 +107,7 @@ xsi:schemaLocation="http://nouveau.freedesktop.org/ rules-ng.xsd">
 	<value name="DI_SRC_SEL_DMA" value="0"/>
 	<value name="DI_SRC_SEL_IMMEDIATE" value="1"/>
 	<value name="DI_SRC_SEL_AUTO_INDEX" value="2"/>
-	<value name="DI_SRC_SEL_RESERVED" value="3"/>
+	<value name="DI_SRC_SEL_AUTO_XFB" value="3"/>
 </enum>
 
 <enum name="pc_di_face_cull_sel">
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index 0c49f3b3a77..d6039184d8b 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -3318,12 +3318,12 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
 }
 
 static uint32_t
-tu_draw_initiator(struct tu_cmd_buffer *cmd, bool indexed)
+tu_draw_initiator(struct tu_cmd_buffer *cmd, enum pc_di_src_sel src_sel)
 {
    const struct tu_pipeline *pipeline = cmd->state.pipeline;
    uint32_t initiator =
       CP_DRAW_INDX_OFFSET_0_PRIM_TYPE(pipeline->ia.primtype) |
-      CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT(indexed ? DI_SRC_SEL_DMA : DI_SRC_SEL_AUTO_INDEX) |
+      CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT(src_sel) |
       CP_DRAW_INDX_OFFSET_0_INDEX_SIZE(cmd->state.index_size) |
       CP_DRAW_INDX_OFFSET_0_VIS_CULL(USE_VISIBILITY);
 
@@ -3363,7 +3363,7 @@ tu_CmdDraw(VkCommandBuffer commandBuffer,
    tu6_draw_common(cmd, cs, false, firstVertex, firstInstance, vertexCount);
 
    tu_cs_emit_pkt7(cs, CP_DRAW_INDX_OFFSET, 3);
-   tu_cs_emit(cs, tu_draw_initiator(cmd, false));
+   tu_cs_emit(cs, tu_draw_initiator(cmd, DI_SRC_SEL_AUTO_INDEX));
    tu_cs_emit(cs, instanceCount);
    tu_cs_emit(cs, vertexCount);
 }
@@ -3382,7 +3382,7 @@ tu_CmdDrawIndexed(VkCommandBuffer commandBuffer,
    tu6_draw_common(cmd, cs, true, vertexOffset, firstInstance, indexCount);
 
    tu_cs_emit_pkt7(cs, CP_DRAW_INDX_OFFSET, 7);
-   tu_cs_emit(cs, tu_draw_initiator(cmd, true));
+   tu_cs_emit(cs, tu_draw_initiator(cmd, DI_SRC_SEL_DMA));
    tu_cs_emit(cs, instanceCount);
    tu_cs_emit(cs, indexCount);
    tu_cs_emit(cs, 0x0); /* XXX */
@@ -3405,7 +3405,7 @@ tu_CmdDrawIndirect(VkCommandBuffer commandBuffer,
 
    for (uint32_t i = 0; i < drawCount; i++) {
       tu_cs_emit_pkt7(cs, CP_DRAW_INDIRECT, 3);
-      tu_cs_emit(cs, tu_draw_initiator(cmd, false));
+      tu_cs_emit(cs, tu_draw_initiator(cmd, DI_SRC_SEL_AUTO_INDEX));
       tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset + stride * i);
    }
 
@@ -3427,7 +3427,7 @@ tu_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
 
    for (uint32_t i = 0; i < drawCount; i++) {
       tu_cs_emit_pkt7(cs, CP_DRAW_INDX_INDIRECT, 6);
-      tu_cs_emit(cs, tu_draw_initiator(cmd, true));
+      tu_cs_emit(cs, tu_draw_initiator(cmd, DI_SRC_SEL_DMA));
       tu_cs_emit_qw(cs, cmd->state.index_va);
       tu_cs_emit(cs, A5XX_CP_DRAW_INDX_INDIRECT_3_MAX_INDICES(cmd->state.max_index_count));
       tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset + stride * i);
@@ -3444,7 +3444,20 @@ void tu_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,
                                     uint32_t counterOffset,
                                     uint32_t vertexStride)
 {
-   tu_finishme("CmdDrawIndirectByteCountEXT");
+   TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
+   TU_FROM_HANDLE(tu_buffer, buf, _counterBuffer);
+   struct tu_cs *cs = &cmd->draw_cs;
+
+   tu6_draw_common(cmd, cs, false, 0, firstInstance, 0);
+
+   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(cs, counterOffset);
+   tu_cs_emit(cs, vertexStride);
+
+   tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ);
 }
 
 struct tu_dispatch_info



More information about the mesa-commit mailing list