From: Danylo Piliaiev Date: Thu, 22 Jun 2023 10:30:42 +0000 (+0200) Subject: tu/a7xx: Fix occlusion query X-Git-Tag: upstream/23.3.3~2489 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=720480943d08e8f6471c7ca9d78c99f8c2a0a7d7;p=platform%2Fupstream%2Fmesa.git tu/a7xx: Fix occlusion query Signed-off-by: Danylo Piliaiev Part-of: --- diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml index 0ea1977..802c3e8 100644 --- a/src/freedreno/registers/adreno/a6xx.xml +++ b/src/freedreno/registers/adreno/a6xx.xml @@ -2573,7 +2573,7 @@ to upconvert to 32b float internally? - + diff --git a/src/freedreno/vulkan/tu_autotune.cc b/src/freedreno/vulkan/tu_autotune.cc index 5c40bff..6dbed49 100644 --- a/src/freedreno/vulkan/tu_autotune.cc +++ b/src/freedreno/vulkan/tu_autotune.cc @@ -650,7 +650,7 @@ tu_autotune_begin_renderpass(struct tu_cmd_buffer *cmd, tu_cs_emit_regs(cs, A6XX_RB_SAMPLE_COUNT_CONTROL(.copy = true)); tu_cs_emit_regs(cs, A6XX_RB_SAMPLE_COUNT_ADDR(.qword = result_iova)); - + /* A7XX TODO: Fixup ZPASS_DONE */ tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); tu_cs_emit(cs, ZPASS_DONE); } @@ -672,6 +672,7 @@ void tu_autotune_end_renderpass(struct tu_cmd_buffer *cmd, tu_cs_emit_regs(cs, A6XX_RB_SAMPLE_COUNT_ADDR(.qword = result_iova)); + /* A7XX TODO: Fixup ZPASS_DONE */ tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); tu_cs_emit(cs, ZPASS_DONE); } diff --git a/src/freedreno/vulkan/tu_query.cc b/src/freedreno/vulkan/tu_query.cc index c26a2a2..e940c8a 100644 --- a/src/freedreno/vulkan/tu_query.cc +++ b/src/freedreno/vulkan/tu_query.cc @@ -821,6 +821,7 @@ tu_ResetQueryPool(VkDevice device, } } +template static void emit_begin_occlusion_query(struct tu_cmd_buffer *cmdbuf, struct tu_query_pool *pool, @@ -846,11 +847,17 @@ emit_begin_occlusion_query(struct tu_cmd_buffer *cmdbuf, tu_cs_emit_regs(cs, A6XX_RB_SAMPLE_COUNT_CONTROL(.copy = true)); - tu_cs_emit_regs(cs, - A6XX_RB_SAMPLE_COUNT_ADDR(.qword = begin_iova)); - - tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); - tu_cs_emit(cs, ZPASS_DONE); + if (CHIP == A6XX) { + tu_cs_emit_regs(cs, + A6XX_RB_SAMPLE_COUNT_ADDR(.qword = begin_iova)); + tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); + tu_cs_emit(cs, ZPASS_DONE); + } else { + tu_cs_emit_pkt7(cs, CP_EVENT_WRITE7, 3); + tu_cs_emit(cs, CP_EVENT_WRITE7_0(.event = ZPASS_DONE, + .write_sample_count = true).value); + tu_cs_emit_qw(cs, begin_iova); + } } template @@ -1064,7 +1071,7 @@ tu_CmdBeginQuery(VkCommandBuffer commandBuffer, * GL_SAMPLES_PASSED and GL_ANY_SAMPLES_PASSED, so we can similarly * ignore the VK_QUERY_CONTROL_PRECISE_BIT flag here. */ - emit_begin_occlusion_query(cmdbuf, pool, query); + emit_begin_occlusion_query(cmdbuf, pool, query); break; case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: emit_begin_xfb_query(cmdbuf, pool, query, 0); @@ -1111,6 +1118,7 @@ tu_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, } TU_GENX(tu_CmdBeginQueryIndexedEXT); +template static void emit_end_occlusion_query(struct tu_cmd_buffer *cmdbuf, struct tu_query_pool *pool, @@ -1146,11 +1154,18 @@ emit_end_occlusion_query(struct tu_cmd_buffer *cmdbuf, tu_cs_emit_regs(cs, A6XX_RB_SAMPLE_COUNT_CONTROL(.copy = true)); - tu_cs_emit_regs(cs, - A6XX_RB_SAMPLE_COUNT_ADDR(.qword = end_iova)); - - tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); - tu_cs_emit(cs, ZPASS_DONE); + if (CHIP == A6XX) { + tu_cs_emit_regs(cs, + A6XX_RB_SAMPLE_COUNT_ADDR(.qword = end_iova)); + tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1); + tu_cs_emit(cs, ZPASS_DONE); + } else { + /* A7XX TODO: Calculate (end - begin) via ZPASS_DONE. */ + tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 3); + tu_cs_emit(cs, CP_EVENT_WRITE7_0(.event = ZPASS_DONE, + .write_sample_count = true).value); + tu_cs_emit_qw(cs, end_iova); + } tu_cs_emit_pkt7(cs, CP_WAIT_REG_MEM, 6); tu_cs_emit(cs, CP_WAIT_REG_MEM_0_FUNCTION(WRITE_NE) | @@ -1534,7 +1549,7 @@ tu_CmdEndQuery(VkCommandBuffer commandBuffer, switch (pool->type) { case VK_QUERY_TYPE_OCCLUSION: - emit_end_occlusion_query(cmdbuf, pool, query); + emit_end_occlusion_query(cmdbuf, pool, query); break; case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: emit_end_xfb_query(cmdbuf, pool, query, 0);