From 1d25a09b5fc4255e56203acfe563a8774ce0c5c1 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Tue, 27 Jul 2021 03:32:08 +0200 Subject: [PATCH] early-access version 1928 --- README.md | 2 +- .../vk_staging_buffer_pool.cpp | 29 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c4624112e..0d7d22d80 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 1926. +This is the source code for early-access 1928. ## Legal Notice diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index 555b12ed7..5d5329abf 100755 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -61,11 +61,15 @@ std::optional FindMemoryTypeIndex(const VkPhysicalDeviceMemoryProperties& p return std::nullopt; } -u32 FindMemoryTypeIndex(const VkPhysicalDeviceMemoryProperties& props, u32 type_mask) { - // Try to find a DEVICE_LOCAL_BIT type, Nvidia and AMD have a dedicated heap for this - std::optional type = FindMemoryTypeIndex(props, type_mask, STREAM_FLAGS); - if (type) { - return *type; +u32 FindMemoryTypeIndex(const VkPhysicalDeviceMemoryProperties& props, u32 type_mask, + bool try_device_local) { + std::optional type; + if (try_device_local) { + // Try to find a DEVICE_LOCAL_BIT type, Nvidia and AMD have a dedicated heap for this + type = FindMemoryTypeIndex(props, type_mask, STREAM_FLAGS); + if (type) { + return *type; + } } // Otherwise try without the DEVICE_LOCAL_BIT type = FindMemoryTypeIndex(props, type_mask, HOST_FLAGS); @@ -115,12 +119,21 @@ StagingBufferPool::StagingBufferPool(const Device& device_, MemoryAllocator& mem .buffer = *stream_buffer, }; const auto memory_properties = device.GetPhysical().GetMemoryProperties(); - stream_memory = dev.AllocateMemory(VkMemoryAllocateInfo{ + VkMemoryAllocateInfo stream_memory_info{ .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = make_dedicated ? &dedicated_info : nullptr, .allocationSize = requirements.size, - .memoryTypeIndex = FindMemoryTypeIndex(memory_properties, requirements.memoryTypeBits), - }); + .memoryTypeIndex = + FindMemoryTypeIndex(memory_properties, requirements.memoryTypeBits, true), + }; + stream_memory = dev.TryAllocateMemory(stream_memory_info); + if (!stream_memory) { + LOG_INFO(Render_Vulkan, "Dynamic memory allocation failed, trying with system memory"); + stream_memory_info.memoryTypeIndex = + FindMemoryTypeIndex(memory_properties, requirements.memoryTypeBits, false); + stream_memory = dev.AllocateMemory(stream_memory_info); + } + if (device.HasDebuggingToolAttached()) { stream_memory.SetObjectNameEXT("Stream Buffer Memory"); }