radv: check enabled device features.
authorDave Airlie <airlied@redhat.com>
Mon, 24 Jul 2017 06:16:40 +0000 (07:16 +0100)
committerDave Airlie <airlied@redhat.com>
Mon, 24 Jul 2017 07:16:52 +0000 (08:16 +0100)
The spec says we should return VK_ERROR_FEATURE_NOT_PRESENT.

Ported from anv.

Fixes CTS test dEQP-VK.api.device_init.create_device_unsupported_features

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c

index 619e0f2fbe428935d846ad633ef9eeb444754d9a..111bc7e957fd038b81a45808d6b58f41691b641e 100644 (file)
@@ -1045,6 +1045,19 @@ VkResult radv_CreateDevice(
                        return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT);
        }
 
+       /* Check enabled features */
+       if (pCreateInfo->pEnabledFeatures) {
+               VkPhysicalDeviceFeatures supported_features;
+               radv_GetPhysicalDeviceFeatures(physicalDevice, &supported_features);
+               VkBool32 *supported_feature = (VkBool32 *)&supported_features;
+               VkBool32 *enabled_feature = (VkBool32 *)pCreateInfo->pEnabledFeatures;
+               unsigned num_features = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
+               for (uint32_t i = 0; i < num_features; i++) {
+                       if (enabled_feature[i] && !supported_feature[i])
+                               return vk_error(VK_ERROR_FEATURE_NOT_PRESENT);
+               }
+       }
+
        device = vk_alloc2(&physical_device->instance->alloc, pAllocator,
                             sizeof(*device), 8,
                             VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);