rsx: Write atomically semaphore updates and fix zcull timestamp

This commit is contained in:
Eladash 2019-07-26 08:05:50 +03:00 committed by kd-11
parent 22994d15fb
commit fcc75c8b0f
5 changed files with 33 additions and 31 deletions

View File

@ -68,20 +68,20 @@ struct RsxDmaControl
be_t<u32> unk1; be_t<u32> unk1;
}; };
struct RsxSemaphore struct alignas(16) RsxSemaphore
{ {
be_t<u32> val; be_t<u32> val;
be_t<u32> pad; be_t<u32> pad;
be_t<u64> timestamp; be_t<u64> timestamp;
}; };
struct RsxNotify struct alignas(16) RsxNotify
{ {
be_t<u64> timestamp; be_t<u64> timestamp;
be_t<u64> zero; be_t<u64> zero;
}; };
struct RsxReport struct alignas(16) RsxReport
{ {
be_t<u64> timestamp; be_t<u64> timestamp;
be_t<u32> val; be_t<u32> val;

View File

@ -65,7 +65,7 @@ struct CellGcmSurface
be_t<u16> y; be_t<u16> y;
}; };
struct CellGcmReportData struct alignas(16) CellGcmReportData
{ {
be_t<u64> timer; be_t<u64> timer;
be_t<u32> value; be_t<u32> value;

View File

@ -2340,10 +2340,7 @@ namespace rsx
} }
} }
vm::ptr<CellGcmReportData> result = sink; vm::_ref<atomic_t<CellGcmReportData>>(sink).store({ timestamp(), value, 0});
result->value = value;
result->padding = 0;
result->timer = timestamp();
} }
void thread::sync() void thread::sync()
@ -2819,7 +2816,7 @@ namespace rsx
m_cycles_delay = max_zcull_delay_us; m_cycles_delay = max_zcull_delay_us;
} }
void ZCULL_control::write(vm::addr_t sink, u32 timestamp, u32 type, u32 value) void ZCULL_control::write(vm::addr_t sink, u64 timestamp, u32 type, u32 value)
{ {
verify(HERE), sink; verify(HERE), sink;
@ -2840,10 +2837,7 @@ namespace rsx
break; break;
} }
vm::ptr<CellGcmReportData> out = sink; vm::_ref<atomic_t<CellGcmReportData>>(sink).store({ timestamp, value, 0});
out->value = value;
out->timer = timestamp;
out->padding = 0;
} }
void ZCULL_control::sync(::rsx::thread* ptimer) void ZCULL_control::sync(::rsx::thread* ptimer)
@ -2888,7 +2882,7 @@ namespace rsx
if (!writer.forwarder) if (!writer.forwarder)
//No other queries in the chain, write result //No other queries in the chain, write result
write(writer.sink, (u32)ptimer->timestamp(), writer.type, result); write(writer.sink, ptimer->timestamp(), writer.type, result);
processed++; processed++;
} }
@ -3049,7 +3043,7 @@ namespace rsx
//only zpass supported right now //only zpass supported right now
if (!writer.forwarder) if (!writer.forwarder)
//No other queries in the chain, write result //No other queries in the chain, write result
write(writer.sink, (u32)ptimer->timestamp(), writer.type, result); write(writer.sink, ptimer->timestamp(), writer.type, result);
processed++; processed++;
} }

View File

@ -371,7 +371,7 @@ namespace rsx
void set_enabled(class ::rsx::thread* ptimer, bool state); void set_enabled(class ::rsx::thread* ptimer, bool state);
void set_active(class ::rsx::thread* ptimer, bool state); void set_active(class ::rsx::thread* ptimer, bool state);
void write(vm::addr_t sink, u32 timestamp, u32 type, u32 value); void write(vm::addr_t sink, u64 timestamp, u32 type, u32 value);
// Read current zcull statistics into the address provided // Read current zcull statistics into the address provided
void read_report(class ::rsx::thread* ptimer, vm::addr_t sink, u32 type); void read_report(class ::rsx::thread* ptimer, vm::addr_t sink, u32 type);

View File

@ -180,9 +180,11 @@ namespace rsx
return; return;
} }
auto& notify = vm::_ref<RsxNotify>(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40)))); vm::_ref<atomic_t<RsxNotify>>(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40)))).store(
notify.zero = 0; {
notify.timestamp = rsx->timestamp(); rsx->timestamp(),
0
});
} }
void texture_read_semaphore_release(thread* rsx, u32 _reg, u32 arg) void texture_read_semaphore_release(thread* rsx, u32 _reg, u32 arg)
@ -196,10 +198,12 @@ namespace rsx
// //
} }
auto& sema = vm::_ref<RsxSemaphore>(get_address(offset, method_registers.semaphore_context_dma_4097())); vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097())).store(
sema.val = arg; {
sema.pad = 0; arg,
sema.timestamp = rsx->timestamp(); 0,
rsx->timestamp()
});
} }
void back_end_write_semaphore_release(thread* rsx, u32 _reg, u32 arg) void back_end_write_semaphore_release(thread* rsx, u32 _reg, u32 arg)
@ -213,10 +217,12 @@ namespace rsx
rsx->sync(); rsx->sync();
u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff); u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff);
auto& sema = vm::_ref<RsxSemaphore>(get_address(offset, method_registers.semaphore_context_dma_4097())); vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097())).store(
sema.val = val; {
sema.pad = 0; val,
sema.timestamp = rsx->timestamp(); 0,
rsx->timestamp()
});
} }
/** /**
@ -509,8 +515,6 @@ namespace rsx
return; return;
} }
vm::ptr<CellGcmReportData> result = address_ptr;
switch (type) switch (type)
{ {
case CELL_GCM_ZPASS_PIXEL_CNT: case CELL_GCM_ZPASS_PIXEL_CNT:
@ -522,8 +526,12 @@ namespace rsx
break; break;
default: default:
LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type); LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type);
result->timer = rsx->timestamp();
result->padding = 0; vm::_ref<atomic_t<CellGcmReportData>>(address_ptr).atomic_op([&](CellGcmReportData& data)
{
data.timer = rsx->timestamp();
data.padding = 0;
});
break; break;
} }
} }