From 35a46acbb12dd64184c298c9ab52df75e60ed9fc Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Sat, 31 Dec 2022 23:01:55 +0000 Subject: [PATCH] Determine storage buffer alignment dynamically --- app/src/main/cpp/skyline/common/address_space.h | 7 ++++--- app/src/main/cpp/skyline/common/address_space.inc | 9 --------- .../cpp/skyline/gpu/interconnect/common/pipeline.inc | 6 ++---- app/src/main/cpp/skyline/gpu/trait_manager.cpp | 3 +++ app/src/main/cpp/skyline/gpu/trait_manager.h | 1 + 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/app/src/main/cpp/skyline/common/address_space.h b/app/src/main/cpp/skyline/common/address_space.h index a72ec313..2a70ab34 100644 --- a/app/src/main/cpp/skyline/common/address_space.h +++ b/app/src/main/cpp/skyline/common/address_space.h @@ -113,10 +113,11 @@ namespace skyline { std::pair, size_t> LookupBlockLocked(VaType virt, std::function)> cpuAccessCallback = {}) { const auto &blockEntry{this->blockSegmentTable[virt]}; - if (blockEntry.phys == nullptr) - return {span{}, 0}; - VaType segmentOffset{virt - blockEntry.virt}; + + if (blockEntry.extraInfo.sparseMapped || blockEntry.phys == nullptr) + return {span{static_cast(nullptr), blockEntry.extent}, segmentOffset}; + span blockSpan{blockEntry.phys, blockEntry.extent}; if (cpuAccessCallback) cpuAccessCallback(blockSpan); diff --git a/app/src/main/cpp/skyline/common/address_space.inc b/app/src/main/cpp/skyline/common/address_space.inc index 91ceaa98..db76f13e 100644 --- a/app/src/main/cpp/skyline/common/address_space.inc +++ b/app/src/main/cpp/skyline/common/address_space.inc @@ -238,16 +238,7 @@ namespace skyline { u8 *blockPhys{predecessor->phys + (virt - predecessor->virt)}; VaType blockSize{std::min(successor->virt - virt, size)}; - while (size) { - // Return a zeroed out map to emulate sparse mappings - if (predecessor->extraInfo.sparseMapped) { - if (blockSize > SparseMapSize) - throw exception("Size of the sparse map is too small to fit block of size: 0x{:X}", blockSize); - - blockPhys = sparseMap; - } - if (predecessor->phys) { span cpuBlock{blockPhys, blockSize}; if (cpuAccessCallback) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/common/pipeline.inc b/app/src/main/cpp/skyline/gpu/interconnect/common/pipeline.inc index e7cc2e6f..4e94c3f1 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/common/pipeline.inc +++ b/app/src/main/cpp/skyline/gpu/interconnect/common/pipeline.inc @@ -37,14 +37,12 @@ namespace skyline::gpu::interconnect { u64 address; u32 size; }; - static constexpr size_t MinAlignment{0x40}; - auto ssbo{cbuf.Read(ctx.executor, desc.cbuf_offset)}; if (ssbo.size == 0) return BufferBinding{ctx.gpu.megaBufferAllocator.Allocate(ctx.executor.cycle, PAGE_SIZE).buffer, 0, PAGE_SIZE}; - size_t padding{ssbo.address & (MinAlignment - 1)}; - cachedView.Update(ctx, ssbo.address - padding, util::AlignUp(ssbo.size + padding, MinAlignment)); + size_t padding{ssbo.address & (ctx.gpu.traits.minimumStorageBufferAlignment - 1)}; + cachedView.Update(ctx, ssbo.address - padding, util::AlignUp(ssbo.size + padding, ctx.gpu.traits.minimumStorageBufferAlignment)); auto view{cachedView.view}; ctx.executor.AttachBuffer(view); diff --git a/app/src/main/cpp/skyline/gpu/trait_manager.cpp b/app/src/main/cpp/skyline/gpu/trait_manager.cpp index bd96881f..34ecb718 100644 --- a/app/src/main/cpp/skyline/gpu/trait_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/trait_manager.cpp @@ -210,6 +210,9 @@ namespace skyline::gpu { for (u32 i{}; i < memoryProps.memoryProperties.memoryTypeCount; i++) if ((memoryProps.memoryProperties.memoryTypes[i].propertyFlags & ReqMemFlags) == ReqMemFlags) hostVisibleCoherentCachedMemoryType = i; + + + minimumStorageBufferAlignment = static_cast(deviceProperties2.get().properties.limits.minStorageBufferOffsetAlignment); } std::string TraitManager::Summary() { diff --git a/app/src/main/cpp/skyline/gpu/trait_manager.h b/app/src/main/cpp/skyline/gpu/trait_manager.h index 945764f1..17dc4d4c 100644 --- a/app/src/main/cpp/skyline/gpu/trait_manager.h +++ b/app/src/main/cpp/skyline/gpu/trait_manager.h @@ -51,6 +51,7 @@ namespace skyline::gpu { bool supportsNullDescriptor{}; //!< If the device supports the null descriptor feature in the 'VK_EXT_robustness2' Vulkan extension u32 subgroupSize{}; //!< Size of a subgroup on the host GPU u32 hostVisibleCoherentCachedMemoryType{std::numeric_limits::max()}; + u32 minimumStorageBufferAlignment{}; //!< Minimum alignment for storage buffers passed to shaders std::bitset<7> bcnSupport{}; //!< Bitmask of BCn texture formats supported, it is ordered as BC1, BC2, BC3, BC4, BC5, BC6H and BC7 bool supportsAdrenoDirectMemoryImport{};