QVulkanWindow: make it possible to override the enabled features
We already have a precedent for this: the QueueCreateInfoModifier callback. Following the pattern, add a EnabledFeaturesModifier that can alter the VkPhysicalDeviceFeatures that is passed to vkCreateDevice(). [ChangeLog][QtGui][QVulkanWindow] QVulkanWindow can now invoke a callback to alter the VkPhysicalDeviceFeatures object used to create the Vulkan device. This allows enabling 1.1, 1.2, and extension features. Fixes: QTBUG-99803 Change-Id: I5ede0c6bc3430cbb304d4961eb9e44faad5ce4d7 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
79aad61fc1
commit
b083c27d0a
@ -211,6 +211,11 @@ Q_LOGGING_CATEGORY(lcGuiVk, "qt.vulkan")
|
|||||||
|
|
||||||
When it comes to device features, QVulkanWindow enables all Vulkan 1.0
|
When it comes to device features, QVulkanWindow enables all Vulkan 1.0
|
||||||
features that are reported as supported from vkGetPhysicalDeviceFeatures().
|
features that are reported as supported from vkGetPhysicalDeviceFeatures().
|
||||||
|
This is always not sufficient, and therefore full control over the
|
||||||
|
VkPhysicalDeviceFeatures used for device creation is possible too by
|
||||||
|
registering a callback function with setEnabledFeaturesModifier(). When set,
|
||||||
|
the callback function is invoked, letting it alter the
|
||||||
|
VkPhysicalDeviceFeatures, instead of enabling only the 1.0 features.
|
||||||
|
|
||||||
\sa QVulkanInstance, QWindow
|
\sa QVulkanInstance, QWindow
|
||||||
*/
|
*/
|
||||||
@ -729,10 +734,14 @@ void QVulkanWindowPrivate::init()
|
|||||||
devInfo.enabledExtensionCount = devExts.count();
|
devInfo.enabledExtensionCount = devExts.count();
|
||||||
devInfo.ppEnabledExtensionNames = devExts.constData();
|
devInfo.ppEnabledExtensionNames = devExts.constData();
|
||||||
|
|
||||||
// Enable all 1.0 features.
|
|
||||||
VkPhysicalDeviceFeatures features;
|
VkPhysicalDeviceFeatures features;
|
||||||
memset(&features, 0, sizeof(features));
|
memset(&features, 0, sizeof(features));
|
||||||
f->vkGetPhysicalDeviceFeatures(physDev, &features);
|
if (enabledFeaturesModifier) {
|
||||||
|
enabledFeaturesModifier(features);
|
||||||
|
} else {
|
||||||
|
// Enable all 1.0 features.
|
||||||
|
f->vkGetPhysicalDeviceFeatures(physDev, &features);
|
||||||
|
}
|
||||||
devInfo.pEnabledFeatures = &features;
|
devInfo.pEnabledFeatures = &features;
|
||||||
|
|
||||||
// Device layers are not supported by QVulkanWindow since that's an already deprecated
|
// Device layers are not supported by QVulkanWindow since that's an already deprecated
|
||||||
@ -1634,6 +1643,41 @@ void QVulkanWindow::setQueueCreateInfoModifier(const QueueCreateInfoModifier &mo
|
|||||||
d->queueCreateInfoModifier = modifier;
|
d->queueCreateInfoModifier = modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\typedef QVulkanWindow::EnabledFeaturesModifier
|
||||||
|
|
||||||
|
A function that is called during graphics initialization to alter the
|
||||||
|
VkPhysicalDeviceFeatures that is passed in when creating a Vulkan device
|
||||||
|
object.
|
||||||
|
|
||||||
|
By default QVulkanWindow enables all Vulkan 1.0 features the physical
|
||||||
|
device reports as supported. That is not always sufficient when working
|
||||||
|
with Vulkan 1.1 or 1.2 features and extensions. Hence this callback
|
||||||
|
mechanism.
|
||||||
|
|
||||||
|
The VkPhysicalDeviceFeatures reference passed in is all zeroed out at the
|
||||||
|
point when the function is invoked. It is up to the function to change
|
||||||
|
members to true, or set up \c pNext chains as it sees fit.
|
||||||
|
|
||||||
|
\note When setting up \c pNext chains, make sure the referenced objects
|
||||||
|
have a long enough lifetime, for example by storing them as member
|
||||||
|
variables in the QVulkanWindow subclass.
|
||||||
|
|
||||||
|
\sa setEnabledFeaturesModifier()
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Sets the enabled device features modification function \a modifier.
|
||||||
|
|
||||||
|
\sa EnabledFeaturesModifier
|
||||||
|
|
||||||
|
\since 6.4
|
||||||
|
*/
|
||||||
|
void QVulkanWindow::setEnabledFeaturesModifier(const EnabledFeaturesModifier &modifier)
|
||||||
|
{
|
||||||
|
Q_D(QVulkanWindow);
|
||||||
|
d->enabledFeaturesModifier = modifier;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns true if this window has successfully initialized all Vulkan
|
Returns true if this window has successfully initialized all Vulkan
|
||||||
|
@ -113,6 +113,9 @@ public:
|
|||||||
QVulkanInfoVector<QVulkanExtension> supportedDeviceExtensions();
|
QVulkanInfoVector<QVulkanExtension> supportedDeviceExtensions();
|
||||||
void setDeviceExtensions(const QByteArrayList &extensions);
|
void setDeviceExtensions(const QByteArrayList &extensions);
|
||||||
|
|
||||||
|
typedef std::function<void(VkPhysicalDeviceFeatures &)> EnabledFeaturesModifier;
|
||||||
|
void setEnabledFeaturesModifier(const EnabledFeaturesModifier &modifier);
|
||||||
|
|
||||||
void setPreferredColorFormats(const QList<VkFormat> &formats);
|
void setPreferredColorFormats(const QList<VkFormat> &formats);
|
||||||
|
|
||||||
QList<int> supportedSampleCounts();
|
QList<int> supportedSampleCounts();
|
||||||
|
@ -103,6 +103,7 @@ public:
|
|||||||
QList<VkFormat> requestedColorFormats;
|
QList<VkFormat> requestedColorFormats;
|
||||||
VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT;
|
VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT;
|
||||||
QVulkanWindow::QueueCreateInfoModifier queueCreateInfoModifier;
|
QVulkanWindow::QueueCreateInfoModifier queueCreateInfoModifier;
|
||||||
|
QVulkanWindow::EnabledFeaturesModifier enabledFeaturesModifier;
|
||||||
|
|
||||||
VkDevice dev = VK_NULL_HANDLE;
|
VkDevice dev = VK_NULL_HANDLE;
|
||||||
QVulkanDeviceFunctions *devFuncs;
|
QVulkanDeviceFunctions *devFuncs;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user