diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml
index f18b73c208b..430a3e7e718 100644
--- a/src/freedreno/registers/adreno/a6xx.xml
+++ b/src/freedreno/registers/adreno/a6xx.xml
@@ -2839,7 +2839,7 @@ to upconvert to 32b float internally?
-
+
diff --git a/src/freedreno/vulkan/tu_autotune.cc b/src/freedreno/vulkan/tu_autotune.cc
index 6dbed498584..a34efcee0d2 100644
--- a/src/freedreno/vulkan/tu_autotune.cc
+++ b/src/freedreno/vulkan/tu_autotune.cc
@@ -621,6 +621,7 @@ tu_autotune_use_bypass(struct tu_autotune *at,
return fallback_use_bypass(pass, framebuffer, cmd_buffer);
}
+template
void
tu_autotune_begin_renderpass(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
@@ -649,12 +650,21 @@ 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);
+ if (CHIP >= A7XX) {
+ 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, result_iova);
+ } else {
+ tu_cs_emit_regs(cs,
+ A6XX_RB_SAMPLE_COUNT_ADDR(.qword = result_iova));
+ tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1);
+ tu_cs_emit(cs, ZPASS_DONE);
+ }
}
+TU_GENX(tu_autotune_begin_renderpass);
+template
void tu_autotune_end_renderpass(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
struct tu_renderpass_result *autotune_result)
@@ -670,9 +680,16 @@ void tu_autotune_end_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);
+ if (CHIP >= A7XX) {
+ 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, result_iova);
+ } else {
+ tu_cs_emit_regs(cs,
+ A6XX_RB_SAMPLE_COUNT_ADDR(.qword = result_iova));
+ tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 1);
+ tu_cs_emit(cs, ZPASS_DONE);
+ }
}
+TU_GENX(tu_autotune_end_renderpass);
diff --git a/src/freedreno/vulkan/tu_autotune.h b/src/freedreno/vulkan/tu_autotune.h
index f30338d14cc..137dff6b352 100644
--- a/src/freedreno/vulkan/tu_autotune.h
+++ b/src/freedreno/vulkan/tu_autotune.h
@@ -141,10 +141,12 @@ struct tu_cs *tu_autotune_on_submit(struct tu_device *dev,
struct tu_autotune_results_buffer;
+template
void tu_autotune_begin_renderpass(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
struct tu_renderpass_result *autotune_result);
+template
void tu_autotune_end_renderpass(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
struct tu_renderpass_result *autotune_result);
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc
index 740c28b1633..614ba6d1483 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.cc
+++ b/src/freedreno/vulkan/tu_cmd_buffer.cc
@@ -1750,7 +1750,7 @@ tu6_sysmem_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
tu_cs_emit_pkt7(cs, CP_SET_MODE, 1);
tu_cs_emit(cs, 0x0);
- tu_autotune_begin_renderpass(cmd, cs, autotune_result);
+ tu_autotune_begin_renderpass(cmd, cs, autotune_result);
tu_cs_sanity_check(cs);
}
@@ -1760,7 +1760,7 @@ static void
tu6_sysmem_render_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
struct tu_renderpass_result *autotune_result)
{
- tu_autotune_end_renderpass(cmd, cs, autotune_result);
+ tu_autotune_end_renderpass(cmd, cs, autotune_result);
/* Do any resolves of the last subpass. These are handled in the
* tile_store_cs in the gmem path.
@@ -1863,7 +1863,7 @@ tu6_tile_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
}
}
- tu_autotune_begin_renderpass(cmd, cs, autotune_result);
+ tu_autotune_begin_renderpass(cmd, cs, autotune_result);
tu_cs_sanity_check(cs);
}
@@ -1916,7 +1916,7 @@ static void
tu6_tile_render_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
struct tu_renderpass_result *autotune_result)
{
- tu_autotune_end_renderpass(cmd, cs, autotune_result);
+ tu_autotune_end_renderpass(cmd, cs, autotune_result);
tu_cs_emit_call(cs, &cmd->draw_epilogue_cs);
diff --git a/src/freedreno/vulkan/tu_query.cc b/src/freedreno/vulkan/tu_query.cc
index 2e33e77f5d7..7b24f54f471 100644
--- a/src/freedreno/vulkan/tu_query.cc
+++ b/src/freedreno/vulkan/tu_query.cc
@@ -1171,7 +1171,7 @@ emit_end_occlusion_query(struct tu_cmd_buffer *cmdbuf,
}
} else {
/* A7XX TODO: Calculate (end - begin) via ZPASS_DONE. */
- tu_cs_emit_pkt7(cs, CP_EVENT_WRITE, 3);
+ 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, end_iova);