graphics: batch release labels without redundant submissions

This commit is contained in:
nmzik committed 2026-09-29 13:57:32 +04:00
1 parent 539c0f7bf8
commit 8e42e99788
2 files changed
+19 -15

No files matched your search

@@ -2266,7 +2266,6 @@ KYTY_CP_OP_PARSER(CpOpReleaseMem) {
const bool gl2_writeback = ((gcr_cntl & GcrGl2Writeback) != 0); const bool gl2_writeback = ((gcr_cntl & GcrGl2Writeback) != 0);
auto trigger_interrupt = [&]() { auto trigger_interrupt = [&]() {
bool queued = false;
switch (interrupt_selector) { switch (interrupt_selector) {
case 0x00: case 0x00:
case 0x03: break; case 0x03: break;
@@ -2274,13 +2273,10 @@ KYTY_CP_OP_PARSER(CpOpReleaseMem) {
case 0x02: case 0x02:
case 0x04: case 0x04:
cp.TriggerEopEventAtEndOfPipe(interrupt_context_id); cp.TriggerEopEventAtEndOfPipe(interrupt_context_id);
queued = true; cp.BufferFlush();
break; break;
default: EXIT("unknown release_mem interrupt selector\n"); default: EXIT("unknown release_mem interrupt selector\n");
} }
if (queued) {
cp.BufferFlush();
}
}; };
if (data_sel == 0 || interrupt_selector == 4) { if (data_sel == 0 || interrupt_selector == 4) {
@@ -2318,7 +2314,9 @@ KYTY_CP_OP_PARSER(CpOpReleaseMem) {
cp.WriteAtEndOfPipe32(cache_policy, event_write_dest, eop_event_type, cache_action, cp.WriteAtEndOfPipe32(cache_policy, event_write_dest, eop_event_type, cache_action,
event_index, event_source, dst_gpu_addr, static_cast<uint32_t>(value), event_index, event_source, dst_gpu_addr, static_cast<uint32_t>(value),
interrupt_selector, interrupt_context_id); interrupt_selector, interrupt_context_id);
cp.BufferFlush(); if (interrupt_selector == 0x01 || interrupt_selector == 0x02) {
cp.BufferFlush();
}
return 7; return 7;
} }
+15 -9
View File
@@ -2565,13 +2565,20 @@ public:
release_label <= Sync::ReadReferenceClock(), release_label <= Sync::ReadReferenceClock(),
"clock write with writeback and interrupt lost its data"); "clock write with writeback and interrupt lost its data");
auto immediate = make_release_mem(1, 0, &release_label, 0x11223344u); for (const auto interrupt : {0u, 3u, 1u, 2u}) {
Pm4Execution immediate_execution; release_label = 0;
const auto immediate_tick = gpu_scheduler.CurrentTick(); auto immediate = make_release_mem(1, interrupt, &release_label, 0x11223344u);
const auto immediate_result = Pm4Execution immediate_execution;
processor->Process(immediate_execution, immediate); const auto immediate_tick = gpu_scheduler.CurrentTick();
const bool immediate_split_once = const auto immediate_result =
gpu_scheduler.CurrentTick() == immediate_tick + 1; processor->Process(immediate_execution, immediate);
Require("GpuCommandLane", "32-bit release boundary",
immediate_result == Pm4ProcessResult::Complete &&
gpu_scheduler.CurrentTick() ==
immediate_tick + (interrupt == 1 || interrupt == 2) &&
release_label == (interrupt == 1 ? 0 : 0x11223344u),
"label-only release submitted work or interrupt release lost its boundary");
}
auto gds = make_release_mem(5, 0, &gds_label, 1ull << 16u); auto gds = make_release_mem(5, 0, &gds_label, 1ull << 16u);
Pm4Execution gds_execution; Pm4Execution gds_execution;
@@ -2597,8 +2604,7 @@ public:
gpu_scheduler.CurrentTick() == gds_interrupt_tick + 1; gpu_scheduler.CurrentTick() == gds_interrupt_tick + 1;
release_mem_submission_counts = release_mem_submission_counts =
immediate_result == Pm4ProcessResult::Complete && gds_result == Pm4ProcessResult::Complete &&
immediate_split_once && gds_result == Pm4ProcessResult::Complete &&
gds_waited_once && interrupt_result == Pm4ProcessResult::Complete && gds_waited_once && interrupt_result == Pm4ProcessResult::Complete &&
interrupt_split_once && interrupt_split_once &&
gds_interrupt_result == Pm4ProcessResult::Complete && gds_interrupt_result == Pm4ProcessResult::Complete &&