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:
parent
d64290884a
commit
6f47bd9641
|
@ -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;
|
||||||
|
|
|
@ -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} {}
|
||||||
|
|
|
@ -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.
|
|
||||||
static bool GetMemoryUnified(const VkPhysicalDeviceMemoryProperties& properties);
|
|
||||||
|
|
||||||
const VKDevice& device; ///< Device handler.
|
const VKDevice& device; ///< Device handler.
|
||||||
const VkPhysicalDeviceMemoryProperties properties; ///< Physical device properties.
|
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.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue