mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-24 18:41:52 +01:00
Ensure backing continuity when recreating GPU dirty buffers
Since we don't call `SynchronizeHost` on source buffers which are GPU dirty, their mirrors will be out of date. The backing contents of this source buffer's region in the new buffer will be incorrect. By copying from the backing directly, we can ensure that no writes are lost and that if the newly created buffer needs to turn GPU dirty during recreation no copies need to be done since the backing is as up to date as the mirror at a minimum.
This commit is contained in:
parent
c1bf5a804a
commit
77d15b02a3
@ -118,6 +118,9 @@ namespace skyline::gpu {
|
|||||||
copyBuffer(*newBuffer->guest, *srcBuffer->guest, newBuffer->mirror.data(), srcBuffer->backing.data());
|
copyBuffer(*newBuffer->guest, *srcBuffer->guest, newBuffer->mirror.data(), srcBuffer->backing.data());
|
||||||
else
|
else
|
||||||
newBuffer->MarkGpuDirty();
|
newBuffer->MarkGpuDirty();
|
||||||
|
|
||||||
|
// Since we don't synchost source buffers and the source buffers here are GPU dirty their mirrors will be out of date, meaning the backing contents of this source buffer's region in the new buffer from the initial synchost call will be incorrect. By copying backings directly here we can ensure that no writes are lost and that if the newly created buffer needs to turn GPU dirty during recreation no copies need to be done since the backing is as up to date as the mirror at a minimum.
|
||||||
|
copyBuffer(*newBuffer->guest, *srcBuffer->guest, newBuffer->backing.data(), srcBuffer->backing.data());
|
||||||
} else if (srcBuffer->AllCpuBackingWritesBlocked()) {
|
} else if (srcBuffer->AllCpuBackingWritesBlocked()) {
|
||||||
if (srcBuffer->dirtyState == Buffer::DirtyState::CpuDirty)
|
if (srcBuffer->dirtyState == Buffer::DirtyState::CpuDirty)
|
||||||
Logger::Error("Buffer (0x{}-0x{}) is marked as CPU dirty while CPU backing writes are blocked, this is not valid", srcBuffer->guest->begin().base(), srcBuffer->guest->end().base());
|
Logger::Error("Buffer (0x{}-0x{}) is marked as CPU dirty while CPU backing writes are blocked, this is not valid", srcBuffer->guest->begin().base(), srcBuffer->guest->end().base());
|
||||||
|
Loading…
Reference in New Issue
Block a user