mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 20:44:28 +00:00
Fix size truncated when syncing range
And memory barrier
This commit is contained in:
parent
cbed00e09c
commit
ce17f57954
@ -584,8 +584,12 @@ void BufferCache::CreateFaultBuffers() {
|
|||||||
}
|
}
|
||||||
for (const auto& range : fault_ranges) {
|
for (const auto& range : fault_ranges) {
|
||||||
const VAddr start = range.lower();
|
const VAddr start = range.lower();
|
||||||
const u32 size = range.upper() - start;
|
const u64 size = range.upper() - start;
|
||||||
CreateBuffer(start, size);
|
// Buffer size is 32 bits
|
||||||
|
for (VAddr addr = start; addr < size; addr += std::numeric_limits<u32>::max()) {
|
||||||
|
const u32 size_buffer = std::min<u32>(size, std::numeric_limits<u32>::max());
|
||||||
|
CreateBuffer(addr, size_buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,7 +829,7 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BufferCache::SynchronizeRange(VAddr device_addr, u32 size) {
|
void BufferCache::SynchronizeRange(VAddr device_addr, u64 size) {
|
||||||
if (device_addr == 0) {
|
if (device_addr == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -840,6 +844,25 @@ void BufferCache::SynchronizeRange(VAddr device_addr, u32 size) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BufferCache::MemoryBarrier() {
|
||||||
|
// Vulkan doesn't know which buffer we access in a shader if we use
|
||||||
|
// BufferDeviceAddress. We need a full memory barrier.
|
||||||
|
// For now, we only read memory using BDA. If we want to write to it,
|
||||||
|
// we might need to change this.
|
||||||
|
scheduler.EndRendering();
|
||||||
|
const auto cmdbuf = scheduler.CommandBuffer();
|
||||||
|
vk::MemoryBarrier2 barrier = {
|
||||||
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
|
.srcAccessMask = vk::AccessFlagBits2::eMemoryWrite,
|
||||||
|
.dstStageMask = vk::PipelineStageFlagBits2::eAllCommands,
|
||||||
|
.dstAccessMask = vk::AccessFlagBits2::eMemoryRead,
|
||||||
|
};
|
||||||
|
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
|
||||||
|
.memoryBarrierCount = 1,
|
||||||
|
.pMemoryBarriers = &barrier,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void BufferCache::InlineDataBuffer(Buffer& buffer, VAddr address, const void* value,
|
void BufferCache::InlineDataBuffer(Buffer& buffer, VAddr address, const void* value,
|
||||||
u32 num_bytes) {
|
u32 num_bytes) {
|
||||||
scheduler.EndRendering();
|
scheduler.EndRendering();
|
||||||
|
@ -142,7 +142,10 @@ public:
|
|||||||
void ResetFaultReadbackBuffer();
|
void ResetFaultReadbackBuffer();
|
||||||
|
|
||||||
/// Synchronizes all buffers in the specified range.
|
/// Synchronizes all buffers in the specified range.
|
||||||
void SynchronizeRange(VAddr device_addr, u32 size);
|
void SynchronizeRange(VAddr device_addr, u64 size);
|
||||||
|
|
||||||
|
/// Record memory barrier. Used for buffers when accessed via BDA.
|
||||||
|
void MemoryBarrier();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
|
@ -476,6 +476,7 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffer_cache.ResetFaultReadbackBuffer();
|
buffer_cache.ResetFaultReadbackBuffer();
|
||||||
|
buffer_cache.MemoryBarrier();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user