aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp8
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h5
2 files changed, 13 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index 6256bc8bd8..f4345262fb 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -108,6 +108,14 @@ VkBufferView Buffer::View(u32 offset, u32 size, VideoCore::Surface::PixelFormat
// Null buffer not supported, adjust offset and size
offset = 0;
size = 0;
+ } else {
+ // Align offset down to minTexelBufferOffsetAlignment
+ const u32 alignment = static_cast<u32>(device->GetMinTexelBufferOffsetAlignment());
+ if (alignment > 1) {
+ const u32 aligned_offset = offset & ~(alignment - 1);
+ size += offset - aligned_offset;
+ offset = aligned_offset;
+ }
}
const auto it{std::ranges::find_if(views, [offset, size, format](const BufferView& view) {
return offset == view.offset && size == view.size && format == view.format;
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h
index d3623d1186..d29a8cd3f3 100644
--- a/src/video_core/vulkan_common/vulkan_device.h
+++ b/src/video_core/vulkan_common/vulkan_device.h
@@ -318,6 +318,11 @@ public:
return properties.properties.limits.minStorageBufferOffsetAlignment;
}
+ /// Returns texel buffer offset alignment requirement.
+ VkDeviceSize GetMinTexelBufferOffsetAlignment() const {
+ return properties.properties.limits.minTexelBufferOffsetAlignment;
+ }
+
/// Returns the maximum range for storage buffers.
VkDeviceSize GetMaxStorageBufferRange() const {
return properties.properties.limits.maxStorageBufferRange;