Maxwell3D/Puller: Fix regressions and syncing issues.
This commit is contained in:
parent
c3cae9d992
commit
3cb4498142
|
@ -473,9 +473,7 @@ void Maxwell3D::ProcessQueryGet() {
|
||||||
|
|
||||||
switch (regs.report_semaphore.query.operation) {
|
switch (regs.report_semaphore.query.operation) {
|
||||||
case Regs::ReportSemaphore::Operation::Release:
|
case Regs::ReportSemaphore::Operation::Release:
|
||||||
if (regs.report_semaphore.query.release ==
|
if (regs.report_semaphore.query.short_query != 0) {
|
||||||
Regs::ReportSemaphore::Release::AfterAllPreceedingWrites ||
|
|
||||||
regs.report_semaphore.query.short_query != 0) {
|
|
||||||
const GPUVAddr sequence_address{regs.report_semaphore.Address()};
|
const GPUVAddr sequence_address{regs.report_semaphore.Address()};
|
||||||
const u32 payload = regs.report_semaphore.payload;
|
const u32 payload = regs.report_semaphore.payload;
|
||||||
std::function<void()> operation([this, sequence_address, payload] {
|
std::function<void()> operation([this, sequence_address, payload] {
|
||||||
|
@ -489,11 +487,10 @@ void Maxwell3D::ProcessQueryGet() {
|
||||||
};
|
};
|
||||||
const GPUVAddr sequence_address{regs.report_semaphore.Address()};
|
const GPUVAddr sequence_address{regs.report_semaphore.Address()};
|
||||||
const u32 payload = regs.report_semaphore.payload;
|
const u32 payload = regs.report_semaphore.payload;
|
||||||
std::function<void()> operation([this, sequence_address, payload] {
|
[this, sequence_address, payload] {
|
||||||
memory_manager.Write<u64>(sequence_address + sizeof(u64), system.GPU().GetTicks());
|
memory_manager.Write<u64>(sequence_address + sizeof(u64), system.GPU().GetTicks());
|
||||||
memory_manager.Write<u64>(sequence_address, payload);
|
memory_manager.Write<u64>(sequence_address, payload);
|
||||||
});
|
}();
|
||||||
rasterizer->SyncOperation(std::move(operation));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Regs::ReportSemaphore::Operation::Acquire:
|
case Regs::ReportSemaphore::Operation::Acquire:
|
||||||
|
@ -569,11 +566,11 @@ void Maxwell3D::ProcessCounterReset() {
|
||||||
|
|
||||||
void Maxwell3D::ProcessSyncPoint() {
|
void Maxwell3D::ProcessSyncPoint() {
|
||||||
const u32 sync_point = regs.sync_info.sync_point.Value();
|
const u32 sync_point = regs.sync_info.sync_point.Value();
|
||||||
const auto condition = regs.sync_info.condition.Value();
|
const u32 cache_flush = regs.sync_info.clean_l2.Value();
|
||||||
[[maybe_unused]] const u32 cache_flush = regs.sync_info.clean_l2.Value();
|
if (cache_flush != 0) {
|
||||||
if (condition == Regs::SyncInfo::Condition::RopWritesDone) {
|
rasterizer->InvalidateGPUCache();
|
||||||
rasterizer->SignalSyncPoint(sync_point);
|
|
||||||
}
|
}
|
||||||
|
rasterizer->SignalSyncPoint(sync_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Maxwell3D::DrawArrays() {
|
void Maxwell3D::DrawArrays() {
|
||||||
|
|
|
@ -75,11 +75,10 @@ void Puller::ProcessSemaphoreTriggerMethod() {
|
||||||
if (op == GpuSemaphoreOperation::WriteLong) {
|
if (op == GpuSemaphoreOperation::WriteLong) {
|
||||||
const GPUVAddr sequence_address{regs.semaphore_address.SemaphoreAddress()};
|
const GPUVAddr sequence_address{regs.semaphore_address.SemaphoreAddress()};
|
||||||
const u32 payload = regs.semaphore_sequence;
|
const u32 payload = regs.semaphore_sequence;
|
||||||
std::function<void()> operation([this, sequence_address, payload] {
|
[this, sequence_address, payload] {
|
||||||
memory_manager.Write<u64>(sequence_address + sizeof(u64), gpu.GetTicks());
|
memory_manager.Write<u64>(sequence_address + sizeof(u64), gpu.GetTicks());
|
||||||
memory_manager.Write<u64>(sequence_address, payload);
|
memory_manager.Write<u64>(sequence_address, payload);
|
||||||
});
|
}();
|
||||||
rasterizer->SignalFence(std::move(operation));
|
|
||||||
} else {
|
} else {
|
||||||
do {
|
do {
|
||||||
const u32 word{memory_manager.Read<u32>(regs.semaphore_address.SemaphoreAddress())};
|
const u32 word{memory_manager.Read<u32>(regs.semaphore_address.SemaphoreAddress())};
|
||||||
|
|
Loading…
Reference in New Issue