mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 16:23:05 +00:00
graphics: batch release labels without redundant submissions
This commit is contained in:
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
Reference in new issue
Block a user