VK: Add a new platform method to check UMA (#8704)
* VK: Add a new context method to check UMA This heuristic should work on almost all devices, can be extended later as needed. * Addressing PR comments --------- Co-authored-by: Powei Feng <powei@google.com> Co-authored-by: Serge Metral <sergemetral@google.com>
This commit is contained in:
co-authored by
Powei Feng
Serge Metral
parent
de7bcd2df7
commit
44a75dd44b
@@ -142,6 +142,10 @@ public:
|
||||
return mPortabilitySubsetFeatures.imageView2DOn3DImage == VK_TRUE;
|
||||
}
|
||||
|
||||
inline bool isUnifiedMemoryArchitecture() const noexcept {
|
||||
return mIsUnifiedMemoryArchitecture;
|
||||
}
|
||||
|
||||
private:
|
||||
VkPhysicalDeviceMemoryProperties mMemoryProperties = {};
|
||||
VkPhysicalDeviceProperties2 mPhysicalDeviceProperties = {
|
||||
@@ -164,6 +168,7 @@ private:
|
||||
bool mDebugUtilsSupported = false;
|
||||
bool mLazilyAllocatedMemorySupported = false;
|
||||
bool mProtectedMemorySupported = false;
|
||||
bool mIsUnifiedMemoryArchitecture = false;
|
||||
|
||||
fvkutils::VkFormatList mDepthStencilFormats;
|
||||
fvkutils::VkFormatList mBlittableDepthStencilFormats;
|
||||
|
||||
@@ -631,6 +631,21 @@ fvkutils::VkFormatList findBlittableDepthStencilFormats(VkPhysicalDevice device)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the GPU has a unified memory architecture.
|
||||
*/
|
||||
bool hasUnifiedMemoryArchitecture(VkPhysicalDeviceMemoryProperties memoryProperties) noexcept {
|
||||
// Try to identify if the platform is running on a Unified Memory Architecture by inspecting the
|
||||
// memory heap flags, if they are all VK_MEMORY_HEAP_DEVICE_LOCAL_BIT it's UMA, otherwise not
|
||||
// enough information to make a decision, so default to false.
|
||||
for (uint32_t i = 0; i < memoryProperties.memoryHeapCount; ++i) {
|
||||
if ((memoryProperties.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}// anonymous namespace
|
||||
|
||||
using SwapChainPtr = VulkanPlatform::SwapChainPtr;
|
||||
@@ -864,6 +879,8 @@ Driver* VulkanPlatform::createDriver(void* sharedContext,
|
||||
}
|
||||
}
|
||||
|
||||
context.mIsUnifiedMemoryArchitecture = hasUnifiedMemoryArchitecture(context.mMemoryProperties);
|
||||
|
||||
#ifdef NDEBUG
|
||||
// If we are in release build, we should not have turned on debug extensions
|
||||
FILAMENT_CHECK_POSTCONDITION(!context.mDebugUtilsSupported && !context.mDebugMarkersSupported)
|
||||
|
||||
Reference in New Issue
Block a user