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