yuzu-emu
/
yuzu
Archived
1
0
Fork 0

vk_memory_manager: Remove unified memory model flag

All drivers (even Intel) seem to have a device local memory type that is
not host visible. Remove this flag so all devices follow the same path.

This fixes a crash when trying to map to host device local memory on
integrated devices.
This commit is contained in:
ReinUsesLisp 2020-04-21 21:46:58 -03:00
parent d64290884a
commit 6f47bd9641
5 changed files with 6 additions and 35 deletions

View File

@ -78,11 +78,6 @@ public:
return present_family; return present_family;
} }
/// Returns true if the device is integrated with the host CPU.
bool IsIntegrated() const {
return properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
}
/// Returns the current Vulkan API version provided in Vulkan-formatted version numbers. /// Returns the current Vulkan API version provided in Vulkan-formatted version numbers.
u32 GetApiVersion() const { u32 GetApiVersion() const {
return properties.apiVersion; return properties.apiVersion;

View File

@ -118,8 +118,7 @@ private:
}; };
VKMemoryManager::VKMemoryManager(const VKDevice& device) VKMemoryManager::VKMemoryManager(const VKDevice& device)
: device{device}, properties{device.GetPhysical().GetMemoryProperties()}, : device{device}, properties{device.GetPhysical().GetMemoryProperties()} {}
is_memory_unified{GetMemoryUnified(properties)} {}
VKMemoryManager::~VKMemoryManager() = default; VKMemoryManager::~VKMemoryManager() = default;
@ -209,16 +208,6 @@ VKMemoryCommit VKMemoryManager::TryAllocCommit(const VkMemoryRequirements& requi
return {}; return {};
} }
bool VKMemoryManager::GetMemoryUnified(const VkPhysicalDeviceMemoryProperties& properties) {
for (u32 heap_index = 0; heap_index < properties.memoryHeapCount; ++heap_index) {
if (!(properties.memoryHeaps[heap_index].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)) {
// Memory is considered unified when heaps are device local only.
return false;
}
}
return true;
}
VKMemoryCommitImpl::VKMemoryCommitImpl(const VKDevice& device, VKMemoryAllocation* allocation, VKMemoryCommitImpl::VKMemoryCommitImpl(const VKDevice& device, VKMemoryAllocation* allocation,
const vk::DeviceMemory& memory, u64 begin, u64 end) const vk::DeviceMemory& memory, u64 begin, u64 end)
: device{device}, memory{memory}, interval{begin, end}, allocation{allocation} {} : device{device}, memory{memory}, interval{begin, end}, allocation{allocation} {}

View File

@ -40,11 +40,6 @@ public:
/// Commits memory required by the image and binds it. /// Commits memory required by the image and binds it.
VKMemoryCommit Commit(const vk::Image& image, bool host_visible); VKMemoryCommit Commit(const vk::Image& image, bool host_visible);
/// Returns true if the memory allocations are done always in host visible and coherent memory.
bool IsMemoryUnified() const {
return is_memory_unified;
}
private: private:
/// Allocates a chunk of memory. /// Allocates a chunk of memory.
bool AllocMemory(VkMemoryPropertyFlags wanted_properties, u32 type_mask, u64 size); bool AllocMemory(VkMemoryPropertyFlags wanted_properties, u32 type_mask, u64 size);
@ -53,12 +48,8 @@ private:
VKMemoryCommit TryAllocCommit(const VkMemoryRequirements& requirements, VKMemoryCommit TryAllocCommit(const VkMemoryRequirements& requirements,
VkMemoryPropertyFlags wanted_properties); VkMemoryPropertyFlags wanted_properties);
/// Returns true if the device uses an unified memory model. const VKDevice& device; ///< Device handler.
static bool GetMemoryUnified(const VkPhysicalDeviceMemoryProperties& properties); const VkPhysicalDeviceMemoryProperties properties; ///< Physical device properties.
const VKDevice& device; ///< Device handler.
const VkPhysicalDeviceMemoryProperties properties; ///< Physical device properties.
const bool is_memory_unified; ///< True if memory model is unified.
std::vector<std::unique_ptr<VKMemoryAllocation>> allocations; ///< Current allocations. std::vector<std::unique_ptr<VKMemoryAllocation>> allocations; ///< Current allocations.
}; };

View File

@ -39,8 +39,7 @@ VKStagingBufferPool::StagingBuffer& VKStagingBufferPool::StagingBuffer::operator
VKStagingBufferPool::VKStagingBufferPool(const VKDevice& device, VKMemoryManager& memory_manager, VKStagingBufferPool::VKStagingBufferPool(const VKDevice& device, VKMemoryManager& memory_manager,
VKScheduler& scheduler) VKScheduler& scheduler)
: device{device}, memory_manager{memory_manager}, scheduler{scheduler}, : device{device}, memory_manager{memory_manager}, scheduler{scheduler} {}
is_device_integrated{device.IsIntegrated()} {}
VKStagingBufferPool::~VKStagingBufferPool() = default; VKStagingBufferPool::~VKStagingBufferPool() = default;
@ -56,9 +55,7 @@ void VKStagingBufferPool::TickFrame() {
current_delete_level = (current_delete_level + 1) % NumLevels; current_delete_level = (current_delete_level + 1) % NumLevels;
ReleaseCache(true); ReleaseCache(true);
if (!is_device_integrated) { ReleaseCache(false);
ReleaseCache(false);
}
} }
VKBuffer* VKStagingBufferPool::TryGetReservedBuffer(std::size_t size, bool host_visible) { VKBuffer* VKStagingBufferPool::TryGetReservedBuffer(std::size_t size, bool host_visible) {
@ -95,7 +92,7 @@ VKBuffer& VKStagingBufferPool::CreateStagingBuffer(std::size_t size, bool host_v
} }
VKStagingBufferPool::StagingBuffersCache& VKStagingBufferPool::GetCache(bool host_visible) { VKStagingBufferPool::StagingBuffersCache& VKStagingBufferPool::GetCache(bool host_visible) {
return is_device_integrated || host_visible ? host_staging_buffers : device_staging_buffers; return host_visible ? host_staging_buffers : device_staging_buffers;
} }
void VKStagingBufferPool::ReleaseCache(bool host_visible) { void VKStagingBufferPool::ReleaseCache(bool host_visible) {

View File

@ -71,7 +71,6 @@ private:
const VKDevice& device; const VKDevice& device;
VKMemoryManager& memory_manager; VKMemoryManager& memory_manager;
VKScheduler& scheduler; VKScheduler& scheduler;
const bool is_device_integrated;
StagingBuffersCache host_staging_buffers; StagingBuffersCache host_staging_buffers;
StagingBuffersCache device_staging_buffers; StagingBuffersCache device_staging_buffers;