diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index b682d6c90..1601f67d7 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -205,6 +205,11 @@ public: return properties.limits.minUniformBufferOffsetAlignment; } + /// Returns the minimum alignemt required for accessing host-mapped device memory + vk::DeviceSize NonCoherentAtomSize() const { + return properties.limits.nonCoherentAtomSize; + } + /// Returns the maximum supported elements in a texel buffer u32 MaxTexelBufferElements() const { return properties.limits.maxTexelBufferElements; diff --git a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp index 7fb464fb6..27b131442 100644 --- a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp +++ b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp @@ -94,6 +94,10 @@ StreamBuffer::~StreamBuffer() { } std::tuple StreamBuffer::Map(u64 size, u64 alignment) { + if (!is_coherent && type == BufferType::Stream) { + size = Common::AlignUp(size, instance.NonCoherentAtomSize()); + } + ASSERT(size <= stream_buffer_size); mapped_size = size; @@ -122,6 +126,10 @@ std::tuple StreamBuffer::Map(u64 size, u64 alignment) { } void StreamBuffer::Commit(u64 size) { + if (!is_coherent && type == BufferType::Stream) { + size = Common::AlignUp(size, instance.NonCoherentAtomSize()); + } + ASSERT_MSG(size <= mapped_size, "Reserved size {} is too small compared to {}", mapped_size, size);