tu/a7xx: Fix occlusion query
authorDanylo Piliaiev <dpiliaiev@igalia.com>
Thu, 22 Jun 2023 10:30:42 +0000 (12:30 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 5 Sep 2023 16:19:30 +0000 (16:19 +0000)
Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23217>

src/freedreno/registers/adreno/a6xx.xml
src/freedreno/vulkan/tu_autotune.cc
src/freedreno/vulkan/tu_query.cc

index 0ea1977..802c3e8 100644 (file)
@@ -2573,7 +2573,7 @@ to upconvert to 32b float internally?
                </reg32>
        </array>
        <!-- 0x891b-0x8926 invalid -->
-       <reg64 offset="0x8927" name="RB_SAMPLE_COUNT_ADDR" type="waddress" align="16" usage="cmd"/>
+       <reg64 offset="0x8927" name="RB_SAMPLE_COUNT_ADDR" type="waddress" align="16" variants="A6XX" usage="cmd"/>
        <!-- 0x8929-0x89ff invalid -->
 
        <!-- TODO: there are some registers in the 0x8a00-0x8bff range -->
index 5c40bff..6dbed49 100644 (file)
@@ -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);
 }
index c26a2a2..e940c8a 100644 (file)
@@ -821,6 +821,7 @@ tu_ResetQueryPool(VkDevice device,
    }
 }
 
+template <chip CHIP>
 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 <chip CHIP>
@@ -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<CHIP>(cmdbuf, pool, query);
       break;
    case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
       emit_begin_xfb_query<CHIP>(cmdbuf, pool, query, 0);
@@ -1111,6 +1118,7 @@ tu_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer,
 }
 TU_GENX(tu_CmdBeginQueryIndexedEXT);
 
+template <chip CHIP>
 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<CHIP>(cmdbuf, pool, query);
       break;
    case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
       emit_end_xfb_query<CHIP>(cmdbuf, pool, query, 0);