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);