diff options
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 20 | ||||
| -rw-r--r-- | src/video_core/buffer_cache/usage_tracker.h | 4 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 90dbd352f..6d1fc3887 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1753,15 +1753,25 @@ Binding BufferCache<P>::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, const u32 memory_layout_size = static_cast<u32>(gpu_memory->GetMemoryLayoutSize(gpu_addr)); return std::min(memory_layout_size, static_cast<u32>(8_MiB)); }(); - const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr); - if (!cpu_addr || size == 0) { + // Alignment only applies to the offset of the buffer + const u32 alignment = runtime.GetStorageBufferAlignment(); + const GPUVAddr aligned_gpu_addr = Common::AlignDown(gpu_addr, alignment); + const u32 aligned_size = static_cast<u32>(gpu_addr - aligned_gpu_addr) + size; + + const std::optional<VAddr> aligned_cpu_addr = gpu_memory->GpuToCpuAddress(aligned_gpu_addr); + if (!aligned_cpu_addr || size == 0) { LOG_WARNING(HW_GPU, "Failed to find storage buffer for cbuf index {}", cbuf_index); return NULL_BINDING; } - const VAddr cpu_end = Common::AlignUp(*cpu_addr + size, YUZU_PAGESIZE); + const std::optional<VAddr> cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr); + ASSERT_MSG(cpu_addr, "Unaligned storage buffer address not found for cbuf index {}", + cbuf_index); + // The end address used for size calculation does not need to be aligned + const VAddr cpu_end = Common::AlignUp(*cpu_addr + size, Core::Memory::YUZU_PAGESIZE); + const Binding binding{ - .cpu_addr = *cpu_addr, - .size = is_written ? size : static_cast<u32>(cpu_end - *cpu_addr), + .cpu_addr = *aligned_cpu_addr, + .size = is_written ? aligned_size : static_cast<u32>(cpu_end - *aligned_cpu_addr), .buffer_id = BufferId{}, }; return binding; diff --git a/src/video_core/buffer_cache/usage_tracker.h b/src/video_core/buffer_cache/usage_tracker.h index ab05fe415..5f8688d31 100644 --- a/src/video_core/buffer_cache/usage_tracker.h +++ b/src/video_core/buffer_cache/usage_tracker.h @@ -58,7 +58,7 @@ private: void TrackPage(u64 page, u64 offset, u64 size) noexcept { const size_t offset_in_page = offset % PAGE_BYTES; const size_t first_bit = offset_in_page >> BYTES_PER_BIT_SHIFT; - const size_t num_bits = std::min(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT; + const size_t num_bits = std::min<size_t>(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT; const size_t mask = ~u64{0} >> (64 - num_bits); pages[page] |= (~u64{0} & mask) << first_bit; } @@ -66,7 +66,7 @@ private: bool IsPageUsed(u64 page, u64 offset, u64 size) const noexcept { const size_t offset_in_page = offset % PAGE_BYTES; const size_t first_bit = offset_in_page >> BYTES_PER_BIT_SHIFT; - const size_t num_bits = std::min(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT; + const size_t num_bits = std::min<size_t>(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT; const size_t mask = ~u64{0} >> (64 - num_bits); const size_t mask2 = (~u64{0} & mask) << first_bit; return (pages[page] & mask2) != 0; |
