From ba89673d773da182d332eb4749cae6818c27be69 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Tue, 5 Sep 2023 17:41:11 +0300 Subject: [PATCH] vk_stream_buffer: Respect non coherent access alignment * Required by nvidia GPUs on MacOS --- src/video_core/renderer_vulkan/vk_instance.h | 5 +++++ src/video_core/renderer_vulkan/vk_stream_buffer.cpp | 8 ++++++++ 2 files changed, 13 insertions(+) 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);