mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-19 12:40:29 +00:00
rsx: Write atomically semaphore updates and fix zcull timestamp
This commit is contained in:
parent
22994d15fb
commit
fcc75c8b0f
@ -68,20 +68,20 @@ struct RsxDmaControl
|
||||
be_t<u32> unk1;
|
||||
};
|
||||
|
||||
struct RsxSemaphore
|
||||
struct alignas(16) RsxSemaphore
|
||||
{
|
||||
be_t<u32> val;
|
||||
be_t<u32> pad;
|
||||
be_t<u64> timestamp;
|
||||
};
|
||||
|
||||
struct RsxNotify
|
||||
struct alignas(16) RsxNotify
|
||||
{
|
||||
be_t<u64> timestamp;
|
||||
be_t<u64> zero;
|
||||
};
|
||||
|
||||
struct RsxReport
|
||||
struct alignas(16) RsxReport
|
||||
{
|
||||
be_t<u64> timestamp;
|
||||
be_t<u32> val;
|
||||
|
@ -65,7 +65,7 @@ struct CellGcmSurface
|
||||
be_t<u16> y;
|
||||
};
|
||||
|
||||
struct CellGcmReportData
|
||||
struct alignas(16) CellGcmReportData
|
||||
{
|
||||
be_t<u64> timer;
|
||||
be_t<u32> value;
|
||||
|
@ -2340,10 +2340,7 @@ namespace rsx
|
||||
}
|
||||
}
|
||||
|
||||
vm::ptr<CellGcmReportData> result = sink;
|
||||
result->value = value;
|
||||
result->padding = 0;
|
||||
result->timer = timestamp();
|
||||
vm::_ref<atomic_t<CellGcmReportData>>(sink).store({ timestamp(), value, 0});
|
||||
}
|
||||
|
||||
void thread::sync()
|
||||
@ -2819,7 +2816,7 @@ namespace rsx
|
||||
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;
|
||||
|
||||
@ -2840,10 +2837,7 @@ namespace rsx
|
||||
break;
|
||||
}
|
||||
|
||||
vm::ptr<CellGcmReportData> out = sink;
|
||||
out->value = value;
|
||||
out->timer = timestamp;
|
||||
out->padding = 0;
|
||||
vm::_ref<atomic_t<CellGcmReportData>>(sink).store({ timestamp, value, 0});
|
||||
}
|
||||
|
||||
void ZCULL_control::sync(::rsx::thread* ptimer)
|
||||
@ -2888,7 +2882,7 @@ namespace rsx
|
||||
|
||||
if (!writer.forwarder)
|
||||
//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++;
|
||||
}
|
||||
@ -3049,7 +3043,7 @@ namespace rsx
|
||||
//only zpass supported right now
|
||||
if (!writer.forwarder)
|
||||
//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++;
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ namespace rsx
|
||||
void set_enabled(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
|
||||
void read_report(class ::rsx::thread* ptimer, vm::addr_t sink, u32 type);
|
||||
|
@ -180,9 +180,11 @@ namespace rsx
|
||||
return;
|
||||
}
|
||||
|
||||
auto& notify = vm::_ref<RsxNotify>(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40))));
|
||||
notify.zero = 0;
|
||||
notify.timestamp = rsx->timestamp();
|
||||
vm::_ref<atomic_t<RsxNotify>>(verify(HERE, RSXIOMem.RealAddr(0xf100000 + (index * 0x40)))).store(
|
||||
{
|
||||
rsx->timestamp(),
|
||||
0
|
||||
});
|
||||
}
|
||||
|
||||
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()));
|
||||
sema.val = arg;
|
||||
sema.pad = 0;
|
||||
sema.timestamp = rsx->timestamp();
|
||||
vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097())).store(
|
||||
{
|
||||
arg,
|
||||
0,
|
||||
rsx->timestamp()
|
||||
});
|
||||
}
|
||||
|
||||
void back_end_write_semaphore_release(thread* rsx, u32 _reg, u32 arg)
|
||||
@ -213,10 +217,12 @@ namespace rsx
|
||||
|
||||
rsx->sync();
|
||||
u32 val = (arg & 0xff00ff00) | ((arg & 0xff) << 16) | ((arg >> 16) & 0xff);
|
||||
auto& sema = vm::_ref<RsxSemaphore>(get_address(offset, method_registers.semaphore_context_dma_4097()));
|
||||
sema.val = val;
|
||||
sema.pad = 0;
|
||||
sema.timestamp = rsx->timestamp();
|
||||
vm::_ref<atomic_t<RsxSemaphore>>(get_address(offset, method_registers.semaphore_context_dma_4097())).store(
|
||||
{
|
||||
val,
|
||||
0,
|
||||
rsx->timestamp()
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -509,8 +515,6 @@ namespace rsx
|
||||
return;
|
||||
}
|
||||
|
||||
vm::ptr<CellGcmReportData> result = address_ptr;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CELL_GCM_ZPASS_PIXEL_CNT:
|
||||
@ -522,8 +526,12 @@ namespace rsx
|
||||
break;
|
||||
default:
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user