Fix size truncated when syncing range

And memory barrier
This commit is contained in:
Lander Gallastegi 2025-04-25 22:09:58 +02:00
parent cbed00e09c
commit ce17f57954
3 changed files with 31 additions and 4 deletions

View File

@ -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();

View File

@ -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>

View File

@ -476,6 +476,7 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) {
} }
} }
buffer_cache.ResetFaultReadbackBuffer(); buffer_cache.ResetFaultReadbackBuffer();
buffer_cache.MemoryBarrier();
} }
return true; return true;