Enable validation layers for custom devices and instances
authorRicardo Garcia <rgarcia@igalia.com>
Thu, 13 Jun 2019 09:43:52 +0000 (11:43 +0200)
committerRicardo Garcia <rgarcia@igalia.com>
Wed, 2 Oct 2019 14:06:48 +0000 (16:06 +0200)
Honor the --deqp-validation=enable command line option in tests using
custom devices and instances.

Affected tests:
dEQP-VK.api.buffer.*
dEQP-VK.api.device_init.*
dEQP-VK.api.external.memory.*
dEQP-VK.api.info.*
dEQP-VK.api.object_management.*
dEQP-VK.api.version_check.*
dEQP-VK.compute.basic.*
dEQP-VK.compute.device_group.*
dEQP-VK.device_group.*
dEQP-VK.image.swapchain_mutable.*
dEQP-VK.memory.allocation.*
dEQP-VK.memory.device_group_allocation.*
dEQP-VK.multiview.*
dEQP-VK.pipeline.push_descriptor.*
dEQP-VK.protected_memory.*
dEQP-VK.robustness.*
dEQP-VK.sparse_resources.*
dEQP-VK.synchronization.basic.semaphore.*
dEQP-VK.synchronization.cross_instance.*
dEQP-VK.synchronization.internally_synchronized_objects.*
dEQP-VK.synchronization.op.multi_queue.*
dEQP-VK.synchronization.smoke.*
dEQP-VK.synchronization.win32_keyed_mutex.*
dEQP-VK.wsi.*
dEQP-VK.ycbcr.format.*

Components: Vulkan
VK-GL-CTS issue: 1831

Change-Id: I31c2b5d2d93acc6e5fc7fd591857a3369a7328bf

40 files changed:
AndroidGen.mk
external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
external/vulkancts/framework/vulkan/vkDeviceUtil.hpp
external/vulkancts/modules/vulkan/CMakeLists.txt
external/vulkancts/modules/vulkan/api/vktApiDeviceInitializationTests.cpp
external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
external/vulkancts/modules/vulkan/api/vktApiVersionCheck.cpp
external/vulkancts/modules/vulkan/compute/vktComputeBasicComputeShaderTests.cpp
external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp
external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp
external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemContext.hpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessUtil.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBase.hpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationInternallySynchronizedObjectsTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationMultiQueueTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSmokeTests.cpp
external/vulkancts/modules/vulkan/synchronization/vktSynchronizationWin32KeyedMutexTests.cpp
external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/vktTestCase.cpp
external/vulkancts/modules/vulkan/vktTestCase.hpp
external/vulkancts/modules/vulkan/vktTestPackage.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp

index e7bb693..2f176c9 100644 (file)
@@ -400,6 +400,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/ubo/vktUniformBlockTests.cpp \
        external/vulkancts/modules/vulkan/util/vktDrawUtil.cpp \
        external/vulkancts/modules/vulkan/util/vktExternalMemoryUtil.cpp \
+       external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp \
        external/vulkancts/modules/vulkan/vktInfoTests.cpp \
        external/vulkancts/modules/vulkan/vktShaderLibrary.cpp \
        external/vulkancts/modules/vulkan/vktTestCase.cpp \
index b76a208..0ffdf7e 100644 (file)
  * \brief Instance and device initialization utilities.
  *//*--------------------------------------------------------------------*/
 
+#include "deSTLUtil.hpp"
 #include "vkDeviceUtil.hpp"
 #include "vkQueryUtil.hpp"
 #include "vkRefUtil.hpp"
 #include "vkApiVersion.hpp"
+#include "vkDebugReportUtil.hpp"
 
 #include "tcuCommandLine.hpp"
 
@@ -42,8 +44,27 @@ Move<VkInstance> createDefaultInstance (const PlatformInterface&             vkPlatform,
                                                                                const vector<string>&                   enabledExtensions,
                                                                                const VkAllocationCallbacks*    pAllocator)
 {
+       bool                    validationEnabled       = (!enabledLayers.empty());
+       vector<string>  actualExtensions        = enabledExtensions;
+
+       if (validationEnabled)
+       {
+               // Make sure the debug report extension is enabled when validation is enabled.
+               if (!isDebugReportSupported(vkPlatform))
+                       TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
+
+               if (!de::contains(begin(actualExtensions), end(actualExtensions), "VK_EXT_debug_report"))
+                       actualExtensions.push_back("VK_EXT_debug_report");
+       }
+
        vector<const char*>             layerNamePtrs           (enabledLayers.size());
-       vector<const char*>             extensionNamePtrs       (enabledExtensions.size());
+       vector<const char*>             extensionNamePtrs       (actualExtensions.size());
+
+       for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
+               layerNamePtrs[ndx] = enabledLayers[ndx].c_str();
+
+       for (size_t ndx = 0; ndx < actualExtensions.size(); ++ndx)
+               extensionNamePtrs[ndx] = actualExtensions[ndx].c_str();
 
        const struct VkApplicationInfo          appInfo                 =
        {
@@ -62,17 +83,11 @@ Move<VkInstance> createDefaultInstance (const PlatformInterface&            vkPlatform,
                (VkInstanceCreateFlags)0,
                &appInfo,
                (deUint32)layerNamePtrs.size(),
-               layerNamePtrs.empty() ? DE_NULL : &layerNamePtrs[0],
+               (validationEnabled ? layerNamePtrs.data() : DE_NULL),
                (deUint32)extensionNamePtrs.size(),
-               extensionNamePtrs.empty() ? DE_NULL : &extensionNamePtrs[0],
+               (extensionNamePtrs.empty() ? DE_NULL : extensionNamePtrs.data()),
        };
 
-       for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
-               layerNamePtrs[ndx] = enabledLayers[ndx].c_str();
-
-       for (size_t ndx = 0; ndx < enabledExtensions.size(); ++ndx)
-               extensionNamePtrs[ndx] = enabledExtensions[ndx].c_str();
-
        return createInstance(vkPlatform, &instanceInfo, pAllocator);
 }
 
@@ -81,31 +96,6 @@ Move<VkInstance> createDefaultInstance (const PlatformInterface& vkPlatform, deU
        return createDefaultInstance(vkPlatform, apiVersion, vector<string>(), vector<string>(), DE_NULL);
 }
 
-Move<VkInstance> createInstanceWithExtensions (const PlatformInterface&                        vkp,
-                                                                                          const deUint32                                       version,
-                                                                                          const std::vector<std::string>       requiredExtensions)
-{
-       std::vector<std::string>                                        extensionPtrs;
-       const std::vector<VkExtensionProperties>        availableExtensions     = enumerateInstanceExtensionProperties(vkp, DE_NULL);
-       for (size_t extensionID = 0; extensionID < requiredExtensions.size(); extensionID++)
-       {
-               if (!isInstanceExtensionSupported(version, availableExtensions, RequiredExtension(requiredExtensions[extensionID])))
-                       TCU_THROW(NotSupportedError, (requiredExtensions[extensionID] + " is not supported").c_str());
-
-               if (!isCoreInstanceExtension(version, requiredExtensions[extensionID]))
-                       extensionPtrs.push_back(requiredExtensions[extensionID]);
-       }
-
-       return createDefaultInstance(vkp, version, std::vector<std::string>() /* layers */, extensionPtrs, DE_NULL);
-}
-
-Move<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp,
-                                                                                         const deUint32                        version,
-                                                                                         const std::string                     requiredExtension)
-{
-       return createInstanceWithExtensions(vkp, version, std::vector<std::string>(1, requiredExtension));
-}
-
 deUint32 chooseDeviceIndex (const InstanceInterface& vkInstance, const VkInstance instance, const tcu::CommandLine& cmdLine)
 {
        const vector<VkPhysicalDevice>                  devices                                 = enumeratePhysicalDevices(vkInstance, instance);
index f719202..cebdf15 100644 (file)
@@ -46,14 +46,6 @@ Move<VkInstance>     createDefaultInstance   (const PlatformInterface&                       vkPlatform,
                                                                                         const std::vector<std::string>&        enabledExtensions,
                                                                                         const VkAllocationCallbacks*           pAllocator      = DE_NULL);
 
-Move<VkInstance>       createInstanceWithExtensions (const PlatformInterface&                  vkp,
-                                                                                                 const deUint32                                        version,
-                                                                                                 const std::vector<std::string>        requiredExtensions);
-
-Move<VkInstance>       createInstanceWithExtension (const PlatformInterface&   vkp,
-                                                                                                const deUint32                         version,
-                                                                                                const std::string                      requiredExtension);
-
 deUint32                       chooseDeviceIndex               (const InstanceInterface&                       vkInstance,
                                                                                         const VkInstance                                       instance,
                                                                                         const tcu::CommandLine&                        cmdLine);
index f246d4b..a65120a 100644 (file)
@@ -94,6 +94,8 @@ set(DEQP_VK_SRCS
        vktTestGroupUtil.hpp
        vktInfoTests.cpp
        vktInfoTests.hpp
+       vktCustomInstancesDevices.cpp
+       vktCustomInstancesDevices.hpp
        )
 
 set(DEQP_VK_LIBS
index eff193d..41adc97 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "vktApiDeviceInitializationTests.hpp"
 #include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -65,7 +66,6 @@ tcu::TestStatus createInstanceTest (Context& context)
        const int                                       patchNumbers[]                  = { 0, 1, 2, 3, 4, 5, 13, 4094, 4095 };
        const deUint32                          appVersions[]                   = { 0, 1, (deUint32)-1 };
        const deUint32                          engineVersions[]                = { 0, 1, (deUint32)-1 };
-       const PlatformInterface&        platformInterface               = context.getPlatformInterface();
        const deUint32                          apiVersion                              = context.getUsedApiVersion();
        vector<VkApplicationInfo>       appInfos;
 
@@ -192,7 +192,7 @@ tcu::TestStatus createInstanceTest (Context& context)
 
                try
                {
-                       const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
+                       CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
                        log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
                }
                catch (const vk::Error& err)
@@ -211,7 +211,7 @@ tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
        const PlatformInterface&        platformInterface               = context.getPlatformInterface();
 
        deUint32                                        instanceApiVersion              = 0u;
-       context.getPlatformInterface().enumerateInstanceVersion(&instanceApiVersion);
+       platformInterface.enumerateInstanceVersion(&instanceApiVersion);
 
        const ApiVersion                        apiVersion                              = unpackVersion(instanceApiVersion);
 
@@ -234,7 +234,7 @@ tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
                        0u,                                                                                     // deUint32                                             engineVersion;
                        pack(invalidApiVersions[apiVersionNdx]),        // deUint32                                             apiVersion;
                };
-               const VkInstanceCreateInfo instanceCreateInfo   =
+               const VkInstanceCreateInfo      instanceCreateInfo      =
                {
                        VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,         // VkStructureType                              sType;
                        DE_NULL,                                                                        // const void*                                  pNext;
@@ -246,28 +246,20 @@ tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
                        DE_NULL,                                                                        // const char*const*                    ppEnabledExtensionNames;
                };
 
-
                log << TestLog::Message
                        << "API version reported by enumerateInstanceVersion: " << apiVersion
                        << ", api version used to create instance: " << invalidApiVersions[apiVersionNdx]
                        << TestLog::EndMessage;
 
                {
-                       VkInstance                      instance                                = (VkInstance)0;
-                       const VkResult          result                                  = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
-                       const bool                      gotInstance                             = !!instance;
-
-                       if (instance)
-                       {
-                               const InstanceDriver    instanceIface(platformInterface, instance);
-                               instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
-                       }
+                       UncheckedInstance       instance;
+                       const VkResult          result          = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
 
                        if (apiVersion.majorNum == 1 && apiVersion.minorNum == 0)
                        {
                                if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
                                {
-                                       TCU_CHECK(!gotInstance);
+                                       TCU_CHECK(!static_cast<bool>(instance));
                                        log << TestLog::Message << "Pass, instance creation with invalid apiVersion is rejected" << TestLog::EndMessage;
                                }
                                else
@@ -277,7 +269,7 @@ tcu::TestStatus createInstanceWithInvalidApiVersionTest (Context& context)
                        {
                                if (result == VK_SUCCESS)
                                {
-                                       TCU_CHECK(gotInstance);
+                                       TCU_CHECK(static_cast<bool>(instance));
                                        log << TestLog::Message << "Pass, instance creation with nonstandard apiVersion succeeds for Vulkan 1.1" << TestLog::EndMessage;
                                }
                                else if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
@@ -301,9 +293,8 @@ tcu::TestStatus createInstanceWithNullApplicationInfoTest (Context& context)
 {
        tcu::TestLog&                           log                                             = context.getTestContext().getLog();
        tcu::ResultCollector            resultCollector                 (log);
-       const PlatformInterface&        platformInterface               = context.getPlatformInterface();
 
-       const VkInstanceCreateInfo              instanceCreateInfo              =
+       const VkInstanceCreateInfo      instanceCreateInfo              =
        {
                VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType                              sType;
                DE_NULL,                                                                // const void*                                  pNext;
@@ -319,7 +310,7 @@ tcu::TestStatus createInstanceWithNullApplicationInfoTest (Context& context)
 
        try
        {
-               const Unique<VkInstance> instance(createInstance(platformInterface, &instanceCreateInfo));
+               CustomInstance instance = createCustomInstanceFromInfo(context, &instanceCreateInfo);
                log << TestLog::Message << "Succeeded" << TestLog::EndMessage;
        }
        catch (const vk::Error& err)
@@ -333,7 +324,6 @@ tcu::TestStatus createInstanceWithNullApplicationInfoTest (Context& context)
 tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
 {
        tcu::TestLog&                                           log                                             = context.getTestContext().getLog();
-       const PlatformInterface&                        platformInterface               = context.getPlatformInterface();
        const char*                                                     enabledExtensions[]             = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION"};
        const deUint32                                          apiVersion                              = context.getUsedApiVersion();
        const VkApplicationInfo                         appInfo                                 =
@@ -346,6 +336,7 @@ tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
                0u,                                                                                                             // deUint32                                             engineVersion;
                apiVersion,                                                                                             // deUint32                                             apiVersion;
        };
+
        const VkInstanceCreateInfo                      instanceCreateInfo              =
        {
                VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,                                 // VkStructureType                              sType;
@@ -364,19 +355,12 @@ tcu::TestStatus createInstanceWithUnsupportedExtensionsTest (Context& context)
                log << TestLog::Message << enabledExtensions[ndx] <<  TestLog::EndMessage;
 
        {
-               VkInstance              instance        = (VkInstance)0;
-               const VkResult  result          = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
-               const bool              gotInstance     = !!instance;
-
-               if (instance)
-               {
-                       const InstanceDriver    instanceIface   (platformInterface, instance);
-                       instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
-               }
+               UncheckedInstance       instance;
+               const VkResult          result          = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
 
                if (result == VK_ERROR_EXTENSION_NOT_PRESENT)
                {
-                       TCU_CHECK(!gotInstance);
+                       TCU_CHECK(!static_cast<bool>(instance));
                        return tcu::TestStatus::pass("Pass, creating instance with unsupported extension was rejected.");
                }
                else
@@ -463,7 +447,6 @@ string getUTF8AbuseString (int index)
 
 tcu::TestStatus createInstanceWithExtensionNameAbuseTest (Context& context)
 {
-       const PlatformInterface&        platformInterface       = context.getPlatformInterface();
        const char*                                     extensionList[1]        = { 0 };
        const deUint32                          apiVersion                      = context.getUsedApiVersion();
        deUint32                                        failCount                       = 0;
@@ -497,20 +480,13 @@ tcu::TestStatus createInstanceWithExtensionNameAbuseTest (Context& context)
                };
 
                {
-                       VkInstance              instance        = (VkInstance)0;
-                       const VkResult  result          = platformInterface.createInstance(&instanceCreateInfo, DE_NULL/*pAllocator*/, &instance);
-                       const bool              gotInstance     = !!instance;
-
-                       if (instance)
-                       {
-                               const InstanceDriver instanceIface(platformInterface, instance);
-                               instanceIface.destroyInstance(instance, DE_NULL/*pAllocator*/);
-                       }
+                       UncheckedInstance       instance;
+                       const VkResult          result          = createUncheckedInstance(context, &instanceCreateInfo, DE_NULL, &instance);
 
                        if (result != VK_ERROR_EXTENSION_NOT_PRESENT)
                                failCount++;
 
-                       TCU_CHECK(!gotInstance);
+                       TCU_CHECK(!static_cast<bool>(instance));
                }
        }
 
@@ -582,9 +558,9 @@ tcu::TestStatus createInstanceWithLayerNameAbuseTest (Context& context)
 tcu::TestStatus createDeviceTest (Context& context)
 {
        const PlatformInterface&                platformInterface               = context.getPlatformInterface();
-       const Unique<VkInstance>                instance                                (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
-       const InstanceDriver                    instanceDriver                  (platformInterface, instance.get());
-       const VkPhysicalDevice                  physicalDevice                  = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+       const CustomInstance                    instance                                (createCustomInstanceFromContext(context));
+       const InstanceDriver&                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
        const deUint32                                  queueFamilyIndex                = 0;
        const deUint32                                  queueCount                              = 1;
        const deUint32                                  queueIndex                              = 0;
@@ -601,6 +577,7 @@ tcu::TestStatus createDeviceTest (Context& context)
                queueCount,                                                             //queueCount;
                &queuePriority,                                                 //pQueuePriorities;
        };
+
        const VkDeviceCreateInfo                deviceCreateInfo        =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,   //sType;
@@ -615,8 +592,8 @@ tcu::TestStatus createDeviceTest (Context& context)
                DE_NULL,                                                                //pEnabledFeatures;
        };
 
-       const Unique<VkDevice>                  device                                  (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
-       const DeviceDriver                              deviceDriver                    (platformInterface, instance.get(), device.get());
+       const Unique<VkDevice>                  device                                  (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+       const DeviceDriver                              deviceDriver                    (platformInterface, instance, device.get());
        const VkQueue                                   queue                                   = getDeviceQueue(deviceDriver, *device,  queueFamilyIndex, queueIndex);
 
        VK_CHECK(deviceDriver.queueWaitIdle(queue));
@@ -630,9 +607,9 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
        tcu::ResultCollector                                                            resultCollector                 (log);
        const int                                                                                       numDevices                              = 5;
        const PlatformInterface&                                                        platformInterface               = context.getPlatformInterface();
-       const Unique<VkInstance>                                                        instance                                (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
-       const InstanceDriver                                                            instanceDriver                  (platformInterface, instance.get());
-       const VkPhysicalDevice                                                          physicalDevice                  = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+       const CustomInstance                                                            instance                                (createCustomInstanceFromContext(context));
+       const InstanceDriver&                                                           instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                                          physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
        const vector<VkQueueFamilyProperties>                           queueFamilyProperties   = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
        const deUint32                                                                          queueFamilyIndex                = 0;
        const deUint32                                                                          queueCount                              = 1;
@@ -647,6 +624,7 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
                queueCount,                                                                             //queueCount;
                &queuePriority,                                                                 //pQueuePriorities;
        };
+
        const VkDeviceCreateInfo                                                        deviceCreateInfo                =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                   //sType;
@@ -660,13 +638,14 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
                DE_NULL,                                                                                //ppEnabledExtensionNames;
                DE_NULL,                                                                                //pEnabledFeatures;
        };
+
        vector<VkDevice>                                                                        devices(numDevices, (VkDevice)DE_NULL);
 
        try
        {
                for (int deviceNdx = 0; deviceNdx < numDevices; deviceNdx++)
                {
-                       const VkResult result = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
+                       const VkResult result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &devices[deviceNdx]);
 
                        if (result != VK_SUCCESS)
                        {
@@ -675,7 +654,7 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
                        }
 
                        {
-                               const DeviceDriver      deviceDriver    (platformInterface, instance.get(), devices[deviceNdx]);
+                               const DeviceDriver      deviceDriver    (platformInterface, instance, devices[deviceNdx]);
                                const VkQueue           queue                   = getDeviceQueue(deviceDriver, devices[deviceNdx], queueFamilyIndex, queueIndex);
 
                                VK_CHECK(deviceDriver.queueWaitIdle(queue));
@@ -692,7 +671,7 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
                {
                        if (devices[deviceNdx] != (VkDevice)DE_NULL)
                        {
-                               DeviceDriver deviceDriver(platformInterface, instance.get(), devices[deviceNdx]);
+                               DeviceDriver deviceDriver(platformInterface, instance, devices[deviceNdx]);
                                deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
                        }
                }
@@ -704,7 +683,7 @@ tcu::TestStatus createMultipleDevicesTest (Context& context)
        {
                if (devices[deviceNdx] != (VkDevice)DE_NULL)
                {
-                       DeviceDriver deviceDriver(platformInterface, instance.get(), devices[deviceNdx]);
+                       DeviceDriver deviceDriver(platformInterface, instance, devices[deviceNdx]);
                        deviceDriver.destroyDevice(devices[deviceNdx], DE_NULL/*pAllocator*/);
                }
        }
@@ -716,10 +695,10 @@ tcu::TestStatus createDeviceWithUnsupportedExtensionsTest (Context& context)
 {
        tcu::TestLog&                                   log                                             = context.getTestContext().getLog();
        const PlatformInterface&                platformInterface               = context.getPlatformInterface();
-       const Unique<VkInstance>                instance                                (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
-       const InstanceDriver                    instanceDriver                  (platformInterface, instance.get());
+       const CustomInstance                    instance                                (createCustomInstanceFromContext(context, DE_NULL, false));
+       const InstanceDriver&                   instanceDriver                  (instance.getDriver());
        const char*                                             enabledExtensions[]             = {"VK_UNSUPPORTED_EXTENSION", "THIS_IS_NOT_AN_EXTENSION", "VK_DONT_SUPPORT_ME"};
-       const VkPhysicalDevice                  physicalDevice                  = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+       const VkPhysicalDevice                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
        const float                                             queuePriority                   = 1.0f;
        const VkDeviceQueueCreateInfo   deviceQueueCreateInfo   =
        {
@@ -730,6 +709,7 @@ tcu::TestStatus createDeviceWithUnsupportedExtensionsTest (Context& context)
                1,                                                                              //queueCount;
                &queuePriority,                                                 //pQueuePriorities;
        };
+
        const VkDeviceCreateInfo                deviceCreateInfo                =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,   //sType;
@@ -751,12 +731,12 @@ tcu::TestStatus createDeviceWithUnsupportedExtensionsTest (Context& context)
 
        {
                VkDevice                device          = (VkDevice)0;
-               const VkResult  result          = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
+               const VkResult  result          = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL/*pAllocator*/, &device);
                const bool              gotDevice       = !!device;
 
                if (device)
                {
-                       const DeviceDriver      deviceIface     (platformInterface, instance.get(), device);
+                       const DeviceDriver      deviceIface     (platformInterface, instance, device);
                        deviceIface.destroyDevice(device, DE_NULL/*pAllocator*/);
                }
 
@@ -787,9 +767,9 @@ tcu::TestStatus createDeviceWithVariousQueueCountsTest (Context& context)
        tcu::TestLog&                                                   log                                             = context.getTestContext().getLog();
        const int                                                               queueCountDiff                  = 1;
        const PlatformInterface&                                platformInterface               = context.getPlatformInterface();
-       const Unique<VkInstance>                                instance                                (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
-       const InstanceDriver                                    instanceDriver                  (platformInterface, instance.get());
-       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+       const CustomInstance                                    instance                                (createCustomInstanceFromContext(context));
+       const InstanceDriver&                                   instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
        const vector<VkQueueFamilyProperties>   queueFamilyProperties   = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
        const vector<float>                                             queuePriorities                 (getGlobalMaxQueueCount(queueFamilyProperties), 1.0f);
        vector<VkDeviceQueueCreateInfo>                 deviceQueueCreateInfos;
@@ -830,8 +810,9 @@ tcu::TestStatus createDeviceWithVariousQueueCountsTest (Context& context)
                        DE_NULL,                                                                //ppEnabledExtensionNames;
                        DE_NULL,                                                                //pEnabledFeatures;
                };
-               const Unique<VkDevice>                  device                          (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
-               const DeviceDriver                              deviceDriver            (platformInterface, instance.get(), device.get());
+
+               const Unique<VkDevice>                  device                          (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+               const DeviceDriver                              deviceDriver            (platformInterface, instance, device.get());
                const deUint32                                  queueFamilyIndex        = deviceCreateInfo.pQueueCreateInfos->queueFamilyIndex;
                const deUint32                                  queueCount                      = deviceCreateInfo.pQueueCreateInfos->queueCount;
 
@@ -860,17 +841,15 @@ tcu::TestStatus createDeviceWithVariousQueueCountsTest (Context& context)
 
 tcu::TestStatus createDeviceFeatures2Test (Context& context)
 {
-       const PlatformInterface&                vkp                                             = context.getPlatformInterface();
-       const Unique<VkInstance>                instance                                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                                             (vkp, instance.get());
-       const VkPhysicalDevice                  physicalDevice                  = chooseDevice(vki, instance.get(), context.getTestContext().getCommandLine());
-       const deUint32                                  queueFamilyIndex                = 0;
-       const deUint32                                  queueCount                              = 1;
-       const deUint32                                  queueIndex                              = 0;
-       const float                                             queuePriority                   = 1.0f;
-
-       const InstanceDriver                                    instanceDriver                  (vkp, instance.get());
-       const vector<VkQueueFamilyProperties>   queueFamilyProperties   = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
+       const PlatformInterface&                                vkp                                             = context.getPlatformInterface();
+       const CustomInstance                                    instance                                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                                   vki                                             (instance.getDriver());
+       const VkPhysicalDevice                                  physicalDevice                  = chooseDevice(vki, instance, context.getTestContext().getCommandLine());
+       const deUint32                                                  queueFamilyIndex                = 0;
+       const deUint32                                                  queueCount                              = 1;
+       const deUint32                                                  queueIndex                              = 0;
+       const float                                                             queuePriority                   = 1.0f;
+       const vector<VkQueueFamilyProperties>   queueFamilyProperties   = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
 
        VkPhysicalDeviceFeatures2               enabledFeatures;
        const VkDeviceQueueCreateInfo   deviceQueueCreateInfo   =
@@ -882,6 +861,7 @@ tcu::TestStatus createDeviceFeatures2Test (Context& context)
                queueCount,
                &queuePriority,
        };
+
        const VkDeviceCreateInfo                deviceCreateInfo        =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -889,7 +869,7 @@ tcu::TestStatus createDeviceFeatures2Test (Context& context)
                (VkDeviceCreateFlags)0u,
                1,
                &deviceQueueCreateInfo,
-               0,
+               0u,
                DE_NULL,
                0,
                DE_NULL,
@@ -903,8 +883,8 @@ tcu::TestStatus createDeviceFeatures2Test (Context& context)
        vki.getPhysicalDeviceFeatures2(physicalDevice, &enabledFeatures);
 
        {
-               const Unique<VkDevice>  device          (createDevice(vkp, *instance, vki, physicalDevice, &deviceCreateInfo));
-               const DeviceDriver              vkd                     (vkp, instance.get(), device.get());
+               const Unique<VkDevice>  device          (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceCreateInfo));
+               const DeviceDriver              vkd                     (vkp, instance, device.get());
                const VkQueue                   queue           = getDeviceQueue(vkd, *device, queueFamilyIndex, queueIndex);
 
                VK_CHECK(vkd.queueWaitIdle(queue));
@@ -925,10 +905,9 @@ tcu::TestStatus createDeviceWithUnsupportedFeaturesTest (Context& context)
 {
        tcu::TestLog&                           log                                             = context.getTestContext().getLog();
        tcu::ResultCollector            resultCollector                 (log);
-       const PlatformInterface&        platformInterface               = context.getPlatformInterface();
-       const Move<VkInstance>          instance                                (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
-       const InstanceDriver            instanceDriver                  (platformInterface, instance.get());
-       const VkPhysicalDevice          physicalDevice                  = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
+       const CustomInstance            instance                                (createCustomInstanceFromContext(context, DE_NULL, false));
+       const InstanceDriver&           instanceDriver                  (instance.getDriver());
+       const VkPhysicalDevice          physicalDevice                  = chooseDevice(instanceDriver, instance, context.getTestContext().getCommandLine());
        const deUint32                          queueFamilyIndex                = 0;
        const deUint32                          queueCount                              = 1;
        const float                                     queuePriority                   = 1.0f;
@@ -1027,7 +1006,7 @@ tcu::TestStatus createDeviceWithUnsupportedFeaturesTest (Context& context)
                        (VkDeviceCreateFlags)0u,
                        1,
                        &deviceQueueCreateInfo,
-                       0,
+                       0u,
                        DE_NULL,
                        0,
                        DE_NULL,
@@ -1035,7 +1014,7 @@ tcu::TestStatus createDeviceWithUnsupportedFeaturesTest (Context& context)
                };
 
                VkDevice                device;
-               const VkResult  res     = instanceDriver.createDevice(physicalDevice, &deviceCreateInfo, DE_NULL, &device);
+               const VkResult  res     = createUncheckedDevice(false, instanceDriver, physicalDevice, &deviceCreateInfo, DE_NULL, &device);
 
                if (res != VK_ERROR_FEATURE_NOT_PRESENT)
                {
@@ -1058,7 +1037,7 @@ tcu::TestStatus createDeviceQueue2Test (Context& context)
 
        const PlatformInterface&                                platformInterface               = context.getPlatformInterface();
        const VkInstance                                                instance                                = context.getInstance();
-       const InstanceDriver                                    instanceDriver                  (platformInterface, instance);
+       const InstanceInterface&                                instanceDriver                  = context.getInstanceInterface();
        const VkPhysicalDevice                                  physicalDevice                  = context.getPhysicalDevice();
        const deUint32                                                  queueFamilyIndex                = context.getUniversalQueueFamilyIndex();
        const deUint32                                                  queueCount                              = 1;
@@ -1103,6 +1082,7 @@ tcu::TestStatus createDeviceQueue2Test (Context& context)
                DE_NULL,                                                                                                                // const char* const*                           ppEnabledExtensionNames;
                DE_NULL,                                                                                                                // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
+
        const VkDeviceQueueInfo2                                deviceQueueInfo2                =
        {
                VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,                                                  // VkStructureType                                      sType;
@@ -1113,7 +1093,7 @@ tcu::TestStatus createDeviceQueue2Test (Context& context)
        };
 
        {
-               const Unique<VkDevice>                          device                                  (createDevice(platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+               const Unique<VkDevice>                          device                                  (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
                const DeviceDriver                                      deviceDriver                    (platformInterface, instance, device.get());
                const VkQueue                                           queue2                                  = getDeviceQueue2(deviceDriver, *device, &deviceQueueInfo2);
 
@@ -1130,7 +1110,7 @@ tcu::TestStatus createDeviceQueue2UnmatchedFlagsTest (Context& context)
 
        const PlatformInterface&                platformInterface               = context.getPlatformInterface();
        const VkInstance                                instance                                = context.getInstance();
-       const InstanceDriver                    instanceDriver                  (platformInterface, instance);
+       const InstanceInterface&                instanceDriver                  = context.getInstanceInterface();
        const VkPhysicalDevice                  physicalDevice                  = context.getPhysicalDevice();
 
        // Check if VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT flag can be used.
@@ -1193,6 +1173,7 @@ tcu::TestStatus createDeviceQueue2UnmatchedFlagsTest (Context& context)
                DE_NULL,                                                                        // const char* const*                           ppEnabledExtensionNames;
                DE_NULL,                                                                        // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
+
        const VkDeviceQueueInfo2                                deviceQueueInfo2                =
        {
                VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,          // VkStructureType                                      sType;
@@ -1203,7 +1184,7 @@ tcu::TestStatus createDeviceQueue2UnmatchedFlagsTest (Context& context)
        };
 
        {
-               const Unique<VkDevice>          device                                  (createDevice(platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+               const Unique<VkDevice>          device                                  (createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), platformInterface, instance, instanceDriver, physicalDevice, &deviceCreateInfo));
                const DeviceDriver                      deviceDriver                    (platformInterface, instance, device.get());
                const VkQueue                           queue2                                  = getDeviceQueue2(deviceDriver, *device, &deviceQueueInfo2);
 
@@ -1414,6 +1395,7 @@ tcu::TestStatus createInstanceDeviceIntentionalAllocFail (Context& context)
                0u,                                                                             // engineVersion
                VK_API_VERSION_1_0                                              // apiVersion
        };
+
        const VkInstanceCreateInfo      instanceCreateInfo      =
        {
                VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
@@ -1425,6 +1407,7 @@ tcu::TestStatus createInstanceDeviceIntentionalAllocFail (Context& context)
                0u,                                                                             // enabledExtensionCount
                DE_NULL                                                                 // ppEnabledExtensionNames
        };
+
        deUint32                                        failIndex                       = 0;
        VkResult                                        result                          = VK_SUCCESS;
        size_t                                          max_allowed_alloc       = 0;
@@ -1530,6 +1513,7 @@ tcu::TestStatus createInstanceDeviceIntentionalAllocFail (Context& context)
                        1u,                                                                                     // queueCount
                        &queuePriority                                                          // pQueuePriorities
                };
+
                const VkDeviceCreateInfo                deviceCreateInfo                =
                {
                        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,           // sType
@@ -1544,7 +1528,7 @@ tcu::TestStatus createInstanceDeviceIntentionalAllocFail (Context& context)
                        DE_NULL                                                                         // pEnabledFeatures
                };
 
-               result = vki.createDevice(physicalDevices[chosenDevice], &deviceCreateInfo, &allocationCallbacks, &device);
+               result = createUncheckedDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vki, physicalDevices[chosenDevice], &deviceCreateInfo, &allocationCallbacks, &device);
 
                if (result == VK_ERROR_OUT_OF_HOST_MEMORY)
                {
index 415109b..5425125 100644 (file)
@@ -20,6 +20,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktApiExternalMemoryTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vktTestCaseUtil.hpp"
 #include "vkRefUtil.hpp"
@@ -30,6 +31,7 @@
 #include "vkApiVersion.hpp"
 
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deUniquePtr.hpp"
 #include "deStringUtil.hpp"
@@ -211,15 +213,14 @@ std::vector<std::string> getInstanceExtensions (const deUint32 instanceVersion,
        return instanceExtensions;
 }
 
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface&                                  vkp,
-                                                                                const deUint32                                                                 version,
-                                                                                const vk::VkExternalSemaphoreHandleTypeFlags   externalSemaphoreTypes,
-                                                                                const vk::VkExternalMemoryHandleTypeFlags              externalMemoryTypes,
-                                                                                const vk::VkExternalFenceHandleTypeFlags               externalFenceTypes)
+CustomInstance createTestInstance (Context&                                                                            context,
+                                                                  const vk::VkExternalSemaphoreHandleTypeFlags externalSemaphoreTypes,
+                                                                  const vk::VkExternalMemoryHandleTypeFlags    externalMemoryTypes,
+                                                                  const vk::VkExternalFenceHandleTypeFlags             externalFenceTypes)
 {
        try
        {
-               return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), getInstanceExtensions(version, externalSemaphoreTypes, externalMemoryTypes, externalFenceTypes));
+               return vkt::createCustomInstanceWithExtensions(context, getInstanceExtensions(context.getUsedApiVersion(), externalSemaphoreTypes, externalMemoryTypes, externalFenceTypes));
        }
        catch (const vk::Error& error)
        {
@@ -230,20 +231,21 @@ vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface&                                     vkp,
        }
 }
 
-vk::Move<vk::VkDevice> createDevice (const deUint32                                                                    apiVersion,
-                                                                        const vk::PlatformInterface&                                   vkp,
-                                                                        vk::VkInstance                                                                 instance,
-                                                                        const vk::InstanceInterface&                                   vki,
-                                                                        vk::VkPhysicalDevice                                                   physicalDevice,
-                                                                        const vk::VkExternalSemaphoreHandleTypeFlags   externalSemaphoreTypes,
-                                                                        const vk::VkExternalMemoryHandleTypeFlags              externalMemoryTypes,
-                                                                        const vk::VkExternalFenceHandleTypeFlags               externalFenceTypes,
-                                                                        deUint32                                                                               queueFamilyIndex,
-                                                                        bool                                                                                   useDedicatedAllocs = false)
+vk::Move<vk::VkDevice> createTestDevice (const Context&                                                                        context,
+                                                                                const vk::PlatformInterface&                                   vkp,
+                                                                                vk::VkInstance                                                                 instance,
+                                                                                const vk::InstanceInterface&                                   vki,
+                                                                                vk::VkPhysicalDevice                                                   physicalDevice,
+                                                                                const vk::VkExternalSemaphoreHandleTypeFlags   externalSemaphoreTypes,
+                                                                                const vk::VkExternalMemoryHandleTypeFlags              externalMemoryTypes,
+                                                                                const vk::VkExternalFenceHandleTypeFlags               externalFenceTypes,
+                                                                                deUint32                                                                               queueFamilyIndex,
+                                                                                bool                                                                                   useDedicatedAllocs = false)
 {
-       bool    useExternalSemaphore = false;
-       bool    useExternalFence = false;
-       bool    useExternalMemory = false;
+       const deUint32                          apiVersion                              = context.getUsedApiVersion();
+       bool                                            useExternalSemaphore    = false;
+       bool                                            useExternalFence                = false;
+       bool                                            useExternalMemory               = false;
        std::vector<const char*>        deviceExtensions;
 
        if ((externalSemaphoreTypes
@@ -374,7 +376,7 @@ vk::Move<vk::VkDevice> createDevice (const deUint32                                                                 apiVersion,
 
        try
        {
-               return vk::createDevice(vkp, instance, vki, physicalDevice, &deviceCreateInfo);
+               return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceCreateInfo);
        }
        catch (const vk::Error& error)
        {
@@ -748,10 +750,9 @@ void submitDummySignalAndGetFenceNative (  const vk::DeviceInterface&                                      vk,
 
 tcu::TestStatus testSemaphoreQueries (Context& context, vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
 {
-       const vk::PlatformInterface&            vkp                             (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                (createInstance(vkp, context.getUsedApiVersion(), externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                             (vkp, *instance);
-       const vk::VkPhysicalDevice                      device                  (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                (createTestInstance(context, externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                             (instance.getDriver());
+       const vk::VkPhysicalDevice                      device                  (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
 
        TestLog&                                                        log                             = context.getTestContext().getLog();
 
@@ -798,16 +799,16 @@ tcu::TestStatus testSemaphoreWin32Create (Context&                                        context,
 #if (DE_OS == DE_OS_WIN32)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>                                  device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                                                  vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                                  device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                                                  vkd                             (vkp, instance, *device);
                const vk::VkQueue                                                               queue                   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::VkExportSemaphoreWin32HandleInfoKHR   win32ExportInfo =
                {
@@ -869,16 +870,16 @@ tcu::TestStatus testSemaphoreImportTwice (Context&                                        context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                             (vkp, instance, *device);
                const vk::VkQueue                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphore               (createExportableSemaphore(vkd, *device, config.externalType));
                NativeHandle                                            handleA;
@@ -916,16 +917,16 @@ tcu::TestStatus testSemaphoreImportReimport (Context&                                     context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                             (vkp, instance, *device);
                const vk::VkQueue                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA              (createExportableSemaphore(vkd, *device, config.externalType));
@@ -962,16 +963,16 @@ tcu::TestStatus testSemaphoreSignalExportImportWait (Context&                                     context,
                                                                                                         const SemaphoreTestConfig      config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                                     (vkp, instance, *device);
                const vk::VkQueue                                       queue                           (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphoreA                      (createExportableSemaphore(vkd, *device, config.externalType));
                {
@@ -996,9 +997,9 @@ tcu::TestStatus testSemaphoreExportSignalImportWait (Context&                                       context,
                                                                                                         const SemaphoreTestConfig      config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
        const vk::VkSemaphoreImportFlags        flags                           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
 
@@ -1006,8 +1007,8 @@ tcu::TestStatus testSemaphoreExportSignalImportWait (Context&                                     context,
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                                     (vkp, instance, *device);
                const vk::VkQueue                                       queue                           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA                      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1033,9 +1034,9 @@ tcu::TestStatus testSemaphoreExportImportSignalWait (Context&                                     context,
                                                                                                         const SemaphoreTestConfig      config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
@@ -1043,8 +1044,8 @@ tcu::TestStatus testSemaphoreExportImportSignalWait (Context&                                     context,
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1068,17 +1069,17 @@ tcu::TestStatus testSemaphoreSignalImport (Context&                                             context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1116,17 +1117,17 @@ tcu::TestStatus testSemaphoreSignalWaitImport (Context&                                         context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1167,16 +1168,16 @@ tcu::TestStatus testSemaphoreMultipleExports (Context&                                  context,
        const size_t                                            exportCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphore       (createExportableSemaphore(vkd, *device, config.externalType));
 
@@ -1205,17 +1206,17 @@ tcu::TestStatus testSemaphoreMultipleImports (Context&                                  context,
        const size_t                                            importCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
                NativeHandle                                            handleA;
@@ -1255,17 +1256,17 @@ tcu::TestStatus testSemaphoreTransference (Context&                                             context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(),  vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context,  vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -1348,17 +1349,17 @@ tcu::TestStatus testSemaphoreFdDup (Context&                                    context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                        log                     = context.getTestContext().getLog();
@@ -1411,17 +1412,17 @@ tcu::TestStatus testSemaphoreFdDup2 (Context&                                   context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkSemaphoreImportFlags        flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT : (vk::VkSemaphoreImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                        log                     = context.getTestContext().getLog();
@@ -1481,16 +1482,16 @@ tcu::TestStatus testSemaphoreFdDup3 (Context&                                   context,
 #if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                        log                     = context.getTestContext().getLog();
@@ -1551,16 +1552,16 @@ tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                         context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), config.externalType, 0u, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, config.externalType, 0u, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>          device          (createTestDevice(context, vkp, instance, vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vkp, instance, *device);
                const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                        log                     = context.getTestContext().getLog();
@@ -1687,10 +1688,9 @@ tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                          context,
 
 tcu::TestStatus testFenceQueries (Context& context, vk::VkExternalFenceHandleTypeFlagBits externalType)
 {
-       const vk::PlatformInterface&                                    vkp                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                                instance        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, externalType));
-       const vk::InstanceDriver                                                vki                     (vkp, *instance);
-       const vk::VkPhysicalDevice                                              device          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                                    instance        (createTestInstance(context, 0u, 0u, externalType));
+       const vk::InstanceDriver&                                               vki                     (instance.getDriver());
+       const vk::VkPhysicalDevice                                              device          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
 
        TestLog&                                                                                log                     = context.getTestContext().getLog();
 
@@ -1738,16 +1738,16 @@ tcu::TestStatus testFenceWin32Create (Context&                          context,
 #if (DE_OS == DE_OS_WIN32)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>                          device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                                          vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                          device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                                          vkd                             (vkp, instance, *device);
                const vk::VkQueue                                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::VkExportFenceWin32HandleInfoKHR       win32ExportInfo =
                {
@@ -1809,16 +1809,16 @@ tcu::TestStatus testFenceImportTwice (Context&                          context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vkp, instance, *device);
                const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkFence>   fence           (createExportableFence(vkd, *device, config.externalType));
                NativeHandle                                    handleA;
@@ -1856,16 +1856,16 @@ tcu::TestStatus testFenceImportReimport (Context&                               context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -1902,16 +1902,16 @@ tcu::TestStatus testFenceSignalExportImportWait (Context&                               context,
                                                                                                 const FenceTestConfig  config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
 
@@ -1937,9 +1937,9 @@ tcu::TestStatus testFenceExportSignalImportWait (Context&                         context,
                                                                                                 const FenceTestConfig  config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
        const vk::VkFenceImportFlags            flags                           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
 
@@ -1947,8 +1947,8 @@ tcu::TestStatus testFenceExportSignalImportWait (Context&                         context,
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -1974,9 +1974,9 @@ tcu::TestStatus testFenceExportImportSignalWait (Context&                         context,
                                                                                                 const FenceTestConfig  config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
@@ -1984,8 +1984,8 @@ tcu::TestStatus testFenceExportImportSignalWait (Context&                         context,
 
        {
                const vk::VkFenceImportFlags    flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vkp, instance, *device);
                const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -2009,17 +2009,17 @@ tcu::TestStatus testFenceSignalImport (Context&                                 context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -2057,17 +2057,17 @@ tcu::TestStatus testFenceReset (Context&                                context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -2122,17 +2122,17 @@ tcu::TestStatus testFenceSignalWaitImport (Context&                                     context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vkp, instance, *device);
                const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -2173,16 +2173,16 @@ tcu::TestStatus testFenceMultipleExports (Context&                              context,
        const size_t                                            exportCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkFence>   fence   (createExportableFence(vkd, *device, config.externalType));
 
@@ -2211,17 +2211,17 @@ tcu::TestStatus testFenceMultipleImports (Context&                              context,
        const size_t                                            importCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
                NativeHandle                                    handleA;
@@ -2261,17 +2261,17 @@ tcu::TestStatus testFenceTransference (Context&                                 context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
@@ -2360,17 +2360,17 @@ tcu::TestStatus testFenceFdDup (Context&                                context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                log             = context.getTestContext().getLog();
@@ -2423,17 +2423,17 @@ tcu::TestStatus testFenceFdDup2 (Context&                               context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
                const vk::VkFenceImportFlags    flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT : (vk::VkFenceImportFlagBits)0u;
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                log             = context.getTestContext().getLog();
@@ -2493,16 +2493,16 @@ tcu::TestStatus testFenceFdDup3 (Context&                               context,
 #if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                log             = context.getTestContext().getLog();
@@ -2563,16 +2563,16 @@ tcu::TestStatus testFenceFdSendOverSocket (Context&                                     context,
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, 0u, config.externalType));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, 0u, config.externalType));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>  device  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
-               const vk::DeviceDriver                  vkd             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>  device  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vkp, instance, *device);
                const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
                TestLog&                                                log             = context.getTestContext().getLog();
@@ -2719,9 +2719,9 @@ tcu::TestStatus testBufferQueries (Context& context, vk::VkExternalMemoryHandleT
                vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
        };
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, externalType, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, externalType, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const vk::VkPhysicalDeviceFeatures      deviceFeatures          (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
@@ -2781,8 +2781,8 @@ tcu::TestStatus testBufferQueries (Context& context, vk::VkExternalMemoryHandleT
                                // \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
                                try
                                {
-                                       device                          = createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
-                                       vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, *instance, *device));
+                                       device                          = createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
+                                       vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, instance, *device));
                                        deviceHasDedicated      = requiresDedicated;
                                }
                                catch (const tcu::NotSupportedError& e)
@@ -2852,12 +2852,12 @@ tcu::TestStatus testMemoryWin32Create (Context& context, MemoryTestConfig config
 {
 #if (DE_OS == DE_OS_WIN32)
        const vk::PlatformInterface&                            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                            instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                          device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                          vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                          device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                          vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                            usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const deUint32                                                          seed                            = 1261033864u;
        const vk::VkDeviceSize                                          bufferSize                      = 1024;
@@ -2934,12 +2934,12 @@ tcu::TestStatus testMemoryWin32Create (Context& context, MemoryTestConfig config
 tcu::TestStatus testMemoryImportTwice (Context& context, MemoryTestConfig config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const deUint32                                                  seed                            = 1261033864u;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -2993,12 +2993,12 @@ tcu::TestStatus testMemoryMultipleImports (Context& context, MemoryTestConfig co
 {
        const size_t                                                    count                           = 4 * 1024;
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3029,12 +3029,12 @@ tcu::TestStatus testMemoryMultipleExports (Context& context, MemoryTestConfig co
 {
        const size_t                                                    count                           = 4 * 1024;
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3058,12 +3058,12 @@ tcu::TestStatus testMemoryMultipleExports (Context& context, MemoryTestConfig co
 tcu::TestStatus testMemoryFdProperties (Context& context, MemoryTestConfig config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3079,6 +3079,7 @@ tcu::TestStatus testMemoryFdProperties (Context& context, MemoryTestConfig confi
        NativeHandle                            handle;
 
        getMemoryNative(vkd, *device, *memory, config.externalType, handle);
+       properties.sType = vk::VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR;
        vk::VkResult res = vkd.getMemoryFdPropertiesKHR(*device, config.externalType, handle.getFd(), &properties);
 
        switch (config.externalType)
@@ -3099,14 +3100,14 @@ tcu::TestStatus testMemoryFdDup (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                                  vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                  device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                                  vkd                             (vkp, instance, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
                const vk::VkBufferUsageFlags                    usage                   = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3163,14 +3164,14 @@ tcu::TestStatus testMemoryFdDup2 (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                                  vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                  device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                                  vkd                             (vkp, instance, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
                const vk::VkBufferUsageFlags                    usage                   = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3228,14 +3229,14 @@ tcu::TestStatus testMemoryFdDup3 (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                                  vkd                             (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                  device                  (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                                  vkd                             (vkp, instance, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
                const vk::VkBufferUsageFlags                    usage                   = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3293,14 +3294,14 @@ tcu::TestStatus testMemoryFdSendOverSocket (Context& context, MemoryTestConfig c
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&                            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                            instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+               const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
 
                TestLog&                                                                log                                     = context.getTestContext().getLog();
                const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -3451,12 +3452,12 @@ tcu::TestStatus testBufferBindExportImportBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3489,12 +3490,12 @@ tcu::TestStatus testBufferExportBindImportBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3526,12 +3527,12 @@ tcu::TestStatus testBufferExportImportBindBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
 
@@ -3584,9 +3585,9 @@ tcu::TestStatus testImageQueries (Context& context, vk::VkExternalMemoryHandleTy
                vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
        };
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, externalType, 0u));
-       const vk::InstanceDriver                        vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                            instance                        (createTestInstance(context, 0u, externalType, 0u));
+       const vk::InstanceDriver&                       vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const vk::VkPhysicalDeviceFeatures      deviceFeatures          (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
@@ -3669,8 +3670,8 @@ tcu::TestStatus testImageQueries (Context& context, vk::VkExternalMemoryHandleTy
                                // \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
                                try
                                {
-                                       device                          = createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
-                                       vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, *instance, *device));
+                                       device                          = createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
+                                       vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vkp, instance, *device));
                                        deviceHasDedicated      = requiresDedicated;
                                }
                                catch (const tcu::NotSupportedError& e)
@@ -3727,12 +3728,12 @@ tcu::TestStatus testImageBindExportImportBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
        const deUint32                                                  width                           = 64u;
@@ -3767,12 +3768,12 @@ tcu::TestStatus testImageExportBindImportBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
        const deUint32                                                  width                           = 64u;
@@ -3806,12 +3807,12 @@ tcu::TestStatus testImageExportImportBindBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, context.getUsedApiVersion(), 0u, config.externalType, 0u));
-       const vk::InstanceDriver                                vki                                     (vkp, *instance);
-       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                    instance                        (createTestInstance(context, 0u, config.externalType, 0u));
+       const vk::InstanceDriver&                               vki                                     (instance.getDriver());
+       const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
-       const vk::DeviceDriver                                  vkd                                     (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                  device                          (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
+       const vk::DeviceDriver                                  vkd                                     (vkp, instance, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
        const deUint32                                                  width                           = 64u;
@@ -3971,12 +3972,12 @@ tcu::TestStatus testAndroidHardwareBufferImageFormat  (Context& context, vk::VkF
 
        const vk::VkExternalMemoryHandleTypeFlagBits  externalMemoryType  =     vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
        const vk::PlatformInterface&                              vkp                                   (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                          instance                              (createInstance(vkp, context.getUsedApiVersion(), externalMemoryType, 0u, 0u));
-       const vk::InstanceDriver                                          vki                                   (vkp, *instance);
-       const vk::VkPhysicalDevice                                        physicalDevice                (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const CustomInstance                                              instance                              (createTestInstance(context, externalMemoryType, 0u, 0u));
+       const vk::InstanceDriver&                                         vki                                   (instance.getDriver());
+       const vk::VkPhysicalDevice                                        physicalDevice                (vk::chooseDevice(vki, instance, context.getTestContext().getCommandLine()));
        const deUint32                                                            queueFamilyIndex              (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                            device                                (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalMemoryType, 0u, queueFamilyIndex));
-       const vk::DeviceDriver                                            vkd                                   (vkp, *instance, *device);
+       const vk::Unique<vk::VkDevice>                            device                                (createTestDevice(context, vkp, instance, vki, physicalDevice, 0u, externalMemoryType, 0u, queueFamilyIndex));
+       const vk::DeviceDriver                                            vkd                                   (vkp, instance, *device);
        TestLog&                                                                          log                             = context.getTestContext().getLog();
        const vk::VkPhysicalDeviceLimits                          limits                          = getPhysicalDeviceProperties(vki, physicalDevice).limits;
 
index 5dd6027..b445902 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkPlatform.hpp"
 #include "vkStrUtil.hpp"
@@ -1311,10 +1312,9 @@ tcu::TestStatus enumeratePhysicalDeviceGroups (Context& context)
 {
        TestLog&                                                                                        log                             = context.getTestContext().getLog();
        tcu::ResultCollector                                                            results                 (log);
-       const PlatformInterface&                                                        vkp                             = context.getPlatformInterface();
-       const Unique<VkInstance>                                                        instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_device_group_creation"));
-       const InstanceDriver                                                            vki                             (vkp, *instance);
-       const vector<VkPhysicalDeviceGroupProperties>           devicegroups    = enumeratePhysicalDeviceGroups(vki, *instance);
+       const CustomInstance                                                            instance                (createCustomInstanceWithExtension(context, "VK_KHR_device_group_creation"));
+       const InstanceDriver&                                                           vki                             (instance.getDriver());
+       const vector<VkPhysicalDeviceGroupProperties>           devicegroups    = enumeratePhysicalDeviceGroups(vki, instance);
 
        log << TestLog::Integer("NumDevices", "Number of device groups", "", QP_KEY_TAG_NONE, deInt64(devicegroups.size()));
 
@@ -2078,11 +2078,11 @@ tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
 {
        TestLog&                                                        log                                             = context.getTestContext().getLog();
        const PlatformInterface&                        vkp                                             = context.getPlatformInterface();
-       const Unique<VkInstance>                        instance                                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_device_group_creation"));
-       const InstanceDriver                            vki                                             (vkp, *instance);
+       const CustomInstance                            instance                                (createCustomInstanceWithExtension(context, "VK_KHR_device_group_creation"));
+       const InstanceDriver&                           vki                                             (instance.getDriver());
        const tcu::CommandLine&                         cmdLine                                 = context.getTestContext().getCommandLine();
        const deUint32                                          devGroupIdx                             = cmdLine.getVKDeviceGroupId() - 1;
-       const deUint32                                          deviceIdx                               = vk::chooseDeviceIndex(context.getInstanceInterface(), *instance, cmdLine);
+       const deUint32                                          deviceIdx                               = vk::chooseDeviceIndex(context.getInstanceInterface(), instance, cmdLine);
        const float                                                     queuePriority                   = 1.0f;
        VkPhysicalDeviceMemoryProperties        memProps;
        VkPeerMemoryFeatureFlags*                       peerMemFeatures;
@@ -2090,7 +2090,7 @@ tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
        deUint32                                                        numPhysicalDevices              = 0;
        deUint32                                                        queueFamilyIndex                = 0;
 
-       const vector<VkPhysicalDeviceGroupProperties>           deviceGroupProps = enumeratePhysicalDeviceGroups(vki, *instance);
+       const vector<VkPhysicalDeviceGroupProperties>           deviceGroupProps = enumeratePhysicalDeviceGroups(vki, instance);
        std::vector<const char*>                                                        deviceExtensions;
        deviceExtensions.push_back("VK_KHR_device_group");
 
@@ -2126,6 +2126,7 @@ tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
                deviceGroupProps[devGroupIdx].physicalDeviceCount,      //physicalDeviceCount
                deviceGroupProps[devGroupIdx].physicalDevices           //physicalDevices
        };
+
        const VkDeviceCreateInfo                                                                deviceCreateInfo =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                                   //sType;
@@ -2140,8 +2141,8 @@ tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
                DE_NULL,                                                                                                                //pEnabledFeatures;
        };
 
-       Move<VkDevice>          deviceGroup = createDevice(vkp, *instance, vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
-       const DeviceDriver      vk      (vkp, *instance, *deviceGroup);
+       Move<VkDevice>          deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+       const DeviceDriver      vk      (vkp, instance, *deviceGroup);
        context.getInstanceInterface().getPhysicalDeviceMemoryProperties(deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &memProps);
 
        peerMemFeatures = reinterpret_cast<VkPeerMemoryFeatureFlags*>(buffer);
@@ -3361,10 +3362,9 @@ bool checkExtension (vector<VkExtensionProperties>& properties, const char* exte
 
 tcu::TestStatus deviceFeatures2 (Context& context)
 {
-       const PlatformInterface&        vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice          physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>        instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver            vki                             (vkp, *instance);
+       const CustomInstance            instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&           vki                             (instance.getDriver());
        TestLog&                                        log                             = context.getTestContext().getLog();
        VkPhysicalDeviceFeatures        coreFeatures;
        VkPhysicalDeviceFeatures2       extFeatures;
@@ -3640,10 +3640,9 @@ tcu::TestStatus deviceFeatures2 (Context& context)
 
 tcu::TestStatus deviceProperties2 (Context& context)
 {
-       const PlatformInterface&                vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice                  physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>                instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                             (vkp, *instance);
+       const CustomInstance                    instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                             (instance.getDriver());
        TestLog&                                                log                             = context.getTestContext().getLog();
        VkPhysicalDeviceProperties              coreProperties;
        VkPhysicalDeviceProperties2             extProperties;
@@ -4023,10 +4022,9 @@ string toString (const VkFormatProperties2& value)
 
 tcu::TestStatus deviceFormatProperties2 (Context& context)
 {
-       const PlatformInterface&                vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice                  physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>                instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                             (vkp, *instance);
+       const CustomInstance                    instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                             (instance.getDriver());
        TestLog&                                                log                             = context.getTestContext().getLog();
 
        for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx)
@@ -4058,10 +4056,9 @@ tcu::TestStatus deviceFormatProperties2 (Context& context)
 
 tcu::TestStatus deviceQueueFamilyProperties2 (Context& context)
 {
-       const PlatformInterface&                vkp                                             = context.getPlatformInterface();
        const VkPhysicalDevice                  physicalDevice                  = context.getPhysicalDevice();
-       const Unique<VkInstance>                instance                                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                                             (vkp, *instance);
+       const CustomInstance                    instance                                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                                             (instance.getDriver());
        TestLog&                                                log                                             = context.getTestContext().getLog();
        deUint32                                                numCoreQueueFamilies    = ~0u;
        deUint32                                                numExtQueueFamilies             = ~0u;
@@ -4110,10 +4107,9 @@ tcu::TestStatus deviceQueueFamilyProperties2 (Context& context)
 
 tcu::TestStatus deviceMemoryProperties2 (Context& context)
 {
-       const PlatformInterface&                        vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice                          physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>                        instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                            vki                             (vkp, *instance);
+       const CustomInstance                            instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                           vki                             (instance.getDriver());
        TestLog&                                                        log                             = context.getTestContext().getLog();
        VkPhysicalDeviceMemoryProperties        coreProperties;
        VkPhysicalDeviceMemoryProperties2       extProperties;
@@ -4252,10 +4248,9 @@ tcu::TestStatus deviceFeaturesVulkan12 (Context& context)
                { 0, 0 }
        };
        TestLog&                                                                                        log                                                                             = context.getTestContext().getLog();
-       const PlatformInterface&                                                        vkp                                                                             = context.getPlatformInterface();
        const VkPhysicalDevice                                                          physicalDevice                                                  = context.getPhysicalDevice();
-       const Unique<VkInstance>                                                        instance                                                                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                                                            vki                                                                             (vkp, *instance);
+       const CustomInstance                                                            instance                                                                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                                                           vki                                                                             (instance.getDriver());
        const deUint32                                                                          vulkan11FeaturesBufferSize                              = sizeof(VkPhysicalDeviceVulkan11Features) + GUARD_SIZE;
        const deUint32                                                                          vulkan12FeaturesBufferSize                              = sizeof(VkPhysicalDeviceVulkan12Features) + GUARD_SIZE;
        VkPhysicalDeviceFeatures2                                                       extFeatures;
@@ -4417,10 +4412,9 @@ tcu::TestStatus devicePropertiesVulkan12 (Context& context)
                { 0, 0 }
        };
        TestLog&                                                                                log                                                                                     = context.getTestContext().getLog();
-       const PlatformInterface&                                                vkp                                                                                     = context.getPlatformInterface();
        const VkPhysicalDevice                                                  physicalDevice                                                          = context.getPhysicalDevice();
-       const Unique<VkInstance>                                                instance                                                                        (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                                                    vki                                                                                     (vkp, *instance);
+       const CustomInstance                                                    instance                                                                        (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                                                   vki                                                                                     (instance.getDriver());
        const deUint32                                                                  vulkan11PropertiesBufferSize                            = sizeof(VkPhysicalDeviceVulkan11Properties) + GUARD_SIZE;
        const deUint32                                                                  vulkan12PropertiesBufferSize                            = sizeof(VkPhysicalDeviceVulkan12Properties) + GUARD_SIZE;
        VkPhysicalDeviceProperties2                                             extProperties;
@@ -4480,10 +4474,9 @@ tcu::TestStatus devicePropertiesVulkan12 (Context& context)
 tcu::TestStatus deviceFeatureExtensionsConsistencyVulkan12(Context& context)
 {
        TestLog&                                                                                        log                                                                             = context.getTestContext().getLog();
-       const PlatformInterface&                                                        vkp                                                                             = context.getPlatformInterface();
        const VkPhysicalDevice                                                          physicalDevice                                                  = context.getPhysicalDevice();
-       const Unique<VkInstance>                                                        instance                                                                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                                                            vki                                                                             (vkp, *instance);
+       const CustomInstance                                                            instance                                                                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                                                           vki                                                                             (instance.getDriver());
 
        if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
                TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
@@ -4694,10 +4687,9 @@ tcu::TestStatus deviceFeatureExtensionsConsistencyVulkan12(Context& context)
 tcu::TestStatus devicePropertyExtensionsConsistencyVulkan12(Context& context)
 {
        TestLog&                                                                                log                                                                                     = context.getTestContext().getLog();
-       const PlatformInterface&                                                vkp                                                                                     = context.getPlatformInterface();
        const VkPhysicalDevice                                                  physicalDevice                                                          = context.getPhysicalDevice();
-       const Unique<VkInstance>                                                instance                                                                        (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                                                    vki                                                                                     (vkp, *instance);
+       const CustomInstance                                                    instance                                                                        (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                                                   vki                                                                                     (instance.getDriver());
 
        if (!context.contextSupports(vk::ApiVersion(1, 2, 0)))
                TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
@@ -4866,10 +4858,9 @@ tcu::TestStatus imageFormatProperties2 (Context& context, const VkFormat format,
 
        TestLog&                                                log                             = context.getTestContext().getLog();
 
-       const PlatformInterface&                vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice                  physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>                instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                             (vkp, *instance);
+       const CustomInstance                    instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                             (instance.getDriver());
 
        const VkImageCreateFlags                ycbcrFlags              = isYCbCrFormat(format) ? (VkImageCreateFlags)VK_IMAGE_CREATE_DISJOINT_BIT_KHR : (VkImageCreateFlags)0u;
        const VkImageUsageFlags                 allUsageFlags   = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
@@ -4940,10 +4931,9 @@ tcu::TestStatus sparseImageFormatProperties2 (Context& context, const VkFormat f
 {
        TestLog&                                                log                             = context.getTestContext().getLog();
 
-       const PlatformInterface&                vkp                             = context.getPlatformInterface();
        const VkPhysicalDevice                  physicalDevice  = context.getPhysicalDevice();
-       const Unique<VkInstance>                instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                             (vkp, *instance);
+       const CustomInstance                    instance                (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                             (instance.getDriver());
 
        const VkImageUsageFlags                 allUsageFlags   = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
                                                                                                        | VK_IMAGE_USAGE_TRANSFER_DST_BIT
index 0b2d661..a4cbb16 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "vktApiObjectManagementTests.hpp"
 #include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkRef.hpp"
@@ -234,6 +235,7 @@ struct Environment
 {
        const PlatformInterface&                vkp;
        deUint32                                                apiVersion;
+       const InstanceInterface&                instanceInterface;
        VkInstance                                              instance;
        const DeviceInterface&                  vkd;
        VkDevice                                                device;
@@ -241,10 +243,12 @@ struct Environment
        const BinaryCollection&                 programBinaries;
        const VkAllocationCallbacks*    allocationCallbacks;
        deUint32                                                maxResourceConsumers;           // Maximum number of objects using same Object::Resources concurrently
+       const tcu::CommandLine&                 commandLine;
 
        Environment (Context& context, deUint32 maxResourceConsumers_)
                : vkp                                   (context.getPlatformInterface())
                , apiVersion                    (context.getUsedApiVersion())
+               , instanceInterface             (context.getInstanceInterface())
                , instance                              (context.getInstance())
                , vkd                                   (context.getDeviceInterface())
                , device                                (context.getDevice())
@@ -252,20 +256,24 @@ struct Environment
                , programBinaries               (context.getBinaryCollection())
                , allocationCallbacks   (DE_NULL)
                , maxResourceConsumers  (maxResourceConsumers_)
+               , commandLine                   (context.getTestContext().getCommandLine())
        {
        }
 
        Environment (const PlatformInterface&           vkp_,
                                 deUint32                                               apiVersion_,
+                                const InstanceInterface&               instanceInterface_,
                                 VkInstance                                             instance_,
                                 const DeviceInterface&                 vkd_,
                                 VkDevice                                               device_,
                                 deUint32                                               queueFamilyIndex_,
                                 const BinaryCollection&                programBinaries_,
                                 const VkAllocationCallbacks*   allocationCallbacks_,
-                                deUint32                                               maxResourceConsumers_)
+                                deUint32                                               maxResourceConsumers_,
+                                const tcu::CommandLine&                commandLine_)
                : vkp                                   (vkp_)
                , apiVersion                    (apiVersion_)
+               , instanceInterface             (instanceInterface_)
                , instance                              (instance_)
                , vkd                                   (vkd_)
                , device                                (device_)
@@ -273,6 +281,7 @@ struct Environment
                , programBinaries               (programBinaries_)
                , allocationCallbacks   (allocationCallbacks_)
                , maxResourceConsumers  (maxResourceConsumers_)
+               , commandLine                   (commandLine_)
        {
        }
 };
@@ -350,13 +359,15 @@ size_t computeSystemMemoryUsage (Context& context, const typename Object::Parame
        AllocationCallbackRecorder                      allocRecorder           (getSystemAllocator());
        const Environment                                       env                                     (context.getPlatformInterface(),
                                                                                                                         context.getUsedApiVersion(),
+                                                                                                                        context.getInstanceInterface(),
                                                                                                                         context.getInstance(),
                                                                                                                         context.getDeviceInterface(),
                                                                                                                         context.getDevice(),
                                                                                                                         context.getUniversalQueueFamilyIndex(),
                                                                                                                         context.getBinaryCollection(),
                                                                                                                         allocRecorder.getCallbacks(),
-                                                                                                                        1u);
+                                                                                                                        1u,
+                                                                                                                        context.getTestContext().getCommandLine());
        const typename Object::Resources        res                                     (env, params);
        const size_t                                            resourceMemoryUsage     = getCurrentSystemMemoryUsage(allocRecorder);
 
@@ -577,6 +588,7 @@ struct Device
                                &queuePriority,                                         // pQueuePriorities
                        }
                };
+
                const VkDeviceCreateInfo                deviceInfo      =
                {
                        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -591,7 +603,7 @@ struct Device
                        DE_NULL,                                                                // pEnabledFeatures
                };
 
-               return createDevice(env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
+               return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
        }
 };
 
@@ -704,7 +716,7 @@ struct DeviceGroup
                        DE_NULL,                                                                                        // pEnabledFeatures
                };
 
-               return createDevice(env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
+               return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
        }
 };
 
@@ -2441,7 +2453,7 @@ struct EnvClone
                : deviceRes     (parent, deviceParams)
                , device        (Device::create(parent, deviceRes, deviceParams))
                , vkd           (parent.vkp, parent.instance, *device)
-               , env           (parent.vkp, parent.apiVersion, parent.instance, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers)
+               , env           (parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.commandLine)
        {
        }
 };
@@ -2493,13 +2505,15 @@ tcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Objec
        // Root environment still uses default instance and device, created without callbacks
        const Environment                                       rootEnv                 (context.getPlatformInterface(),
                                                                                                                 context.getUsedApiVersion(),
+                                                                                                                context.getInstanceInterface(),
                                                                                                                 context.getInstance(),
                                                                                                                 context.getDeviceInterface(),
                                                                                                                 context.getDevice(),
                                                                                                                 context.getUniversalQueueFamilyIndex(),
                                                                                                                 context.getBinaryCollection(),
                                                                                                                 resCallbacks.getCallbacks(),
-                                                                                                                1u);
+                                                                                                                1u,
+                                                                                                                context.getTestContext().getCommandLine());
 
        {
                // Test env has instance & device created with callbacks
@@ -2510,13 +2524,15 @@ tcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Objec
                AllocationCallbackRecorder                      objCallbacks(getSystemAllocator(), 128);
                const Environment                                       objEnv          (resEnv.env.vkp,
                                                                                                                 resEnv.env.apiVersion,
+                                                                                                                resEnv.env.instanceInterface,
                                                                                                                 resEnv.env.instance,
                                                                                                                 resEnv.env.vkd,
                                                                                                                 resEnv.env.device,
                                                                                                                 resEnv.env.queueFamilyIndex,
                                                                                                                 resEnv.env.programBinaries,
                                                                                                                 objCallbacks.getCallbacks(),
-                                                                                                                resEnv.env.maxResourceConsumers);
+                                                                                                                resEnv.env.maxResourceConsumers,
+                                                                                                                resEnv.env.commandLine);
 
                {
                        Unique<typename Object::Type>   obj     (Object::create(objEnv, res, params));
@@ -2547,13 +2563,15 @@ tcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parame
        AllocationCallbackRecorder                      resCallbacks            (getSystemAllocator(), 128);
        const Environment                                       rootEnv                         (context.getPlatformInterface(),
                                                                                                                         context.getUsedApiVersion(),
+                                                                                                                        context.getInstanceInterface(),
                                                                                                                         context.getInstance(),
                                                                                                                         context.getDeviceInterface(),
                                                                                                                         context.getDevice(),
                                                                                                                         context.getUniversalQueueFamilyIndex(),
                                                                                                                         context.getBinaryCollection(),
                                                                                                                         resCallbacks.getCallbacks(),
-                                                                                                                        1u);
+                                                                                                                        1u,
+                                                                                                                        context.getTestContext().getCommandLine());
        deUint32                                                        numPassingAllocs        = 0;
        const deUint32                                          cmdLineIterCount        = (deUint32)context.getTestContext().getCommandLine().getTestIterationCount();
        const deUint32                                          maxTries                        = cmdLineIterCount != 0 ? cmdLineIterCount : getOomIterLimit<Object>();
@@ -2571,13 +2589,15 @@ tcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parame
                        AllocationCallbackRecorder                      recorder        (objAllocator.getCallbacks(), 128);
                        const Environment                                       objEnv          (resEnv.env.vkp,
                                                                                                                         resEnv.env.apiVersion,
+                                                                                                                        resEnv.env.instanceInterface,
                                                                                                                         resEnv.env.instance,
                                                                                                                         resEnv.env.vkd,
                                                                                                                         resEnv.env.device,
                                                                                                                         resEnv.env.queueFamilyIndex,
                                                                                                                         resEnv.env.programBinaries,
                                                                                                                         recorder.getCallbacks(),
-                                                                                                                        resEnv.env.maxResourceConsumers);
+                                                                                                                        resEnv.env.maxResourceConsumers,
+                                                                                                                        resEnv.env.commandLine);
                        bool                                                            createOk        = false;
 
                        context.getTestContext().getLog()
@@ -2660,13 +2680,15 @@ tcu::TestStatus allocCallbackFailMultipleObjectsTest (Context& context, typename
                        AllocationCallbackRecorder                      recorder        (objAllocator.getCallbacks(), 128);
                        const Environment                                       objEnv          (context.getPlatformInterface(),
                                                                                                                         context.getUsedApiVersion(),
+                                                                                                                        context.getInstanceInterface(),
                                                                                                                         context.getInstance(),
                                                                                                                         context.getDeviceInterface(),
                                                                                                                         context.getDevice(),
                                                                                                                         context.getUniversalQueueFamilyIndex(),
                                                                                                                         context.getBinaryCollection(),
                                                                                                                         recorder.getCallbacks(),
-                                                                                                                        numObjects);
+                                                                                                                        numObjects,
+                                                                                                                        context.getTestContext().getCommandLine());
 
                        context.getTestContext().getLog()
                                << TestLog::Message
index 80a863e..938382d 100644 (file)
@@ -31,6 +31,7 @@
 #include "tcuTestLog.hpp"
 #include "tcuFunctionLibrary.hpp"
 #include "tcuPlatform.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "vkApiVersion.hpp"
 #include "vkDefs.hpp"
@@ -38,6 +39,7 @@
 
 #include "vktApiVersionCheck.hpp"
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDeviceUtil.hpp"
 #include "vkQueryUtil.hpp"
@@ -105,6 +107,14 @@ private:
 class APIEntryPointsTestInstance : public TestInstance
 {
 public:
+       struct APIContext
+       {
+               VkInstance                              instance;
+               VkDevice                                device;
+               GetInstanceProcAddrFunc getInstanceProcAddr;
+               GetDeviceProcAddrFunc   getDeviceProcAddr;
+       };
+
                                                                APIEntryPointsTestInstance      (Context&                               ctx)
                                                                        : TestInstance  (ctx)
        {
@@ -122,10 +132,11 @@ public:
 
                // Tests with default instance and device without extensions
                {
-                       instance                        = createDefaultInstance(m_context.getPlatformInterface(), m_context.getUsedApiVersion());
-                       device                          = createTestDevice(m_context.getPlatformInterface(), m_context.getInstanceInterface(), m_context.getPhysicalDevice());
-                       getInstanceProcAddr     = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
-                       getDeviceProcAddr       = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(*instance, "vkGetDeviceProcAddr"));
+                       CustomInstance                  instance                        = createCustomInstanceFromContext(m_context, DE_NULL, false);
+                       Move<VkDevice>                  device                          = createTestDevice(m_context, instance, vector<string>(), false);
+                       GetInstanceProcAddrFunc getInstanceProcAddr     = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
+                       GetDeviceProcAddrFunc   getDeviceProcAddr       = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
+                       APIContext                              ctx                                     = { instance, *device, getInstanceProcAddr, getDeviceProcAddr };
 
                        // Check entry points of core functions
                        {
@@ -140,11 +151,11 @@ public:
                                }
 
                                log << tcu::TestLog::Message << "Regular check - tries to get core functions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
-                               const char* const                               regularResult           = regularCheck(log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
+                               const char* const                               regularResult           = regularCheck(ctx, log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
                                log << tcu::TestLog::Message << regularResult << tcu::TestLog::EndMessage;
 
                                log << tcu::TestLog::Message << "Cross check - tries to get core functions from improper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
-                               const char* const                               mixupResult                     = mixupAddressProcCheck(log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
+                               const char* const                               mixupResult                     = mixupAddressProcCheck(ctx, log, failsQuantity, lastGoodVersion->second) ? "Passed" : "Failed";
                                log << tcu::TestLog::Message << mixupResult << tcu::TestLog::EndMessage;
                        }
 
@@ -163,7 +174,7 @@ public:
                                extFunctions.push_back(FunctionInfo("vkGetImageMemoryRequirements2KHR", FUNCTIONORIGIN_DEVICE));
 
                                log << tcu::TestLog::Message << "Disabled extensions check - tries to get functions of disabled extensions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
-                               const char * const                              result                          = specialCasesCheck(log, failsQuantity, extFunctions) ? "Passed" : "Failed";
+                               const char * const                              result                          = specialCasesCheck(ctx, log, failsQuantity, extFunctions) ? "Passed" : "Failed";
                                log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
                        }
 
@@ -179,17 +190,18 @@ public:
                                }
 
                                log << tcu::TestLog::Message << "Special check - tries to get some dummy functions from various vkGet*ProcAddr." << tcu::TestLog::EndMessage;
-                               const char * const                              result                          = specialCasesCheck(log, failsQuantity, dummyFunctions) ? "Passed" : "Failed";
+                               const char * const                              result                          = specialCasesCheck(ctx, log, failsQuantity, dummyFunctions) ? "Passed" : "Failed";
                                log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
                        }
                }
 
                // Tests with instance and device with extensions
                {
-                       instance                        = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), getSupportedInstanceExtensions(apiVersion));
-                       device                          = createTestDevice(m_context.getPlatformInterface(), m_context.getInstanceInterface(), m_context.getPhysicalDevice(), getSupportedDeviceExtensions(apiVersion));
-                       getInstanceProcAddr     = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
-                       getDeviceProcAddr       = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(*instance, "vkGetDeviceProcAddr"));
+                       CustomInstance                  instance                        = createCustomInstanceWithExtensions(m_context, getSupportedInstanceExtensions(apiVersion), DE_NULL, false);
+                       Move<VkDevice>                  device                          = createTestDevice(m_context, instance, getSupportedDeviceExtensions(apiVersion), false);
+                       GetInstanceProcAddrFunc getInstanceProcAddr     = reinterpret_cast<GetInstanceProcAddrFunc>(funcLibrary.getFunction("vkGetInstanceProcAddr"));
+                       GetDeviceProcAddrFunc   getDeviceProcAddr       = reinterpret_cast<GetDeviceProcAddrFunc>(getInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
+                       APIContext                              ctx                                     = { instance, *device, getInstanceProcAddr, getDeviceProcAddr };
 
                        // Check function entry points of enabled extensions
                        {
@@ -220,7 +232,7 @@ public:
                                }
 
                                log << tcu::TestLog::Message << "Enabled extensions check - tries to get functions of supported extensions from proper vkGet*ProcAddr." << tcu::TestLog::EndMessage;
-                               const char * const              result = regularCheck(log, failsQuantity, extFunctions) ? "Passed" : "Failed";
+                               const char * const              result = regularCheck(ctx, log, failsQuantity, extFunctions) ? "Passed" : "Failed";
                                log << tcu::TestLog::Message << result << tcu::TestLog::EndMessage;
                        }
                }
@@ -233,11 +245,6 @@ public:
 
 private:
 
-       GetDeviceProcAddrFunc   getDeviceProcAddr;
-       GetInstanceProcAddrFunc getInstanceProcAddr;
-       Move<VkInstance>                instance;
-       Move<VkDevice>                  device;
-
        deUint32 findQueueFamilyIndex(const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
        {
                deUint32                                                                numQueues = 0;
@@ -305,8 +312,12 @@ private:
                return filterMultiAuthorExtensions(supportedExtensions);
        }
 
-       Move<VkDevice> createTestDevice (const PlatformInterface& vkp, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, vector<string> extensions = vector<string>())
+       Move<VkDevice> createTestDevice (const Context& context, VkInstance instance, vector<string> extensions = vector<string>(), bool allowLayers = true)
        {
+               auto&                                           cmdLine                 = context.getTestContext().getCommandLine();
+               const PlatformInterface&        vkp                             = context.getPlatformInterface();
+               const InstanceInterface&        vki                             = context.getInstanceInterface();
+               VkPhysicalDevice                        physicalDevice  = chooseDevice(context.getInstanceInterface(), instance, cmdLine);
                vector<const char*>                     extensionPtrs;
                const float                                     queuePriority   = 1.0f;
                const deUint32                          queueIndex              = findQueueFamilyIndex(vki, physicalDevice, VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
@@ -322,7 +333,8 @@ private:
                        1u,
                        &queuePriority
                };
-               VkDeviceCreateInfo                      deviceInfo              = {
+
+               const VkDeviceCreateInfo        deviceInfo              = {
                        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
                        DE_NULL,
                        static_cast<VkDeviceCreateFlags>(0u),
@@ -335,7 +347,8 @@ private:
                        DE_NULL,
                };
 
-               return vk::createDevice(vkp, *instance, vki, physicalDevice, &deviceInfo);
+               const bool                                      validationEnabled = (cmdLine.isValidationEnabled() && allowLayers);
+               return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceInfo);
        }
 
        void reportFail (tcu::TestLog& log, const char* const functionName, const char* const firstParamName, const char* const secondParamName, deBool shouldBeNonNull, deUint32& failsQuantity)
@@ -347,21 +360,21 @@ private:
                ++failsQuantity;
        }
 
-       void checkPlatformFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+       void checkPlatformFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
        {
-               if ((getInstanceProcAddr(DE_NULL, name) == DE_NULL) == shouldBeNonNull)
+               if ((ctx.getInstanceProcAddr(DE_NULL, name) == DE_NULL) == shouldBeNonNull)
                        reportFail(log, "vkGetInstanceProcAddr", "DE_NULL", name, shouldBeNonNull, failsQuantity);
        }
 
-       void checkInstanceFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+       void checkInstanceFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
        {
-               if ((getInstanceProcAddr(*instance, name) == DE_NULL) == shouldBeNonNull)
+               if ((ctx.getInstanceProcAddr(ctx.instance, name) == DE_NULL) == shouldBeNonNull)
                        reportFail(log, "vkGetInstanceProcAddr", "instance", name, shouldBeNonNull, failsQuantity);
        }
 
-       void checkDeviceFunction (tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
+       void checkDeviceFunction (const APIContext& ctx, tcu::TestLog& log, const char* const name, deBool shouldBeNonNull, deUint32& failsQuantity)
        {
-               if ((getDeviceProcAddr(*device, name) == DE_NULL) == shouldBeNonNull)
+               if ((ctx.getDeviceProcAddr(ctx.device, name) == DE_NULL) == shouldBeNonNull)
                        reportFail(log, "vkGetDeviceProcAddr", "device", name, shouldBeNonNull, failsQuantity);
        }
 
@@ -379,7 +392,7 @@ private:
                return de::contains(supportedDeviceExtensions.begin(), supportedDeviceExtensions.end(), extName);
        }
 
-       deBool mixupAddressProcCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+       deBool mixupAddressProcCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
        {
                const deUint32 startingQuantity = failsQuantity;
                for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
@@ -391,32 +404,32 @@ private:
                        const deUint32 functionType = testsArr[ndx].second;
                        if (functionType == FUNCTIONORIGIN_INSTANCE)
                        {
-                               checkPlatformFunction(log, functionName, DE_FALSE, failsQuantity);
-                               checkDeviceFunction(log, functionName, DE_FALSE, failsQuantity);
+                               checkPlatformFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
+                               checkDeviceFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
                        }
                        else if (functionType == FUNCTIONORIGIN_DEVICE)
-                               checkPlatformFunction(log, functionName, DE_FALSE, failsQuantity);
+                               checkPlatformFunction(ctx, log, functionName, DE_FALSE, failsQuantity);
                }
                return startingQuantity == failsQuantity;
        }
 
-       deBool specialCasesCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+       deBool specialCasesCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
        {
                const deUint32 startingQuantity = failsQuantity;
                for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
                {
                        const deUint32 functionType = testsArr[ndx].second;
                        if (functionType == FUNCTIONORIGIN_PLATFORM)
-                               checkPlatformFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+                               checkPlatformFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
                        else if (functionType == FUNCTIONORIGIN_INSTANCE)
-                               checkInstanceFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+                               checkInstanceFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
                        else if (functionType == FUNCTIONORIGIN_DEVICE)
-                               checkDeviceFunction(log, testsArr[ndx].first, DE_FALSE, failsQuantity);
+                               checkDeviceFunction(ctx, log, testsArr[ndx].first, DE_FALSE, failsQuantity);
                }
                return startingQuantity == failsQuantity;
        }
 
-       deBool regularCheck (tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
+       deBool regularCheck (const APIContext& ctx, tcu::TestLog& log, deUint32& failsQuantity, const vector<pair<const char*, FunctionOrigin> >& testsArr)
        {
                const deUint32 startingQuantity = failsQuantity;
                for (deUint32 ndx = 0u; ndx < testsArr.size(); ++ndx)
@@ -426,11 +439,11 @@ private:
 
                        const deUint32 functionType     = testsArr[ndx].second;
                        if (functionType == FUNCTIONORIGIN_PLATFORM)
-                               checkPlatformFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+                               checkPlatformFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
                        else if (functionType == FUNCTIONORIGIN_INSTANCE)
-                               checkInstanceFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+                               checkInstanceFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
                        else if (functionType == FUNCTIONORIGIN_DEVICE)
-                               checkDeviceFunction(log, testsArr[ndx].first, DE_TRUE, failsQuantity);
+                               checkDeviceFunction(ctx, log, testsArr[ndx].first, DE_TRUE, failsQuantity);
                }
                return startingQuantity == failsQuantity;
        }
index dbcb8fd..c3e4048 100644 (file)
@@ -26,6 +26,7 @@
 #include "vktTestCase.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktComputeTestsUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkRef.hpp"
@@ -2335,7 +2336,7 @@ public:
 
        void                                                    createDeviceGroup       (void);
        const vk::DeviceInterface&              getDeviceInterface      (void)                  { return *m_deviceDriver; }
-       vk::VkInstance                                  getInstance                     (void)                  { return *m_deviceGroupInstance; }
+       vk::VkInstance                                  getInstance                     (void)                  { return m_deviceGroupInstance; }
        vk::VkDevice                                    getDevice                       (void)                  { return *m_logicalDevice; }
        vk::VkPhysicalDevice                    getPhysicalDevice       (deUint32 i = 0){ return m_physicalDevices[i]; }
 
@@ -2344,7 +2345,7 @@ protected:
        deUint32                                                m_queueFamilyIndex;
 
 private:
-       vk::Move<vk::VkInstance>                        m_deviceGroupInstance;
+       CustomInstance                                          m_deviceGroupInstance;
        vk::Move<vk::VkDevice>                          m_logicalDevice;
        std::vector<vk::VkPhysicalDevice>       m_physicalDevices;
        de::MovePtr<vk::DeviceDriver>           m_deviceDriver;
@@ -2357,8 +2358,8 @@ void ComputeTestInstance::createDeviceGroup (void)
        const deUint32                                                                  physDeviceIdx                   = cmdLine.getVKDeviceId() - 1;
        const float                                                                             queuePriority                   = 1.0f;
        const std::vector<std::string>                                  requiredExtensions              (1, "VK_KHR_device_group_creation");
-       m_deviceGroupInstance                                                                                                   = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
-       std::vector<VkPhysicalDeviceGroupProperties>    devGroupProperties              = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+       m_deviceGroupInstance                                                                                                   = createCustomInstanceWithExtensions(m_context, requiredExtensions);
+       std::vector<VkPhysicalDeviceGroupProperties>    devGroupProperties              = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
        m_numPhysDevices                                                                                                                = devGroupProperties[devGroupIdx].physicalDeviceCount;
        std::vector<const char*>                                                deviceExtensions;
 
@@ -2372,7 +2373,7 @@ void ComputeTestInstance::createDeviceGroup (void)
                devGroupProperties[devGroupIdx].physicalDeviceCount,                                                            //physicalDeviceCount
                devGroupProperties[devGroupIdx].physicalDevices                                                                         //physicalDevices
        };
-       InstanceDriver                                                                  instance                                (m_context.getPlatformInterface(), m_deviceGroupInstance.get());
+       const InstanceDriver&                                                   instance                                (m_deviceGroupInstance.getDriver());
        const VkPhysicalDeviceFeatures                                  deviceFeatures                  = getPhysicalDeviceFeatures(instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
        const std::vector<VkQueueFamilyProperties>              queueProps                              = getPhysicalDeviceQueueFamilyProperties(instance, devGroupProperties[devGroupIdx].physicalDevices[physDeviceIdx]);
 
@@ -2409,8 +2410,9 @@ void ComputeTestInstance::createDeviceGroup (void)
                (deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0]),    // const char* const*                           ppEnabledExtensionNames;
                &deviceFeatures,                                                                                                // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
-       m_logicalDevice         = createDevice(m_context.getPlatformInterface(), m_deviceGroupInstance.get(), instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
-       m_deviceDriver          = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_deviceGroupInstance.get(), *m_logicalDevice));
+
+       m_logicalDevice         = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_deviceGroupInstance, instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
+       m_deviceDriver          = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_deviceGroupInstance, *m_logicalDevice));
 }
 
 class DispatchBaseTest : public vkt::TestCase
@@ -3096,7 +3098,7 @@ tcu::TestStatus ConcurrentComputeInstance::iterate (void)
        deviceInfo.queueCreateInfoCount         = (queues[0].queueFamilyIndex == queues[1].queueFamilyIndex) ? 1 : 2;
        deviceInfo.pQueueCreateInfos            = queueInfos;
 
-       logicalDevice = vk::createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
+       logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
 
        for (deUint32 queueReqNdx = 0; queueReqNdx < 2; ++queueReqNdx)
        {
index 9bdcfa0..9f25b8d 100644 (file)
@@ -23,6 +23,7 @@
 *//*--------------------------------------------------------------------*/
 
 #include "vktDeviceGroupTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkDeviceUtil.hpp"
@@ -151,7 +152,6 @@ public:
 private:
                        void                                            init                                            (void);
                        deUint32                                        getMemoryIndex                          (deUint32 memoryTypeBits, deUint32 memoryPropertyFlag);
-                       void                                            getDeviceLayers                         (vector<string>& enabledLayers);
                        bool                                            isPeerFetchAllowed                      (deUint32 memoryTypeIndex, deUint32 firstdeviceID, deUint32 seconddeviceID);
                        void                                            SubmitBufferAndWaitForIdle      (const DeviceDriver& vk, VkCommandBuffer cmdBuf, deUint32 deviceMask);
        virtual tcu::TestStatus                         iterate                                         (void);
@@ -209,17 +209,6 @@ bool DeviceGroupTestInstance::isPeerFetchAllowed (deUint32 memoryTypeIndex, deUi
        return (peerMemFeatures1 & VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT) && (peerMemFeatures2 & VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT);
 }
 
-void DeviceGroupTestInstance::getDeviceLayers (vector<string>& enabledLayers)
-{
-       const tcu::CommandLine& cmdLine = m_context.getTestContext().getCommandLine();
-       if (cmdLine.isValidationEnabled())
-       {
-               enabledLayers = vkt::getValidationLayers(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
-               if (enabledLayers.empty())
-                       TCU_THROW(NotSupportedError, "No device validation layers found");
-       }
-}
-
 void DeviceGroupTestInstance::init (void)
 {
        if (!isInstanceExtensionSupported(m_context.getUsedApiVersion(), m_context.getInstanceExtensions(), "VK_KHR_device_group_creation"))
@@ -303,12 +292,6 @@ void DeviceGroupTestInstance::init (void)
                for (size_t ndx = 0; ndx < deviceExtensions.size(); ++ndx)
                        extensionPtrs[ndx] = deviceExtensions[ndx].c_str();
 
-               // Get Layers
-               getDeviceLayers(enabledLayers);
-               layerPtrs.resize(enabledLayers.size());
-               for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
-                       layerPtrs[ndx] = enabledLayers[ndx].c_str();
-
                const VkDeviceCreateInfo        deviceCreateInfo =
                {
                        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                   //sType;
@@ -316,13 +299,13 @@ void DeviceGroupTestInstance::init (void)
                        (VkDeviceCreateFlags)0u,                                                                //flags
                        1,                                                                                                              //queueRecordCount;
                        &deviceQueueCreateInfo,                                                                 //pRequestedQueues;
-                       (deUint32)layerPtrs.size(),                                                             //layerCount;
-                       (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]),                  //ppEnabledLayerNames;
+                       0u,                                                                                                             //layerCount;
+                       DE_NULL,                                                                                                //ppEnabledLayerNames;
                        (deUint32)extensionPtrs.size(),                                                 //extensionCount;
                        (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]),  //ppEnabledExtensionNames;
                        &enabledDeviceFeatures,                                                                 //pEnabledFeatures;
                };
-               m_deviceGroup = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instanceInterface, physicalDevice, &deviceCreateInfo);
+               m_deviceGroup = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instanceInterface, physicalDevice, &deviceCreateInfo);
        }
 
        deviceDriver = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(m_context.getPlatformInterface(), m_context.getInstance(), *m_deviceGroup));
index 70bff7e..2aa5f13 100644 (file)
@@ -25,6 +25,7 @@
 #include "vktImageLoadStoreUtil.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktImageTexture.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkBuilderUtil.hpp"
 #include "vkQueryUtil.hpp"
@@ -44,6 +45,7 @@
 #include "tcuTestLog.hpp"
 #include "tcuTextureUtil.hpp"
 #include "tcuPlatform.hpp"
+#include "tcuCommandLine.hpp"
 
 #include <string>
 #include <vector>
@@ -1794,11 +1796,10 @@ void checkAllSupported(const Extensions& supportedExtensions, const vector<strin
        }
 }
 
-Move<VkInstance> createInstanceWithWsi(const PlatformInterface&                vkp,
-                                                                          deUint32                                             version,
-                                                                          const Extensions&                    supportedExtensions,
-                                                                          Type                                                 wsiType,
-                                                                          const VkAllocationCallbacks* pAllocator = DE_NULL)
+CustomInstance createInstanceWithWsi(Context&                                          context,
+                                                                        const Extensions&                              supportedExtensions,
+                                                                        Type                                                   wsiType,
+                                                                        const VkAllocationCallbacks*   pAllocator = DE_NULL)
 {
        vector<string>  extensions;
 
@@ -1820,7 +1821,7 @@ Move<VkInstance> createInstanceWithWsi(const PlatformInterface&           vkp,
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+       return createCustomInstanceWithExtensions(context, extensions, pAllocator);
 }
 
 
@@ -1830,7 +1831,8 @@ Move<VkDevice> createDeviceWithWsi(const PlatformInterface&               vkp,
                                                                   VkPhysicalDevice                             physicalDevice,
                                                                   const Extensions&                    supportedExtensions,
                                                                   const deUint32                               queueFamilyIndex,
-                                                                  const VkAllocationCallbacks* pAllocator = DE_NULL)
+                                                                  const VkAllocationCallbacks* pAllocator,
+                                                                  bool                                                 enableValidation)
 {
        const float                                             queuePriorities[] = { 1.0f };
        const VkDeviceQueueCreateInfo   queueInfos[] =
@@ -1848,6 +1850,7 @@ Move<VkDevice> createDeviceWithWsi(const PlatformInterface&               vkp,
        deMemset(&features, 0x0, sizeof(features));
 
        const char* const                               extensions[] = { "VK_KHR_swapchain", "VK_KHR_swapchain_mutable_format" };
+
        const VkDeviceCreateInfo                deviceParams =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -1868,7 +1871,7 @@ Move<VkDevice> createDeviceWithWsi(const PlatformInterface&               vkp,
                        TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
        }
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(enableValidation, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 deUint32 getNumQueueFamilyIndices(const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
@@ -1907,18 +1910,17 @@ deUint32 chooseQueueFamilyIndex(const InstanceInterface& vki, VkPhysicalDevice p
 struct InstanceHelper
 {
        const vector<VkExtensionProperties>     supportedExtensions;
-       const Unique<VkInstance>                        instance;
-       const InstanceDriver                            vki;
+       const CustomInstance                            instance;
+       const InstanceDriver&                           vki;
 
        InstanceHelper(Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions(enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                        DE_NULL))
-               , instance(createInstanceWithWsi(context.getPlatformInterface(),
-                       context.getUsedApiVersion(),
+               , instance(createInstanceWithWsi(context,
                        supportedExtensions,
                        wsiType,
                        pAllocator))
-               , vki(context.getPlatformInterface(), *instance)
+               , vki(instance.getDriver())
        {}
 };
 
@@ -1944,7 +1946,8 @@ struct DeviceHelper
                        physicalDevice,
                        enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
                        queueFamilyIndex,
-                       pAllocator))
+                       pAllocator,
+                       context.getTestContext().getCommandLine().isValidationEnabled()))
                , vkd(context.getPlatformInterface(), context.getInstance(), *device)
                , queue(getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
        {
@@ -2063,8 +2066,8 @@ tcu::TestStatus testSwapchainMutable(Context& context, CaseDef caseDef)
        const tcu::UVec2                                desiredSize(256, 256);
        const InstanceHelper                    instHelper(context, wsiType);
        const NativeObjects                             native(context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper(context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface(createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper(context, instHelper.vki, instHelper.instance, *surface);
        const DeviceInterface&                  vk = devHelper.vkd;
        const InstanceDriver&                   vki = instHelper.vki;
        const VkDevice                                  device = *devHelper.device;
index 5d6bc77..625073d 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktMemoryAllocationTests.hpp"
 
 #include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "tcuMaybe.hpp"
 #include "tcuResultCollector.hpp"
@@ -146,7 +147,7 @@ protected:
        VkPhysicalDeviceMemoryProperties                m_memoryProperties;
 
 private:
-       vk::Move<vk::VkInstance>                m_deviceGroupInstance;
+       CustomInstance                                  m_deviceGroupInstance;
        vk::Move<vk::VkDevice>                  m_logicalDevice;
        de::MovePtr<vk::DeviceDriver>   m_deviceDriver;
 };
@@ -159,8 +160,8 @@ void BaseAllocateTestInstance::createDeviceGroup (void)
        const float                                                                             queuePriority                   = 1.0f;
        deUint32                                                                                queueFamilyIndex                = 0;
        const std::vector<std::string>                                  requiredExtensions              (1, "VK_KHR_device_group_creation");
-       m_deviceGroupInstance                                                                                                   = createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
-       std::vector<VkPhysicalDeviceGroupProperties>    devGroupProperties              = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+       m_deviceGroupInstance                                                                                                   = createCustomInstanceWithExtensions(m_context, requiredExtensions);
+       std::vector<VkPhysicalDeviceGroupProperties>    devGroupProperties              = enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
        m_numPhysDevices                                                                                                                = devGroupProperties[devGroupIdx].physicalDeviceCount;
        m_subsetAllocationAllowed                                                                                               = devGroupProperties[devGroupIdx].subsetAllocation;
        if (m_numPhysDevices < 2)
@@ -177,7 +178,7 @@ void BaseAllocateTestInstance::createDeviceGroup (void)
                devGroupProperties[devGroupIdx].physicalDeviceCount,                                                            //physicalDeviceCount
                devGroupProperties[devGroupIdx].physicalDevices                                                                         //physicalDevices
        };
-       VkInstance                                                                              instance                                (m_useDeviceGroups ? m_deviceGroupInstance.get() : m_context.getInstance());
+       VkInstance                                                                              instance                                (m_useDeviceGroups ? m_deviceGroupInstance : m_context.getInstance());
        InstanceDriver                                                                  instanceDriver                  (m_context.getPlatformInterface(), instance);
        const VkPhysicalDeviceFeatures                                  deviceFeatures  =               getPhysicalDeviceFeatures(instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
 
@@ -211,7 +212,8 @@ void BaseAllocateTestInstance::createDeviceGroup (void)
                deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0],      // const char* const*   ppEnabledExtensionNames;
                &deviceFeatures,                                                                                        // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
-       m_logicalDevice         = createDevice(m_context.getPlatformInterface(), instance, instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
+
+       m_logicalDevice         = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
        m_deviceDriver          = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), instance, *m_logicalDevice));
        m_memoryProperties      = getPhysicalDeviceMemoryProperties(instanceDriver, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
 }
index ea40112..6611e5a 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktMultiViewRenderTests.hpp"
 #include "vktMultiViewRenderUtil.hpp"
 #include "vktMultiViewRenderPassUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vktTestCase.hpp"
 #include "vkBuilderUtil.hpp"
@@ -695,7 +696,7 @@ void MultiViewRenderTestInstance::createMultiViewDevices (void)
        m_hasMultiDrawIndirect = enabledFeatures.features.multiDrawIndirect;
 
        {
-               vector<const char*>                                                     deviceExtensions;
+               vector<const char*>                             deviceExtensions;
 
                if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_multiview"))
                        deviceExtensions.push_back("VK_KHR_multiview");
@@ -718,7 +719,7 @@ void MultiViewRenderTestInstance::createMultiViewDevices (void)
                        DE_NULL                                                                                                                 //const VkPhysicalDeviceFeatures*       pEnabledFeatures;
                };
 
-               m_logicalDevice                                 = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
+               m_logicalDevice                                 = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
                m_device                                                = MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_context.getInstance(), *m_logicalDevice));
                m_allocator                                             = MovePtr<Allocator>(new SimpleAllocator(*m_device, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instance, physicalDevice)));
                m_device->getDeviceQueue                (*m_logicalDevice, m_queueFamilyIndex, 0u, &m_queue);
index bba7a52..d407d96 100644 (file)
@@ -29,6 +29,7 @@
 #include "vktPipelineVertexUtil.hpp"
 #include "vktPipelineReferenceRenderer.hpp"
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkImageUtil.hpp"
 #include "vkMemUtil.hpp"
 #include "vkPrograms.hpp"
@@ -82,20 +83,13 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-Move<VkInstance> createInstanceWithGetPhysicalDeviceProperties2 (const Context&                                context,
-                                                                                                                                const PlatformInterface&       vkp,
-                                                                                                                                const Extensions&                      supportedExtensions)
+CustomInstance createInstanceWithGetPhysicalDeviceProperties2 (Context&                                context,
+                                                                                                                          const Extensions&    supportedExtensions)
 {
        vector<string> requiredExtensions = { "VK_KHR_get_physical_device_properties2" };
        checkAllSupported(supportedExtensions, requiredExtensions);
 
-       vector<string> enabledLayers;
-       if (context.getTestContext().getCommandLine().isValidationEnabled())
-       {
-               enabledLayers = vkt::getValidationLayers(vkp);
-       }
-
-       return createDefaultInstance(vkp, context.getUsedApiVersion(), enabledLayers, requiredExtensions);
+       return createCustomInstanceWithExtensions(context, requiredExtensions);
 }
 
 const char *innerCString(const string &str)
@@ -133,15 +127,6 @@ Move<VkDevice> createDeviceWithPushDescriptor (const Context&                              context,
        transform(begin(requiredExtensionsStr), end(requiredExtensionsStr), back_inserter(requiredExtensions), innerCString);
 
        // Enable validation layers on this device if validation has been requested from the command line.
-       vector<string>                                  enabledLayersStr;
-       vector<const char*>                             enabledLayers;
-       if (context.getTestContext().getCommandLine().isValidationEnabled())
-       {
-               // We need the contents of enabledLayersStr as a vector<const char*> in VkDeviceCreateInfo.
-               enabledLayersStr = vkt::getValidationLayers(vki, physicalDevice);
-               transform(begin(enabledLayersStr), end(enabledLayersStr), back_inserter(enabledLayers), innerCString);
-       }
-
        const VkDeviceCreateInfo                deviceParams    =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -149,14 +134,14 @@ Move<VkDevice> createDeviceWithPushDescriptor (const Context&                             context,
                (VkDeviceCreateFlags)0,
                1u,
                &queueInfo,
-               static_cast<deUint32>(enabledLayers.size()),
-               (enabledLayers.empty() ? DE_NULL : enabledLayers.data()),
+               0u,
+               DE_NULL,
                static_cast<deUint32>(requiredExtensions.size()),
                (requiredExtensions.empty() ? DE_NULL : requiredExtensions.data()),
                &features
        };
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, DE_NULL);
+       return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &deviceParams, DE_NULL);
 }
 
 deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
@@ -239,8 +224,8 @@ private:
        const TestParams                        m_params;
        const PlatformInterface&        m_vkp;
        const Extensions                        m_instanceExtensions;
-       const Unique<VkInstance>        m_instance;
-       const InstanceDriver            m_vki;
+       const CustomInstance            m_instance;
+       const InstanceDriver&           m_vki;
        const VkPhysicalDevice          m_physicalDevice;
        const deUint32                          m_queueFamilyIndex;
        const Extensions                        m_deviceExtensions;
@@ -274,13 +259,13 @@ PushDescriptorBufferGraphicsTestInstance::PushDescriptorBufferGraphicsTestInstan
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_renderSize                  (32, 32)
@@ -700,8 +685,8 @@ private:
        const TestParams                        m_params;
        const PlatformInterface&        m_vkp;
        const Extensions                        m_instanceExtensions;
-       const Unique<VkInstance>        m_instance;
-       const InstanceDriver            m_vki;
+       const CustomInstance            m_instance;
+       const InstanceDriver&           m_vki;
        const VkPhysicalDevice          m_physicalDevice;
        const deUint32                          m_queueFamilyIndex;
        const Extensions                        m_deviceExtensions;
@@ -727,13 +712,13 @@ PushDescriptorBufferComputeTestInstance::PushDescriptorBufferComputeTestInstance
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
 {
@@ -1039,8 +1024,8 @@ private:
        const TestParams                                m_params;
        const PlatformInterface&                m_vkp;
        const Extensions                                m_instanceExtensions;
-       const Unique<VkInstance>                m_instance;
-       const InstanceDriver                    m_vki;
+       const CustomInstance                    m_instance;
+       const InstanceDriver&                   m_vki;
        const VkPhysicalDevice                  m_physicalDevice;
        const deUint32                                  m_queueFamilyIndex;
        const Extensions                                m_deviceExtensions;
@@ -1078,13 +1063,13 @@ PushDescriptorImageGraphicsTestInstance::PushDescriptorImageGraphicsTestInstance
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_renderSize                  (32, 32)
@@ -1891,8 +1876,8 @@ private:
        const TestParams                        m_params;
        const PlatformInterface&        m_vkp;
        const Extensions                        m_instanceExtensions;
-       const Unique<VkInstance>        m_instance;
-       const InstanceDriver            m_vki;
+       const CustomInstance            m_instance;
+       const InstanceDriver&           m_vki;
        const VkPhysicalDevice          m_physicalDevice;
        const deUint32                          m_queueFamilyIndex;
        const Extensions                        m_deviceExtensions;
@@ -1923,13 +1908,13 @@ PushDescriptorImageComputeTestInstance::PushDescriptorImageComputeTestInstance (
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_textureSize                 (32, 32)
@@ -2652,8 +2637,8 @@ private:
        const TestParams                                m_params;
        const PlatformInterface&                m_vkp;
        const Extensions                                m_instanceExtensions;
-       const Unique<VkInstance>                m_instance;
-       const InstanceDriver                    m_vki;
+       const CustomInstance                    m_instance;
+       const InstanceDriver&                   m_vki;
        const VkPhysicalDevice                  m_physicalDevice;
        const deUint32                                  m_queueFamilyIndex;
        const Extensions                                m_deviceExtensions;
@@ -2689,13 +2674,13 @@ PushDescriptorTexelBufferGraphicsTestInstance::PushDescriptorTexelBufferGraphics
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_renderSize                  (32, 32)
@@ -3138,8 +3123,8 @@ private:
        const TestParams                        m_params;
        const PlatformInterface&        m_vkp;
        const Extensions                        m_instanceExtensions;
-       const Unique<VkInstance>        m_instance;
-       const InstanceDriver            m_vki;
+       const CustomInstance            m_instance;
+       const InstanceDriver&           m_vki;
        const VkPhysicalDevice          m_physicalDevice;
        const deUint32                          m_queueFamilyIndex;
        const Extensions                        m_deviceExtensions;
@@ -3166,13 +3151,13 @@ PushDescriptorTexelBufferComputeTestInstance::PushDescriptorTexelBufferComputeTe
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_COMPUTE_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_bufferFormat                (VK_FORMAT_R32G32B32A32_SFLOAT)
@@ -3502,8 +3487,8 @@ private:
        const TestParams                                m_params;
        const PlatformInterface&                m_vkp;
        const Extensions                                m_instanceExtensions;
-       const Unique<VkInstance>                m_instance;
-       const InstanceDriver                    m_vki;
+       const CustomInstance                    m_instance;
+       const InstanceDriver&                   m_vki;
        const VkPhysicalDevice                  m_physicalDevice;
        const deUint32                                  m_queueFamilyIndex;
        const Extensions                                m_deviceExtensions;
@@ -3539,13 +3524,13 @@ PushDescriptorInputAttachmentGraphicsTestInstance::PushDescriptorInputAttachment
        , m_params                              (params)
        , m_vkp                                 (context.getPlatformInterface())
        , m_instanceExtensions  (enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_vkp, m_instanceExtensions))
-       , m_vki                                 (m_vkp, *m_instance)
-       , m_physicalDevice              (chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                    (createInstanceWithGetPhysicalDeviceProperties2(context, m_instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_physicalDevice              (chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (findQueueFamilyIndexWithCaps(m_vki, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT))
        , m_deviceExtensions    (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
-       , m_vkd                                 (m_vkp, *m_instance, *m_device)
+       , m_device                              (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
+       , m_vkd                                 (m_vkp, m_instance, *m_device)
        , m_queue                               (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
        , m_allocator                   (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
        , m_renderSize                  (32, 32)
index 9ac2a58..e50e0a0 100644 (file)
@@ -33,13 +33,13 @@ ProtectedContext::ProtectedContext  (Context&                                               ctx,
                                                                         const std::vector<std::string> deviceExtensions)
        : m_context                             (ctx)
        , m_interface                   (m_context.getPlatformInterface())
-       , m_instance                    (makeProtectedMemInstance(m_interface, m_context, instanceExtensions))
-       , m_vki                                 (m_interface, *m_instance)
-       , m_phyDevice                   (vk::chooseDevice(m_vki, *m_instance, m_context.getTestContext().getCommandLine()))
+       , m_instance                    (makeProtectedMemInstance(m_context, instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_phyDevice                   (vk::chooseDevice(m_vki, m_instance, m_context.getTestContext().getCommandLine()))
        , m_queueFamilyIndex    (chooseProtectedMemQueueFamilyIndex(m_vki, m_phyDevice))
-       , m_device                              (makeProtectedMemDevice(m_interface, *m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions))
+       , m_device                              (makeProtectedMemDevice(m_interface, m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions, m_context.getTestContext().getCommandLine().isValidationEnabled()))
        , m_allocator                   (createAllocator())
-       , m_deviceDriver                (m_context.getPlatformInterface(), *m_instance, *m_device)
+       , m_deviceDriver                (m_context.getPlatformInterface(), m_instance, *m_device)
        , m_queue                               (getProtectedQueue(m_deviceDriver, *m_device, m_queueFamilyIndex, 0))
 {
 }
@@ -52,14 +52,14 @@ ProtectedContext::ProtectedContext  (Context&                                               ctx,
                                                                         const std::vector<std::string> deviceExtensions)
        : m_context                             (ctx)
        , m_interface                   (m_context.getPlatformInterface())
-       , m_instance                    (makeProtectedMemInstance(m_interface, m_context, instanceExtensions))
-       , m_vki                                 (m_interface, *m_instance)
-       , m_phyDevice                   (vk::chooseDevice(m_vki, *m_instance, m_context.getTestContext().getCommandLine()))
-       , m_surface                             (vk::wsi::createSurface(m_vki, *m_instance, wsiType, display, window))
+       , m_instance                    (makeProtectedMemInstance(m_context, instanceExtensions))
+       , m_vki                                 (m_instance.getDriver())
+       , m_phyDevice                   (vk::chooseDevice(m_vki, m_instance, m_context.getTestContext().getCommandLine()))
+       , m_surface                             (vk::wsi::createSurface(m_vki, m_instance, wsiType, display, window))
        , m_queueFamilyIndex    (chooseProtectedMemQueueFamilyIndex(m_vki, m_phyDevice, *m_surface))
-       , m_device                              (makeProtectedMemDevice(m_interface, *m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions))
+       , m_device                              (makeProtectedMemDevice(m_interface, m_instance, m_vki, m_phyDevice, m_queueFamilyIndex, ctx.getUsedApiVersion(), deviceExtensions, m_context.getTestContext().getCommandLine().isValidationEnabled()))
        , m_allocator                   (createAllocator())
-       , m_deviceDriver                (m_interface, *m_instance, *m_device)
+       , m_deviceDriver                (m_interface, m_instance, *m_device)
        , m_queue                               (getProtectedQueue(m_deviceDriver, *m_device, m_queueFamilyIndex, 0))
 {
 }
index 3f2384f..435d17c 100644 (file)
@@ -27,6 +27,7 @@
 #include "tcuVector.hpp"
 #include "vkDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vktProtectedMemUtils.hpp"
 #include "tcuCommandLine.hpp"
@@ -64,7 +65,7 @@ public:
        vk::Allocator&                                                          getDefaultAllocator     (void) const    { return *m_allocator;  }
 
        const vk::InstanceDriver&                                       getInstanceDriver       (void) const    { return m_vki;                                                         }
-       vk::VkInstance                                                          getInstance                     (void) const    { return *m_instance;                                           }
+       vk::VkInstance                                                          getInstance                     (void) const    { return m_instance;                                            }
        const vk::VkSurfaceKHR                                          getSurface                      (void) const    { return *m_surface;                                            }
 
 
@@ -80,8 +81,8 @@ private:
 
        Context&                                                        m_context;
        const vk::PlatformInterface&            m_interface;
-       vk::Move<vk::VkInstance>                        m_instance;
-       vk::InstanceDriver                                      m_vki;
+       CustomInstance                                          m_instance;
+       const vk::InstanceDriver&                       m_vki;
        vk::VkPhysicalDevice                            m_phyDevice;
        const vk::Move<vk::VkSurfaceKHR>        m_surface;
        deUint32                                                        m_queueFamilyIndex;
index 90355da..b13b007 100644 (file)
@@ -23,6 +23,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktProtectedMemUtils.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "deString.h"
 #include "deRandom.hpp"
@@ -49,35 +50,22 @@ namespace ProtectedMem
 
 typedef std::vector<vk::VkExtensionProperties> Extensions;
 
-vk::Move<vk::VkInstance> makeProtectedMemInstance (const vk::PlatformInterface& vkp, const vkt::Context& context, const std::vector<std::string>& extraExtensions)
+CustomInstance makeProtectedMemInstance (vkt::Context& context, const std::vector<std::string>& extraExtensions)
 {
+       const PlatformInterface&        vkp = context.getPlatformInterface();
        const Extensions                        supportedExtensions(vk::enumerateInstanceExtensionProperties(vkp, DE_NULL));
-       std::vector<std::string>        enabledLayers;
        std::vector<std::string>        requiredExtensions = extraExtensions;
-       const bool                                      isValidationEnabled     = context.getTestContext().getCommandLine().isValidationEnabled();
-
-       if (isValidationEnabled)
-       {
-               if (!vk::isDebugReportSupported(vkp))
-                       TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
-
-               enabledLayers = vkt::getValidationLayers(vkp);
-               if (enabledLayers.empty())
-                       TCU_THROW(NotSupportedError, "No validation layers found");
-       }
 
        if (!isCoreInstanceExtension(context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"))
                requiredExtensions.push_back("VK_KHR_get_physical_device_properties2");
 
-       for (std::vector<std::string>::const_iterator requiredExtName = requiredExtensions.begin();
-               requiredExtName != requiredExtensions.end();
-               ++requiredExtName)
+       for (const auto& extName : requiredExtensions)
        {
-               if (!isInstanceExtensionSupported(context.getUsedApiVersion(), supportedExtensions, vk::RequiredExtension(*requiredExtName)))
-                       TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str());
+               if (!isInstanceExtensionSupported(context.getUsedApiVersion(), supportedExtensions, vk::RequiredExtension(extName)))
+                       TCU_THROW(NotSupportedError, (extName + " is not supported").c_str());
        }
 
-       return vk::createDefaultInstance(vkp, context.getUsedApiVersion(), enabledLayers, requiredExtensions);
+       return createCustomInstanceWithExtensions(context, requiredExtensions);
 }
 
 void checkProtectedQueueSupport (Context& context)
@@ -145,7 +133,8 @@ vk::Move<vk::VkDevice> makeProtectedMemDevice       (const vk::PlatformInterface&           vkp
                                                                                                 vk::VkPhysicalDevice                           physicalDevice,
                                                                                                 const deUint32                                         queueFamilyIndex,
                                                                                                 const deUint32                                         apiVersion,
-                                                                                                const std::vector<std::string>&        extraExtensions)
+                                                                                                const std::vector<std::string>&        extraExtensions,
+                                                                                                bool                                                           validationEnabled)
 {
        const Extensions                                        supportedExtensions     (vk::enumerateDeviceExtensionProperties(vkd, physicalDevice, DE_NULL));
        std::vector<std::string>                        requiredExtensions;
@@ -236,7 +225,7 @@ vk::Move<vk::VkDevice> makeProtectedMemDevice       (const vk::PlatformInterface&           vkp
                DE_NULL                                                                                                                 // pEnabledFeatures
        };
 
-       return vk::createDevice(vkp, instance, vkd, physicalDevice, &deviceParams, DE_NULL);
+       return createCustomDevice(validationEnabled, vkp, instance, vkd, physicalDevice, &deviceParams, DE_NULL);
 }
 
 vk::VkQueue getProtectedQueue  (const vk::DeviceInterface&     vk,
index 9f41e15..8671a84 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "deUniquePtr.hpp"
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkDefs.hpp"
 #include "vkRefUtil.hpp"
 #include "vkMemUtil.hpp"
@@ -57,8 +58,7 @@ typedef std::vector<vk::VkVertexInputAttributeDescription>    VertexAttribs;
 
 void                                                           checkProtectedQueueSupport                      (Context& context);
 
-vk::Move<vk::VkInstance>                       makeProtectedMemInstance                        (const vk::PlatformInterface&           vkp,
-                                                                                                                                                const vkt::Context&                            context,
+CustomInstance                                         makeProtectedMemInstance                        (vkt::Context&                                          context,
                                                                                                                                                 const std::vector<std::string>&        extraExtensions = std::vector<std::string>());
 deUint32                                                       chooseProtectedMemQueueFamilyIndex      (const vk::InstanceDriver&                      vkd,
                                                                                                                                                 vk::VkPhysicalDevice                           physicalDevice,
@@ -70,7 +70,8 @@ vk::Move<vk::VkDevice>                                makeProtectedMemDevice                          (const vk::PlatformInterface
                                                                                                                                                 vk::VkPhysicalDevice                           physicalDevice,
                                                                                                                                                 const deUint32                                         queueFamilyIndex,
                                                                                                                                                 const deUint32                                         apiVersion,
-                                                                                                                                                const std::vector<std::string>&        extraExtensions = std::vector<std::string>());
+                                                                                                                                                const std::vector<std::string>&        extraExtensions,
+                                                                                                                                                bool                                                           validationEnabled);
 vk::VkQueue                                                    getProtectedQueue                                       (const vk::DeviceInterface&                     vk,
                                                                                                                                                 vk::VkDevice                                           device,
                                                                                                                                                 const deUint32                                         queueFamilyIndex,
index 991740d..4cdd332 100644 (file)
@@ -23,6 +23,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktRobustnessUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkDefs.hpp"
 #include "vkImageUtil.hpp"
 #include "vkPrograms.hpp"
@@ -31,6 +32,7 @@
 #include "vkTypeUtil.hpp"
 #include "vkCmdUtil.hpp"
 #include "vkObjUtil.hpp"
+#include "tcuCommandLine.hpp"
 #include "deMath.h"
 #include <iomanip>
 #include <limits>
@@ -48,7 +50,7 @@ Move<VkDevice> createRobustBufferAccessDevice (Context& context)
        const float queuePriority = 1.0f;
 
        // Create a universal queue that supports graphics and compute
-       const VkDeviceQueueCreateInfo queueParams =
+       const VkDeviceQueueCreateInfo   queueParams =
        {
                VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,     // VkStructureType                              sType;
                DE_NULL,                                                                        // const void*                                  pNext;
@@ -61,7 +63,7 @@ Move<VkDevice> createRobustBufferAccessDevice (Context& context)
        VkPhysicalDeviceFeatures enabledFeatures = context.getDeviceFeatures();
        enabledFeatures.robustBufferAccess = true;
 
-       const VkDeviceCreateInfo deviceParams =
+       const VkDeviceCreateInfo                deviceParams =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,   // VkStructureType                                      sType;
                DE_NULL,                                                                // const void*                                          pNext;
@@ -75,8 +77,8 @@ Move<VkDevice> createRobustBufferAccessDevice (Context& context)
                &enabledFeatures                                                // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
        };
 
-       return createDevice(context.getPlatformInterface(), context.getInstance(),
-                                               context.getInstanceInterface(), context.getPhysicalDevice(), &deviceParams);
+       return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(),
+                                                         context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &deviceParams);
 }
 
 bool areEqual (float a, float b)
index 4e59a9a..4476c3f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "vktSparseResourcesBase.hpp"
 #include "vktSparseResourcesTestsUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkMemUtil.hpp"
 #include "vkRefUtil.hpp"
 #include "vkTypeUtil.hpp"
@@ -81,8 +82,8 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir
        if (m_useDeviceGroups)
        {
                const std::vector<std::string>  requiredExtensions(1, "VK_KHR_device_group_creation");
-               m_deviceGroupInstance   =               createInstanceWithExtensions(m_context.getPlatformInterface(), m_context.getUsedApiVersion(), requiredExtensions);
-               devGroupProperties              =               enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+               m_deviceGroupInstance   =               createCustomInstanceWithExtensions(m_context, requiredExtensions);
+               devGroupProperties              =               enumeratePhysicalDeviceGroups(m_context.getInstanceInterface(), m_deviceGroupInstance);
                m_numPhysicalDevices    =               devGroupProperties[m_deviceGroupIdx].physicalDeviceCount;
 
                m_physicalDevices.clear();
@@ -100,7 +101,7 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir
                        deviceExtensions.push_back("VK_KHR_device_group");
        }
 
-       const VkInstance&                                       instance(m_useDeviceGroups ? m_deviceGroupInstance.get() : m_context.getInstance());
+       const VkInstance&                                       instance(m_useDeviceGroups ? m_deviceGroupInstance : m_context.getInstance());
        InstanceDriver                                          instanceDriver(m_context.getPlatformInterface(), instance);
        const VkPhysicalDevice                          physicalDevice = getPhysicalDevice();
        deUint32 queueFamilyPropertiesCount = 0u;
@@ -188,7 +189,7 @@ void SparseResourcesBaseInstance::createDeviceSupportingQueues(const QueueRequir
                &deviceFeatures,                                                                                        // const VkPhysicalDeviceFeatures*    pEnabledFeatures;
        };
 
-       m_logicalDevice = createDevice(m_context.getPlatformInterface(), instance, instanceDriver, physicalDevice, &deviceInfo);
+       m_logicalDevice = createCustomDevice(m_context.getTestContext().getCommandLine().isValidationEnabled(), m_context.getPlatformInterface(), instance, instanceDriver, physicalDevice, &deviceInfo);
        m_deviceDriver  = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), instance, *m_logicalDevice));
        m_allocator             = de::MovePtr<Allocator>(new SimpleAllocator(*m_deviceDriver, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instanceDriver, physicalDevice)));
 
index a82eeb5..f14a37f 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vkDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkRef.hpp"
 #include "vkPlatform.hpp"
 #include "deUniquePtr.hpp"
@@ -84,7 +85,7 @@ protected:
 private:
        bool                                                                                            m_useDeviceGroups;
        deUint32                                                                                        m_deviceGroupIdx;
-       vk::Move<vk::VkInstance>                                                        m_deviceGroupInstance;
+       CustomInstance                                                                          m_deviceGroupInstance;
        std::vector<vk::VkPhysicalDevice>                                       m_physicalDevices;
        std::map<vk::VkQueueFlags, std::vector<Queue> >         m_queues;
        de::MovePtr<vk::DeviceDriver>                                           m_deviceDriver;
index e8f183a..208e9a4 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktSynchronizationBasicSemaphoreTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -33,6 +34,8 @@
 
 #include "vkRef.hpp"
 
+#include "tcuCommandLine.hpp"
+
 namespace vkt
 {
 namespace synchronization
@@ -359,7 +362,7 @@ tcu::TestStatus basicMultiQueueCase (Context& context, TestConfig config)
        deviceInfo.queueCreateInfoCount         = (queues[FIRST].queueFamilyIndex == queues[SECOND].queueFamilyIndex) ? 1 : COUNT;
        deviceInfo.pQueueCreateInfos            = queueInfos;
 
-       logicalDevice = vk::createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
+       logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
 
        for (deUint32 queueReqNdx = 0; queueReqNdx < COUNT; ++queueReqNdx)
        {
index 7552f7a..9b40499 100644 (file)
 #include "vktSynchronizationOperationResources.hpp"
 #include "vktExternalMemoryUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "deRandom.hpp"
 
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 using tcu::TestLog;
 using namespace vkt::ExternalMemoryUtil;
@@ -308,123 +310,24 @@ SimpleAllocation::~SimpleAllocation (void)
        m_vkd.freeMemory(m_device, getMemory(), DE_NULL);
 }
 
-class DeviceId
+CustomInstance createTestInstance (Context& context)
 {
-public:
-                                       DeviceId                (deUint32               vendorId,
-                                                                        deUint32               driverVersion,
-                                                                        const deUint8  driverUUID[VK_UUID_SIZE],
-                                                                        const deUint8  deviceUUID[VK_UUID_SIZE]);
-
-       bool                    operator==              (const DeviceId& other) const;
-       bool                    operator|=              (const DeviceId& other) const;
-
-private:
-       const deUint32  m_vendorId;
-       const deUint32  m_driverVersion;
-       deUint8                 m_driverUUID[VK_UUID_SIZE];
-       deUint8                 m_deviceUUID[VK_UUID_SIZE];
-};
-
-DeviceId::DeviceId (deUint32           vendorId,
-                                       deUint32                driverVersion,
-                                       const deUint8   driverUUID[VK_UUID_SIZE],
-                                       const deUint8   deviceUUID[VK_UUID_SIZE])
-       : m_vendorId            (vendorId)
-       , m_driverVersion       (driverVersion)
-{
-       deMemcpy(m_driverUUID, driverUUID, sizeof(m_driverUUID));
-       deMemcpy(m_deviceUUID, deviceUUID, sizeof(m_deviceUUID));
-}
+       std::vector<std::string> extensions;
+       extensions.push_back("VK_KHR_get_physical_device_properties2");
+       extensions.push_back("VK_KHR_external_semaphore_capabilities");
+       extensions.push_back("VK_KHR_external_memory_capabilities");
 
-bool DeviceId::operator== (const DeviceId& other) const
-{
-       if (this == &other)
-               return true;
-
-       if (m_vendorId != other.m_vendorId)
-               return false;
-
-       if (m_driverVersion != other.m_driverVersion)
-               return false;
-
-       if (deMemCmp(m_driverUUID, other.m_driverUUID, sizeof(m_driverUUID)) != 0)
-               return false;
-
-       return deMemCmp(m_deviceUUID, other.m_deviceUUID, sizeof(m_deviceUUID)) == 0;
+       return createCustomInstanceWithExtensions(context, extensions);
 }
 
-DeviceId getDeviceId (const vk::InstanceInterface&     vki,
-                                         vk::VkPhysicalDevice                  physicalDevice)
-{
-       vk::VkPhysicalDeviceIDProperties                        propertiesId;
-       vk::VkPhysicalDeviceProperties2                         properties;
-
-       deMemset(&properties, 0, sizeof(properties));
-       deMemset(&propertiesId, 0, sizeof(propertiesId));
-
-       propertiesId.sType      = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
-
-       properties.sType        = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
-       properties.pNext        = &propertiesId;
-
-       vki.getPhysicalDeviceProperties2(physicalDevice, &properties);
-
-       return DeviceId(properties.properties.vendorID, properties.properties.driverVersion, propertiesId.driverUUID, propertiesId.deviceUUID);
-}
-
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface& vkp, deUint32 version)
-{
-       try
-       {
-               std::vector<std::string> extensions;
-               if (!vk::isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
-                       extensions.push_back("VK_KHR_get_physical_device_properties2");
-               if (!vk::isCoreInstanceExtension(version, "VK_KHR_external_semaphore_capabilities"))
-                       extensions.push_back("VK_KHR_external_semaphore_capabilities");
-               if (!vk::isCoreInstanceExtension(version, "VK_KHR_external_memory_capabilities"))
-                       extensions.push_back("VK_KHR_external_memory_capabilities");
-
-               return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), extensions);
-       }
-       catch (const vk::Error& error)
-       {
-               if (error.getError() == vk::VK_ERROR_EXTENSION_NOT_PRESENT)
-                       TCU_THROW(NotSupportedError, "Required external memory extensions not supported by the instance");
-               else
-                       throw;
-       }
-}
-
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface&   vki,
-                                                                               vk::VkInstance                                  instance,
-                                                                               const tcu::CommandLine&                 cmdLine)
-{
-       return vk::chooseDevice(vki, instance, cmdLine);
-}
-
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface& vki, vk::VkInstance instance, const DeviceId& deviceId)
-{
-       const std::vector<vk::VkPhysicalDevice> devices (vk::enumeratePhysicalDevices(vki, instance));
-
-       for (size_t deviceNdx = 0; deviceNdx < devices.size(); deviceNdx++)
-       {
-               if (deviceId == getDeviceId(vki, devices[deviceNdx]))
-                       return devices[deviceNdx];
-       }
-
-       TCU_FAIL("No matching device found");
-
-       return (vk::VkPhysicalDevice)0;
-}
-
-vk::Move<vk::VkDevice> createDevice (const Context&                                    context,
-                                                                        const vk::PlatformInterface&   vkp,
-                                                                        vk::VkInstance                                 instance,
-                                                                        const vk::InstanceInterface&   vki,
-                                                                        const vk::VkPhysicalDevice             physicalDevice,
-                                                                        bool                                                   timelineSemaphores)
+vk::Move<vk::VkDevice> createTestDevice (const Context&                                        context,
+                                                                                const vk::PlatformInterface&   vkp,
+                                                                                vk::VkInstance                                 instance,
+                                                                                const vk::InstanceInterface&   vki,
+                                                                                const vk::VkPhysicalDevice             physicalDevice,
+                                                                                bool                                                   timelineSemaphores)
 {
+       const bool                                                                              validationEnabled               = context.getTestContext().getCommandLine().isValidationEnabled();
        const float                                                                             priority                                = 0.0f;
        const std::vector<vk::VkQueueFamilyProperties>  queueFamilyProperties   = vk::getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
        std::vector<deUint32>                                                   queueFamilyIndices              (queueFamilyProperties.size(), 0xFFFFFFFFu);
@@ -497,7 +400,7 @@ vk::Move<vk::VkDevice> createDevice (const Context&                                 context,
                        0u
                };
 
-               return vk::createDevice(vkp, instance, vki, physicalDevice, &createInfo);
+               return vkt::createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &createInfo);
        }
        catch (const vk::Error& error)
        {
@@ -512,30 +415,38 @@ vk::Move<vk::VkDevice> createDevice (const Context&                                       context,
 class InstanceAndDevice
 {
 public:
-
-       InstanceAndDevice       (const Context&         context,
-                                                const TestConfig&      config)
-               : m_instance            (createInstance(context.getPlatformInterface(), context.getUsedApiVersion()))
-               , m_vki                         (context.getPlatformInterface(), *m_instance)
-               , m_physicalDevice      (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
-               , m_logicalDevice       (createDevice(context, context.getPlatformInterface(), *m_instance, m_vki, m_physicalDevice, config.semaphoreType == vk::VK_SEMAPHORE_TYPE_TIMELINE_KHR))
+       InstanceAndDevice       (Context&                       context,
+                            const TestConfig&  config)
+               : m_instance            (createTestInstance(context))
+               , m_vki                         (m_instance.getDriver())
+               , m_physicalDevice      (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
+               , m_logicalDevice       (createTestDevice(context, context.getPlatformInterface(), m_instance, m_vki, m_physicalDevice, config.semaphoreType == vk::VK_SEMAPHORE_TYPE_TIMELINE_KHR))
        {
        }
 
-       const vk::Unique<vk::VkInstance>& getInstance()
+       vk::VkInstance                          getInstance()
        {
                return m_instance;
        }
 
+       const vk::InstanceDriver&       getDriver()
+       {
+               return m_vki;
+       }
+
+       vk::VkPhysicalDevice            getPhysicalDevice()
+       {
+               return m_physicalDevice;
+       }
+
        const Unique<vk::VkDevice>& getDevice()
        {
-               DE_ASSERT(m_instance);
                return m_logicalDevice;
        }
 
 private:
-       const Unique<vk::VkInstance>    m_instance;
-       const vk::InstanceDriver                m_vki;
+       CustomInstance                                  m_instance;
+       const vk::InstanceDriver&               m_vki;
        const vk::VkPhysicalDevice              m_physicalDevice;
        const Unique<vk::VkDevice>              m_logicalDevice;
 };
@@ -1055,29 +966,27 @@ private:
        const de::UniquePtr<OperationSupport>                           m_supportReadOp;
        const NotSupportedChecker                                                       m_notSupportedChecker; // Must declare before VkInstance to effectively reduce runtimes!
 
-       InstanceAndDevice                                                                       m_instanceAndDeviceA;
-       const vk::Unique<vk::VkInstance>&                                       m_instanceA;
+       const bool                                                                                      m_getMemReq2Supported;
 
-       const vk::InstanceDriver                                                        m_vkiA;
+       InstanceAndDevice                                                                       m_instanceAndDeviceA;
+       const vk::VkInstance                                                            m_instanceA;
+       const vk::InstanceDriver&                                                       m_vkiA;
        const vk::VkPhysicalDevice                                                      m_physicalDeviceA;
        const std::vector<vk::VkQueueFamilyProperties>          m_queueFamiliesA;
        const std::vector<deUint32>                                                     m_queueFamilyIndicesA;
-
-       const bool                                                                                      m_getMemReq2Supported;
-
        const vk::Unique<vk::VkDevice>&                                         m_deviceA;
        const vk::DeviceDriver                                                          m_vkdA;
 
        InstanceAndDevice                                                                       m_instanceAndDeviceB;
-       const vk::Unique<vk::VkInstance>&                                       m_instanceB;
-       const vk::InstanceDriver                                                        m_vkiB;
+       const vk::VkInstance                                                            m_instanceB;
+       const vk::InstanceDriver&                                                       m_vkiB;
        const vk::VkPhysicalDevice                                                      m_physicalDeviceB;
        const std::vector<vk::VkQueueFamilyProperties>          m_queueFamiliesB;
        const std::vector<deUint32>                                                     m_queueFamilyIndicesB;
        const vk::Unique<vk::VkDevice>&                                         m_deviceB;
        const vk::DeviceDriver                                                          m_vkdB;
 
-       const vk::VkExternalSemaphoreHandleTypeFlagBits m_semaphoreHandleType;
+       const vk::VkExternalSemaphoreHandleTypeFlagBits         m_semaphoreHandleType;
        const vk::VkExternalMemoryHandleTypeFlagBits            m_memoryHandleType;
 
        // \todo Should this be moved to the group same way as in the other tests?
@@ -1094,27 +1003,25 @@ SharingTestInstance::SharingTestInstance (Context&              context,
        , m_supportWriteOp                      (makeOperationSupport(config.writeOp, config.resource))
        , m_supportReadOp                       (makeOperationSupport(config.readOp, config.resource))
        , m_notSupportedChecker         (context, m_config, *m_supportWriteOp, *m_supportReadOp)
+       , m_getMemReq2Supported         (vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_get_memory_requirements2"))
 
        , m_instanceAndDeviceA          (context, config)
        , m_instanceA                           (m_instanceAndDeviceA.getInstance())
-
-       , m_vkiA                                        (context.getPlatformInterface(), *m_instanceA) // \todo [2017-06-13 pyry] Provide correct extension list
-       , m_physicalDeviceA                     (getPhysicalDevice(m_vkiA, *m_instanceA, context.getTestContext().getCommandLine()))
+       , m_vkiA                                        (m_instanceAndDeviceA.getDriver())
+       , m_physicalDeviceA                     (m_instanceAndDeviceA.getPhysicalDevice())
        , m_queueFamiliesA                      (vk::getPhysicalDeviceQueueFamilyProperties(m_vkiA, m_physicalDeviceA))
        , m_queueFamilyIndicesA         (getFamilyIndices(m_queueFamiliesA))
-       , m_getMemReq2Supported         (vk::isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_get_memory_requirements2"))
        , m_deviceA                                     (m_instanceAndDeviceA.getDevice())
-       , m_vkdA                                        (context.getPlatformInterface(), *m_instanceA, *m_deviceA)
+       , m_vkdA                                        (context.getPlatformInterface(), m_instanceA, *m_deviceA)
 
        , m_instanceAndDeviceB          (context, config)
        , m_instanceB                           (m_instanceAndDeviceB.getInstance())
-
-       , m_vkiB                                        (context.getPlatformInterface(), *m_instanceB) // \todo [2017-06-13 pyry] Provide correct extension list
-       , m_physicalDeviceB                     (getPhysicalDevice(m_vkiB, *m_instanceB, getDeviceId(m_vkiA, m_physicalDeviceA)))
+       , m_vkiB                                        (m_instanceAndDeviceB.getDriver())
+       , m_physicalDeviceB                     (m_instanceAndDeviceB.getPhysicalDevice())
        , m_queueFamiliesB                      (vk::getPhysicalDeviceQueueFamilyProperties(m_vkiB, m_physicalDeviceB))
        , m_queueFamilyIndicesB         (getFamilyIndices(m_queueFamiliesB))
        , m_deviceB                                     (m_instanceAndDeviceB.getDevice())
-       , m_vkdB                                        (context.getPlatformInterface(), *m_instanceB, *m_deviceB)
+       , m_vkdB                                        (context.getPlatformInterface(), m_instanceB, *m_deviceB)
 
        , m_semaphoreHandleType         (m_config.semaphoreHandleType)
        , m_memoryHandleType            (m_config.memoryHandleType)
@@ -1134,20 +1041,20 @@ tcu::TestStatus SharingTestInstance::iterate (void)
                const deUint32                                                  queueFamilyA            = (deUint32)m_queueANdx;
                const deUint32                                                  queueFamilyB            = (deUint32)m_queueBNdx;
 
-       const tcu::ScopedLogSection                             queuePairSection        (log,
+               const tcu::ScopedLogSection                             queuePairSection        (log,
                                                                                                                                        "WriteQueue-" + de::toString(queueFamilyA) + "-ReadQueue-" + de::toString(queueFamilyB),
                                                                                                                                        "WriteQueue-" + de::toString(queueFamilyA) + "-ReadQueue-" + de::toString(queueFamilyB));
 
-       const vk::Unique<vk::VkSemaphore>               semaphoreA                      (createExportableSemaphoreType(m_vkdA, *m_deviceA, m_config.semaphoreType, m_semaphoreHandleType));
-       const vk::Unique<vk::VkSemaphore>               semaphoreB                      (createSemaphoreType(m_vkdB, *m_deviceB, m_config.semaphoreType));
+               const vk::Unique<vk::VkSemaphore>               semaphoreA                      (createExportableSemaphoreType(m_vkdA, *m_deviceA, m_config.semaphoreType, m_semaphoreHandleType));
+               const vk::Unique<vk::VkSemaphore>               semaphoreB                      (createSemaphoreType(m_vkdB, *m_deviceB, m_config.semaphoreType));
 
-       deUint32                                                                exportedMemoryTypeIndex = ~0U;
-       const de::UniquePtr<Resource>                   resourceA                       (createResource(m_vkdA, *m_deviceA, m_config.resource, m_queueFamilyIndicesA, *m_supportReadOp, *m_supportWriteOp, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated, m_getMemReq2Supported));
+               deUint32                                                                exportedMemoryTypeIndex = ~0U;
+               const de::UniquePtr<Resource>                   resourceA                       (createResource(m_vkdA, *m_deviceA, m_config.resource, m_queueFamilyIndicesA, *m_supportReadOp, *m_supportWriteOp, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated, m_getMemReq2Supported));
 
-       NativeHandle                                                    nativeMemoryHandle;
-       getMemoryNative(m_vkdA, *m_deviceA, resourceA->getMemory(), m_memoryHandleType, nativeMemoryHandle);
+               NativeHandle                                                    nativeMemoryHandle;
+               getMemoryNative(m_vkdA, *m_deviceA, resourceA->getMemory(), m_memoryHandleType, nativeMemoryHandle);
 
-       const de::UniquePtr<Resource>                   resourceB                       (importResource(m_vkdB, *m_deviceB, m_config.resource, m_queueFamilyIndicesB, *m_supportReadOp, *m_supportWriteOp, nativeMemoryHandle, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated));
+               const de::UniquePtr<Resource>                   resourceB                       (importResource(m_vkdB, *m_deviceB, m_config.resource, m_queueFamilyIndicesB, *m_supportReadOp, *m_supportWriteOp, nativeMemoryHandle, m_memoryHandleType, exportedMemoryTypeIndex, m_config.dedicated));
 
 
                const vk::VkQueue                                               queueA                          (getQueue(m_vkdA, *m_deviceA, queueFamilyA));
index 23fb228..687ef30 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktSynchronizationInternallySynchronizedObjectsTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktSynchronizationUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkRef.hpp"
 #include "tcuDefs.hpp"
@@ -36,6 +37,7 @@
 #include "vkObjUtil.hpp"
 
 #include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deThread.hpp"
 #include "deMutex.hpp"
@@ -258,7 +260,7 @@ MovePtr<MultiQueues> createQueues (const Context& context, const VkQueueFlags& q
        deviceInfo.queueCreateInfoCount         = static_cast<deUint32>(queues.countQueueFamilyIndex());
        deviceInfo.pQueueCreateInfos            = &queueInfos[0];
 
-       queues.setDevice(createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo));
+       queues.setDevice(createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo));
 
        for (deUint32 queueFamilyIndex = 0; queueFamilyIndex < queues.countQueueFamilyIndex(); ++queueFamilyIndex)
        {
index 8c7c3c6..0ffe305 100644 (file)
@@ -22,6 +22,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktSynchronizationOperationMultiQueueTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkDefs.hpp"
 #include "vktTestCase.hpp"
 #include "vktTestCaseUtil.hpp"
@@ -42,6 +43,7 @@
 #include "vktSynchronizationOperationTestData.hpp"
 #include "vktSynchronizationOperationResources.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "tcuCommandLine.hpp"
 
 #include <set>
 
@@ -158,7 +160,7 @@ class MultiQueues
                        if (timelineSemaphore && !context.getTimelineSemaphoreFeatures().timelineSemaphore)
                                TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
 
-                       m_logicalDevice = createDevice(context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
+                       m_logicalDevice = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), context.getInstance(), instance, physicalDevice, &deviceInfo);
                        m_deviceDriver  = MovePtr<DeviceDriver>(new DeviceDriver(context.getPlatformInterface(), context.getInstance(), *m_logicalDevice));
                        m_allocator             = MovePtr<Allocator>(new SimpleAllocator(*m_deviceDriver, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instance, physicalDevice)));
 
index 50eee1a..4545773 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktSynchronizationSmokeTests.hpp"
 
 #include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkPlatform.hpp"
 #include "vkStrUtil.hpp"
@@ -34,6 +35,7 @@
 
 #include "tcuTestLog.hpp"
 #include "tcuFormatUtil.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deUniquePtr.hpp"
 #include "deThread.hpp"
@@ -87,7 +89,7 @@ void buildShaders (SourceCollections& shaderCollection)
                                "}\n");
 }
 
-Move<VkDevice> createTestDevice (const PlatformInterface& vkp, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, deUint32 *outQueueFamilyIndex)
+Move<VkDevice> createTestDevice (const PlatformInterface& vkp, VkInstance instance, const InstanceInterface& vki, VkPhysicalDevice physicalDevice, bool validationEnabled, deUint32 *outQueueFamilyIndex)
 {
        VkDeviceQueueCreateInfo         queueInfo;
        VkDeviceCreateInfo                      deviceInfo;
@@ -138,7 +140,7 @@ Move<VkDevice> createTestDevice (const PlatformInterface& vkp, VkInstance instan
 
        *outQueueFamilyIndex                                    = queueInfo.queueFamilyIndex;
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceInfo);
 };
 
 struct BufferParameters
@@ -1095,7 +1097,7 @@ tcu::TestStatus testSemaphores (Context& context, VkSemaphoreType semaphoreType)
        const InstanceInterface&                        instanceInterface               = context.getInstanceInterface();
        const VkPhysicalDevice                          physicalDevice                  = context.getPhysicalDevice();
        deUint32                                                        queueFamilyIdx;
-       vk::Move<VkDevice>                                      device                                  = createTestDevice(platformInterface, context.getInstance(), instanceInterface, physicalDevice, &queueFamilyIdx);
+       vk::Move<VkDevice>                                      device                                  = createTestDevice(platformInterface, context.getInstance(), instanceInterface, physicalDevice, context.getTestContext().getCommandLine().isValidationEnabled(), &queueFamilyIdx);
        const DeviceDriver                                      deviceInterface                 (platformInterface, context.getInstance(), *device);
        SimpleAllocator                                         allocator                               (deviceInterface,
                                                                                                                                 *device,
index c4b2ca3..fcdb9a2 100644 (file)
 #include "vktSynchronizationOperationTestData.hpp"
 #include "vktExternalMemoryUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 #if (DE_OS == DE_OS_WIN32)
 #      define WIN32_LEAN_AND_MEAN
@@ -144,40 +146,23 @@ SimpleAllocation::~SimpleAllocation (void)
        m_vkd.freeMemory(m_device, getMemory(), DE_NULL);
 }
 
-vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface& vkp, deUint32 version)
+CustomInstance createTestInstance (Context& context)
 {
-       try
-       {
-               std::vector<std::string> extensions;
-               if (!isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
-                       extensions.push_back("VK_KHR_get_physical_device_properties2");
-               if (!isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
-                       extensions.push_back("VK_KHR_external_memory_capabilities");
-
-               return vk::createDefaultInstance(vkp, version, std::vector<std::string>(), extensions);
-       }
-       catch (const vk::Error& error)
-       {
-               if (error.getError() == vk::VK_ERROR_EXTENSION_NOT_PRESENT)
-                       TCU_THROW(NotSupportedError, "Required external memory extensions not supported by the instance");
-               else
-                       throw;
-       }
-}
+       std::vector<std::string> extensions;
+       extensions.push_back("VK_KHR_get_physical_device_properties2");
+       extensions.push_back("VK_KHR_external_memory_capabilities");
 
-vk::VkPhysicalDevice getPhysicalDevice (const vk::InstanceInterface&   vki,
-                                                                               vk::VkInstance                                  instance,
-                                                                               const tcu::CommandLine&                 cmdLine)
-{
-       return vk::chooseDevice(vki, instance, cmdLine);
+       return createCustomInstanceWithExtensions(context, extensions);
 }
 
-vk::Move<vk::VkDevice> createDevice (const deUint32                                                                    apiVersion,
-                                                                        const vk::PlatformInterface&                                   vkp,
-                                                                        vk::VkInstance                                                                 instance,
-                                                                        const vk::InstanceInterface&                                   vki,
-                                                                        vk::VkPhysicalDevice                                                   physicalDevice)
+vk::Move<vk::VkDevice> createTestDevice (Context&                                              context,
+                                                                                vk::VkInstance                                 instance,
+                                                                                const vk::InstanceInterface&   vki,
+                                                                                vk::VkPhysicalDevice                   physicalDevice)
 {
+       const bool                                                                              validationEnabled               = context.getTestContext().getCommandLine().isValidationEnabled();
+       const deUint32                                                                  apiVersion                              = context.getUsedApiVersion();
+       const vk::PlatformInterface&                                    vkp                                             = context.getPlatformInterface();
        const float                                                                             priority                                = 0.0f;
        const std::vector<vk::VkQueueFamilyProperties>  queueFamilyProperties   = vk::getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
        std::vector<deUint32>                                                   queueFamilyIndices              (queueFamilyProperties.size(), 0xFFFFFFFFu);
@@ -230,7 +215,7 @@ vk::Move<vk::VkDevice> createDevice (const deUint32                                                                 apiVersion,
                        0u
                };
 
-               return vk::createDevice(vkp, instance, vki, physicalDevice, &createInfo);
+               return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &createInfo);
        }
        catch (const vk::Error& error)
        {
@@ -1435,24 +1420,34 @@ private:
 // Class to wrap a singleton instance and device
 class InstanceAndDevice
 {
-       InstanceAndDevice       (const Context& context)
-               : m_instance            (createInstance(context.getPlatformInterface(), context.getUsedApiVersion()))
-               , m_vki                         (context.getPlatformInterface(), *m_instance)
-               , m_physicalDevice      (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
-               , m_logicalDevice       (createDevice(context.getUsedApiVersion(), context.getPlatformInterface(), *m_instance, m_vki, m_physicalDevice))
+       InstanceAndDevice       (Context& context)
+               : m_instance            (createTestInstance(context))
+               , m_vki                         (m_instance.getDriver())
+               , m_physicalDevice      (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
+               , m_logicalDevice       (createTestDevice(context, m_instance, m_vki, m_physicalDevice))
                , m_supportDX11         (new DX11OperationSupport(m_vki, m_physicalDevice))
        {
        }
 
 public:
 
-       static const vk::Unique<vk::VkInstance>& getInstance(const Context& context)
+       static vk::VkInstance getInstance(Context& context)
        {
                if (!m_instanceAndDevice)
                        m_instanceAndDevice = SharedPtr<InstanceAndDevice>(new InstanceAndDevice(context));
 
                return m_instanceAndDevice->m_instance;
        }
+       static const vk::InstanceDriver& getDriver()
+       {
+               DE_ASSERT(m_instanceAndDevice);
+               return m_instanceAndDevice->m_instance.getDriver();
+       }
+       static vk::VkPhysicalDevice getPhysicalDevice()
+       {
+               DE_ASSERT(m_instanceAndDevice);
+               return m_instanceAndDevice->m_physicalDevice;
+       }
        static const Unique<vk::VkDevice>& getDevice()
        {
                DE_ASSERT(m_instanceAndDevice);
@@ -1463,6 +1458,11 @@ public:
                DE_ASSERT(m_instanceAndDevice);
                return m_instanceAndDevice->m_supportDX11;
        }
+       static void collectMessages()
+       {
+               DE_ASSERT(m_instanceAndDevice);
+               m_instanceAndDevice->m_instance.collectMessages();
+       }
 
        static void destroy()
        {
@@ -1470,8 +1470,8 @@ public:
        }
 
 private:
-       const Unique<vk::VkInstance>                            m_instance;
-       const vk::InstanceDriver                                        m_vki;
+       CustomInstance                                                          m_instance;
+       const vk::InstanceDriver&                                       m_vki;
        const vk::VkPhysicalDevice                                      m_physicalDevice;
        const Unique<vk::VkDevice>                                      m_logicalDevice;
        const de::UniquePtr<DX11OperationSupport>       m_supportDX11;
@@ -1494,9 +1494,9 @@ private:
        const de::UniquePtr<OperationSupport>                           m_supportWriteOp;
        const de::UniquePtr<OperationSupport>                           m_supportReadOp;
 
-       const vk::Unique<vk::VkInstance>&                                       m_instance;
+       const vk::VkInstance                                                            m_instance;
 
-       const vk::InstanceDriver                                                        m_vki;
+       const vk::InstanceDriver&                                                       m_vki;
        const vk::VkPhysicalDevice                                                      m_physicalDevice;
        const std::vector<vk::VkQueueFamilyProperties>          m_queueFamilies;
        const std::vector<deUint32>                                                     m_queueFamilyIndices;
@@ -1522,12 +1522,12 @@ Win32KeyedMutexTestInstance::Win32KeyedMutexTestInstance        (Context&               context,
 
        , m_instance                            (InstanceAndDevice::getInstance(context))
 
-       , m_vki                                         (context.getPlatformInterface(), *m_instance)
-       , m_physicalDevice                      (getPhysicalDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_vki                                         (InstanceAndDevice::getDriver())
+       , m_physicalDevice                      (InstanceAndDevice::getPhysicalDevice())
        , m_queueFamilies                       (vk::getPhysicalDeviceQueueFamilyProperties(m_vki, m_physicalDevice))
        , m_queueFamilyIndices          (getFamilyIndices(m_queueFamilies))
        , m_device                                      (InstanceAndDevice::getDevice())
-       , m_vkd                                         (context.getPlatformInterface(), *m_instance, *m_device)
+       , m_vkd                                         (context.getPlatformInterface(), m_instance, *m_device)
 
        , m_memoryHandleType            ((m_config.resource.type == RESOURCE_TYPE_IMAGE) ? m_config.memoryHandleTypeImage : m_config.memoryHandleTypeBuffer)
 
@@ -1816,6 +1816,9 @@ tcu::TestStatus Win32KeyedMutexTestInstance::iterate (void)
                m_resultCollector.fail(std::string("Exception: ") + error.getMessage());
        }
 
+       // Collect possible validation errors.
+       InstanceAndDevice::collectMessages();
+
        // Move to next queue
        {
                m_queueNdx++;
diff --git a/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.cpp
new file mode 100644 (file)
index 0000000..ef13a91
--- /dev/null
@@ -0,0 +1,364 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 Valve Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Auxiliar functions to help create custom devices and instances.
+ *//*--------------------------------------------------------------------*/
+
+#include "vkRefUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkDeviceUtil.hpp"
+#include "tcuCommandLine.hpp"
+#include "vktCustomInstancesDevices.hpp"
+
+#include <algorithm>
+
+using std::vector;
+using std::string;
+using vk::Move;
+using vk::VkInstance;
+using vk::InstanceDriver;
+using vk::DebugReportRecorder;
+
+namespace vkt
+{
+
+namespace
+{
+
+vector<const char*> getValidationLayers (const vector<vk::VkLayerProperties>& supportedLayers)
+{
+       static const char*      s_magicLayer            = "VK_LAYER_LUNARG_standard_validation";
+       static const char*      s_defaultLayers[]       =
+       {
+               "VK_LAYER_GOOGLE_threading",
+               "VK_LAYER_LUNARG_parameter_validation",
+               "VK_LAYER_LUNARG_device_limits",
+               "VK_LAYER_LUNARG_object_tracker",
+               "VK_LAYER_LUNARG_image",
+               "VK_LAYER_LUNARG_core_validation",
+               "VK_LAYER_LUNARG_swapchain",
+               "VK_LAYER_GOOGLE_unique_objects"
+       };
+
+       vector<const char*>     enabledLayers;
+
+       if (vk::isLayerSupported(supportedLayers, vk::RequiredLayer(s_magicLayer)))
+               enabledLayers.push_back(s_magicLayer);
+       else
+       {
+               for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx)
+               {
+                       if (isLayerSupported(supportedLayers, vk::RequiredLayer(s_defaultLayers[ndx])))
+                               enabledLayers.push_back(s_defaultLayers[ndx]);
+               }
+       }
+
+       return enabledLayers;
+}
+
+} // anonymous
+
+
+vector<const char*> getValidationLayers (const vk::PlatformInterface& vkp)
+{
+       return getValidationLayers(enumerateInstanceLayerProperties(vkp));
+}
+
+vector<const char*> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice)
+{
+       return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
+}
+
+CustomInstance::CustomInstance (Context& context, Move<VkInstance> instance, bool enableDebugReportRecorder)
+       : m_context             (&context)
+       , m_instance    (instance)
+       , m_driver              (new InstanceDriver(context.getPlatformInterface(), *m_instance))
+       , m_recorder    (enableDebugReportRecorder ? (new DebugReportRecorder(*m_driver, *m_instance)) : nullptr)
+{
+}
+
+CustomInstance::CustomInstance ()
+       : m_context             (nullptr)
+       , m_instance    ()
+       , m_driver              (nullptr)
+       , m_recorder    (nullptr)
+{
+}
+
+CustomInstance::CustomInstance (CustomInstance&& other)
+       : CustomInstance()
+{
+       this->swap(other);
+}
+
+CustomInstance::~CustomInstance ()
+{
+       collectMessages();
+}
+
+CustomInstance&        CustomInstance::operator= (CustomInstance&& other)
+{
+       CustomInstance destroyer;
+       destroyer.swap(other);
+       this->swap(destroyer);
+       return *this;
+}
+
+void CustomInstance::swap (CustomInstance& other)
+{
+       std::swap(m_context, other.m_context);
+       Move<VkInstance> aux = m_instance; m_instance = other.m_instance; other.m_instance = aux;
+       m_driver.swap(other.m_driver);
+       m_recorder.swap(other.m_recorder);
+}
+
+CustomInstance::operator VkInstance () const
+{
+       return *m_instance;
+}
+
+const vk::InstanceDriver& CustomInstance::getDriver() const
+{
+       return *m_driver;
+}
+
+void CustomInstance::collectMessages ()
+{
+       if (m_recorder)
+               collectAndReportDebugMessages(*m_recorder, *m_context);
+}
+
+UncheckedInstance::UncheckedInstance ()
+       : m_context             (nullptr)
+       , m_allocator   (nullptr)
+       , m_instance    (DE_NULL)
+       , m_driver              (nullptr)
+       , m_recorder    (nullptr)
+{
+}
+
+UncheckedInstance::UncheckedInstance (Context& context, vk::VkInstance instance, const vk::VkAllocationCallbacks* pAllocator, bool enableDebugReportRecorder)
+       : m_context             (&context)
+       , m_allocator   (pAllocator)
+       , m_instance    (instance)
+       , m_driver              ((m_instance != DE_NULL) ? new InstanceDriver(context.getPlatformInterface(), m_instance) : nullptr)
+       , m_recorder    ((enableDebugReportRecorder && m_instance != DE_NULL) ? (new DebugReportRecorder(*m_driver, m_instance)) : nullptr)
+{
+}
+
+UncheckedInstance::~UncheckedInstance ()
+{
+       if (m_recorder)
+               collectAndReportDebugMessages(*m_recorder, *m_context);
+
+       if (m_instance != DE_NULL)
+       {
+               m_recorder.reset(nullptr);
+               m_driver->destroyInstance(m_instance, m_allocator);
+       }
+}
+
+void UncheckedInstance::swap (UncheckedInstance& other)
+{
+       std::swap(m_context, other.m_context);
+       std::swap(m_allocator, other.m_allocator);
+       vk::VkInstance aux = m_instance; m_instance = other.m_instance; other.m_instance = aux;
+       m_driver.swap(other.m_driver);
+       m_recorder.swap(other.m_recorder);
+}
+
+UncheckedInstance::UncheckedInstance (UncheckedInstance&& other)
+       : UncheckedInstance()
+{
+       this->swap(other);
+}
+
+UncheckedInstance& UncheckedInstance::operator= (UncheckedInstance&& other)
+{
+       UncheckedInstance destroyer;
+       destroyer.swap(other);
+       this->swap(destroyer);
+       return *this;
+}
+
+UncheckedInstance::operator vk::VkInstance () const
+{
+       return m_instance;
+}
+UncheckedInstance::operator bool () const
+{
+       return (m_instance != DE_NULL);
+}
+
+CustomInstance createCustomInstanceWithExtensions (Context& context, const std::vector<std::string>& extensions, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+       vector<const char*>     enabledLayers;
+       vector<string>          enabledLayersStr;
+       const bool                      validationEnabled = (context.getTestContext().getCommandLine().isValidationEnabled() && allowLayers);
+
+       if (validationEnabled)
+       {
+               enabledLayers = getValidationLayers(context.getPlatformInterface());
+               enabledLayersStr = vector<string>(begin(enabledLayers), end(enabledLayers));
+       }
+
+       // Filter extension list and throw NotSupported if a required extension is not supported.
+       const deUint32                                                                  apiVersion                      = context.getUsedApiVersion();
+       const vk::PlatformInterface&                                    vkp                                     = context.getPlatformInterface();
+       const std::vector<vk::VkExtensionProperties>    availableExtensions     = vk::enumerateInstanceExtensionProperties(vkp, DE_NULL);
+       vector<string>                                                                  extensionPtrs;
+
+       for (const auto& ext : extensions)
+       {
+               if (!vk::isInstanceExtensionSupported(apiVersion, availableExtensions, vk::RequiredExtension(ext)))
+                       TCU_THROW(NotSupportedError, ext + " is not supported");
+
+               if (!vk::isCoreInstanceExtension(apiVersion, ext))
+                       extensionPtrs.push_back(ext);
+       }
+
+       Move<VkInstance> instance = vk::createDefaultInstance(vkp, apiVersion, enabledLayersStr, extensionPtrs, pAllocator);
+       return CustomInstance(context, instance, validationEnabled);
+}
+
+CustomInstance createCustomInstanceWithExtension (Context& context, const std::string& extension, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+       return createCustomInstanceWithExtensions(context, std::vector<std::string>(1, extension), pAllocator, allowLayers);
+}
+
+CustomInstance createCustomInstanceFromContext (Context& context, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+       return createCustomInstanceWithExtensions(context, std::vector<std::string>(), pAllocator, allowLayers);
+}
+
+const char kDebugReportExt[] = "VK_EXT_debug_report";
+
+vector<const char*> addDebugReportExt(const vk::PlatformInterface& vkp, const vk::VkInstanceCreateInfo& createInfo)
+{
+       if (!isDebugReportSupported(vkp))
+               TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
+
+       vector<const char*> actualExtensions;
+       if (createInfo.enabledExtensionCount != 0u)
+       {
+               for (deUint32 i = 0u; i < createInfo.enabledExtensionCount; ++i)
+                       actualExtensions.push_back(createInfo.ppEnabledExtensionNames[i]);
+       }
+
+       if (std::find_if(begin(actualExtensions), end(actualExtensions), [](const char* name) { return (strcmp(name, kDebugReportExt) == 0); })
+               == end(actualExtensions))
+       {
+               actualExtensions.push_back(kDebugReportExt);
+       }
+
+       return actualExtensions;
+}
+
+CustomInstance createCustomInstanceFromInfo (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, bool allowLayers)
+{
+       vector<const char*>                             enabledLayers;
+       vector<const char*>                             enabledExtensions;
+       vk::VkInstanceCreateInfo                createInfo                      = *instanceCreateInfo;
+       const bool                                              validationEnabled       = context.getTestContext().getCommandLine().isValidationEnabled();
+       const vk::PlatformInterface&    vkp                                     = context.getPlatformInterface();
+
+       if (validationEnabled && allowLayers)
+       {
+               // Activate some layers if requested.
+               if (createInfo.enabledLayerCount == 0u)
+               {
+                       enabledLayers = getValidationLayers(vkp);
+                       createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+                       createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+               }
+
+               // Make sure the debug report extension is enabled when validation is enabled.
+               enabledExtensions = addDebugReportExt(vkp, createInfo);
+               createInfo.enabledExtensionCount = static_cast<deUint32>(enabledExtensions.size());
+               createInfo.ppEnabledExtensionNames = enabledExtensions.data();
+       }
+
+       return CustomInstance(context, vk::createInstance(vkp, &createInfo, pAllocator), validationEnabled);
+}
+
+vk::VkResult createUncheckedInstance (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, UncheckedInstance* instance, bool allowLayers)
+{
+       vector<const char*>                             enabledLayers;
+       vector<const char*>                             enabledExtensions;
+       vk::VkInstanceCreateInfo                createInfo                      = *instanceCreateInfo;
+       const bool                                              validationEnabled       = context.getTestContext().getCommandLine().isValidationEnabled();
+       const vk::PlatformInterface&    vkp                                     = context.getPlatformInterface();
+       const bool                                              addLayers                       = (validationEnabled && allowLayers);
+
+       if (addLayers)
+       {
+               // Activate some layers if requested.
+               if (createInfo.enabledLayerCount == 0u)
+               {
+                       enabledLayers = getValidationLayers(vkp);
+                       createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+                       createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+               }
+
+               // Make sure the debug report extension is enabled when validation is enabled.
+               enabledExtensions = addDebugReportExt(vkp, createInfo);
+               createInfo.enabledExtensionCount = static_cast<deUint32>(enabledExtensions.size());
+               createInfo.ppEnabledExtensionNames = enabledExtensions.data();
+       }
+
+       vk::VkInstance  raw_instance = DE_NULL;
+       vk::VkResult    result = vkp.createInstance(&createInfo, pAllocator, &raw_instance);
+       *instance = UncheckedInstance(context, raw_instance, pAllocator, addLayers);
+       return result;
+}
+
+vk::Move<vk::VkDevice> createCustomDevice (bool validationEnabled, const vk::PlatformInterface& vkp, vk::VkInstance instance, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator)
+{
+       vector<const char*>             enabledLayers;
+       vk::VkDeviceCreateInfo  createInfo              = *pCreateInfo;
+
+       if (createInfo.enabledLayerCount == 0u && validationEnabled)
+       {
+               enabledLayers = getValidationLayers(vki, physicalDevice);
+               createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+               createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+       }
+
+       return createDevice(vkp, instance, vki, physicalDevice, &createInfo, pAllocator);
+}
+
+vk::VkResult createUncheckedDevice (bool validationEnabled, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator, vk::VkDevice* pDevice)
+{
+       vector<const char*>             enabledLayers;
+       vk::VkDeviceCreateInfo  createInfo              = *pCreateInfo;
+
+       if (createInfo.enabledLayerCount == 0u && validationEnabled)
+       {
+               enabledLayers = getValidationLayers(vki, physicalDevice);
+               createInfo.enabledLayerCount = static_cast<deUint32>(enabledLayers.size());
+               createInfo.ppEnabledLayerNames = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
+       }
+
+       return vki.createDevice(physicalDevice, &createInfo, pAllocator, pDevice);
+}
+
+
+}
diff --git a/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp b/external/vulkancts/modules/vulkan/vktCustomInstancesDevices.hpp
new file mode 100644 (file)
index 0000000..1b798d5
--- /dev/null
@@ -0,0 +1,119 @@
+#ifndef _VKTCUSTOMINSTANCESDEVICES_HPP
+#define _VKTCUSTOMINSTANCESDEVICES_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2019 Valve Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Auxiliar functions to help create custom devices and instances.
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+
+#include <vector>
+#include <memory>
+
+namespace vk
+{
+       class PlatformInterface;
+       class InstanceInterface;
+}
+
+namespace tcu
+{
+       class CommandLine;
+}
+
+namespace vkt
+{
+
+std::vector<const char*> getValidationLayers (const vk::PlatformInterface& vkp);
+
+std::vector<const char*> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice);
+
+class CustomInstance
+{
+public:
+                                                               CustomInstance                  ();
+                                                               CustomInstance                  (Context& context, vk::Move<vk::VkInstance> instance, bool enableDebugReportRecorder);
+                                                               CustomInstance                  (CustomInstance&& other);
+                                                               ~CustomInstance                 ();
+       CustomInstance&                         operator=                               (CustomInstance&& other);
+                                                               operator vk::VkInstance () const;
+       void                                            swap                                    (CustomInstance& other);
+       const vk::InstanceDriver&       getDriver                               () const;
+       void                                            collectMessages                 ();
+
+                                                               CustomInstance                  (const CustomInstance& other) = delete;
+       CustomInstance&                         operator=                               (const CustomInstance& other) = delete;
+private:
+       Context*                                                                        m_context;
+       vk::Move<vk::VkInstance>                                        m_instance;
+       std::unique_ptr<vk::InstanceDriver>                     m_driver;
+       std::unique_ptr<vk::DebugReportRecorder>        m_recorder;
+};
+
+class UncheckedInstance
+{
+public:
+                                               UncheckedInstance               ();
+                                               UncheckedInstance               (Context& context, vk::VkInstance instance, const vk::VkAllocationCallbacks* pAllocator, bool enableDebugReportRecorder);
+                                               UncheckedInstance               (UncheckedInstance&& other);
+                                               ~UncheckedInstance              ();
+       UncheckedInstance&      operator=                               (UncheckedInstance&& other);
+                                               operator vk::VkInstance () const;
+                                               operator bool                   () const;
+       void                            swap                                    (UncheckedInstance& other);
+
+                                               UncheckedInstance               (const UncheckedInstance& other) = delete;
+       UncheckedInstance&      operator=                               (const UncheckedInstance& other) = delete;
+private:
+       Context*                                                                        m_context;
+       const vk::VkAllocationCallbacks*                        m_allocator;
+       vk::VkInstance                                                          m_instance;
+       std::unique_ptr<vk::InstanceDriver>                     m_driver;
+       std::unique_ptr<vk::DebugReportRecorder>        m_recorder;
+};
+
+// Custom instances.
+
+CustomInstance createCustomInstanceWithExtensions (Context& context, const std::vector<std::string>& extension, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceWithExtension (Context& context, const std::string& extension, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceFromContext (Context& context, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+CustomInstance createCustomInstanceFromInfo (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator = DE_NULL, bool allowLayers = true);
+
+// Unchecked instance: creation allowed to fail.
+
+vk::VkResult createUncheckedInstance (Context& context, const vk::VkInstanceCreateInfo* instanceCreateInfo, const vk::VkAllocationCallbacks* pAllocator, UncheckedInstance* instance, bool allowLayers = true);
+
+// Custom devices.
+
+vk::Move<vk::VkDevice> createCustomDevice (bool validationEnabled, const vk::PlatformInterface& vkp, vk::VkInstance instance, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator = DE_NULL);
+
+// Unchecked device: creation allowed to fail.
+
+vk::VkResult createUncheckedDevice (bool validationEnabled, const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, const vk::VkDeviceCreateInfo* pCreateInfo, const vk::VkAllocationCallbacks* pAllocator, vk::VkDevice* pDevice);
+
+}
+
+#endif // _VKTCUSTOMINSTANCESDEVICES_HPP
index 259f940..7173467 100644 (file)
@@ -22,6 +22,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkRef.hpp"
 #include "vkRefUtil.hpp"
@@ -54,37 +55,6 @@ using namespace vk;
 namespace
 {
 
-vector<string> getValidationLayers (const vector<VkLayerProperties>& supportedLayers)
-{
-       static const char*      s_magicLayer            = "VK_LAYER_LUNARG_standard_validation";
-       static const char*      s_defaultLayers[]       =
-       {
-               "VK_LAYER_GOOGLE_threading",
-               "VK_LAYER_LUNARG_parameter_validation",
-               "VK_LAYER_LUNARG_device_limits",
-               "VK_LAYER_LUNARG_object_tracker",
-               "VK_LAYER_LUNARG_image",
-               "VK_LAYER_LUNARG_core_validation",
-               "VK_LAYER_LUNARG_swapchain",
-               "VK_LAYER_GOOGLE_unique_objects"
-       };
-
-       vector<string>          enabledLayers;
-
-       if (isLayerSupported(supportedLayers, RequiredLayer(s_magicLayer)))
-               enabledLayers.push_back(s_magicLayer);
-       else
-       {
-               for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_defaultLayers); ++ndx)
-               {
-                       if (isLayerSupported(supportedLayers, RequiredLayer(s_defaultLayers[ndx])))
-                               enabledLayers.push_back(s_defaultLayers[ndx]);
-               }
-       }
-
-       return enabledLayers;
-}
-
 vector<string> filterExtensions (const vector<VkExtensionProperties>& extensions)
 {
        vector<string>  enabledExtensions;
@@ -184,7 +154,7 @@ std::pair<deUint32, deUint32> determineDeviceVersions(const PlatformInterface& v
 Move<VkInstance> createInstance (const PlatformInterface& vkp, deUint32 apiVersion, const vector<string>& enabledExtensions, const tcu::CommandLine& cmdLine)
 {
        const bool                                                              isValidationEnabled     = cmdLine.isValidationEnabled();
-       vector<string>                                                  enabledLayers;
+       vector<const char*>                                             enabledLayers;
 
        // \note Extensions in core are not explicitly enabled even though
        //               they are in the extension list advertised to tests.
@@ -202,7 +172,7 @@ Move<VkInstance> createInstance (const PlatformInterface& vkp, deUint32 apiVersi
                        TCU_THROW(NotSupportedError, "No validation layers found");
        }
 
-       return createDefaultInstance(vkp, apiVersion, enabledLayers, nonCoreExtensions);
+       return createDefaultInstance(vkp, apiVersion, vector<string>(begin(enabledLayers), end(enabledLayers)), nonCoreExtensions);
 }
 
 static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
@@ -231,8 +201,7 @@ Move<VkDevice> createDefaultDevice (const PlatformInterface&                        vkp,
 {
        VkDeviceQueueCreateInfo         queueInfo[2];
        VkDeviceCreateInfo                      deviceInfo;
-       vector<string>                          enabledLayers;
-       vector<const char*>                     layerPtrs;
+       vector<const char*>                     enabledLayers;
        vector<const char*>                     extensionPtrs;
        const float                                     queuePriority   = 1.0f;
        const deUint32                          numQueues = (enabledFeatures.features.sparseBinding && (queueIndex != sparseQueueIndex)) ? 2 : 1;
@@ -247,11 +216,6 @@ Move<VkDevice> createDefaultDevice (const PlatformInterface&                       vkp,
                        TCU_THROW(NotSupportedError, "No validation layers found");
        }
 
-       layerPtrs.resize(enabledLayers.size());
-
-       for (size_t ndx = 0; ndx < enabledLayers.size(); ++ndx)
-               layerPtrs[ndx] = enabledLayers[ndx].c_str();
-
        // \note Extensions in core are not explicitly enabled even though
        //               they are in the extension list advertised to tests.
        vector<const char*> coreExtensions;
@@ -287,8 +251,8 @@ Move<VkDevice> createDefaultDevice (const PlatformInterface&                        vkp,
        deviceInfo.pQueueCreateInfos                    = queueInfo;
        deviceInfo.enabledExtensionCount                = (deUint32)extensionPtrs.size();
        deviceInfo.ppEnabledExtensionNames              = (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]);
-       deviceInfo.enabledLayerCount                    = (deUint32)layerPtrs.size();
-       deviceInfo.ppEnabledLayerNames                  = (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]);
+       deviceInfo.enabledLayerCount                    = (deUint32)enabledLayers.size();
+       deviceInfo.ppEnabledLayerNames                  = (enabledLayers.empty() ? DE_NULL : enabledLayers.data());
        deviceInfo.pEnabledFeatures                             = enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features;
 
        return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
@@ -296,16 +260,6 @@ Move<VkDevice> createDefaultDevice (const PlatformInterface&                       vkp,
 
 } // anonymous
 
-vector<string> getValidationLayers (const PlatformInterface& vkp)
-{
-       return getValidationLayers(enumerateInstanceLayerProperties(vkp));
-}
-
-vector<string> getValidationLayers (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
-{
-       return getValidationLayers(enumerateDeviceLayerProperties(vki, physicalDevice));
-}
-
 class DefaultDevice
 {
 public:
@@ -431,11 +385,12 @@ vk::Allocator* createAllocator (DefaultDevice* device)
 Context::Context (tcu::TestContext&                            testCtx,
                                  const vk::PlatformInterface&  platformInterface,
                                  vk::BinaryCollection&                 progCollection)
-       : m_testCtx                             (testCtx)
-       , m_platformInterface   (platformInterface)
-       , m_progCollection              (progCollection)
-       , m_device                              (new DefaultDevice(m_platformInterface, testCtx.getCommandLine()))
-       , m_allocator                   (createAllocator(m_device.get()))
+       : m_testCtx                                     (testCtx)
+       , m_platformInterface           (platformInterface)
+       , m_progCollection                      (progCollection)
+       , m_device                                      (new DefaultDevice(m_platformInterface, testCtx.getCommandLine()))
+       , m_allocator                           (createAllocator(m_device.get()))
+       , m_resultSetOnValidation       (false)
 {
 }
 
@@ -629,4 +584,42 @@ void TestCase::delayedInit (void)
 {
 }
 
+void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context& context)
+{
+       // \note We are not logging INFORMATION and DEBUG messages
+       static const vk::VkDebugReportFlagsEXT                  errorFlags              = vk::VK_DEBUG_REPORT_ERROR_BIT_EXT;
+       static const vk::VkDebugReportFlagsEXT                  logFlags                = errorFlags
+                                                                                                                                       | vk::VK_DEBUG_REPORT_WARNING_BIT_EXT
+                                                                                                                                       | vk::VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
+
+       typedef vk::DebugReportRecorder::MessageList    DebugMessages;
+
+       const DebugMessages&    messages        = debugReportRecorder.getMessages();
+       tcu::TestLog&                   log                     = context.getTestContext().getLog();
+
+       if (messages.begin() != messages.end())
+       {
+               const tcu::ScopedLogSection     section         (log, "DebugMessages", "Debug Messages");
+               int                                                     numErrors       = 0;
+
+               for (DebugMessages::const_iterator curMsg = messages.begin(); curMsg != messages.end(); ++curMsg)
+               {
+                       if ((curMsg->flags & logFlags) != 0)
+                               log << tcu::TestLog::Message << *curMsg << tcu::TestLog::EndMessage;
+
+                       if ((curMsg->flags & errorFlags) != 0)
+                               numErrors += 1;
+               }
+
+               debugReportRecorder.clearMessages();
+
+               if (numErrors > 0)
+               {
+                       string errorMsg = de::toString(numErrors) + " API usage errors found";
+                       context.resultSetOnValidation(true);
+                       context.getTestContext().setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, errorMsg.c_str());
+               }
+       }
+}
+
 } // vkt
index 77745a2..0f20aae 100644 (file)
@@ -29,6 +29,8 @@
 #include "deUniquePtr.hpp"
 #include "vkPrograms.hpp"
 #include "vkApiVersion.hpp"
+#include "vkDebugReportUtil.hpp"
+#include "vkPlatform.hpp"
 #include "vktTestCaseDefs.hpp"
 #include <vector>
 #include <string>
@@ -48,10 +50,6 @@ struct SourceCollections;
 namespace vkt
 {
 
-std::vector<std::string> getValidationLayers (const vk::PlatformInterface& vkp);
-
-std::vector<std::string> getValidationLayers (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice);
-
 class DefaultDevice;
 
 class Context
@@ -110,6 +108,9 @@ public:
        bool                                                                            isBufferDeviceAddressWithCaptureReplaySupported         (void) const;
        bool                                                                            isDescriptorIndexingSupported                                           (void) const;
 
+       bool                                                                            resultSetOnValidation                   () const                { return m_resultSetOnValidation;       }
+       void                                                                            resultSetOnValidation                   (bool value)    { m_resultSetOnValidation = value;      }
+
 protected:
        tcu::TestContext&                                                       m_testCtx;
        const vk::PlatformInterface&                            m_platformInterface;
@@ -118,6 +119,8 @@ protected:
        const de::UniquePtr<DefaultDevice>                      m_device;
        const de::UniquePtr<vk::Allocator>                      m_allocator;
 
+       bool                                                                            m_resultSetOnValidation;
+
 private:
                                                                                                Context                                                 (const Context&); // Not allowed
        Context&                                                                        operator=                                               (const Context&); // Not allowed
@@ -166,6 +169,8 @@ inline TestCase::TestCase (tcu::TestContext& testCtx, tcu::TestNodeType type, co
 {
 }
 
+void collectAndReportDebugMessages(vk::DebugReportRecorder &debugReportRecorder, Context& context);
+
 } // vkt
 
 #endif // _VKTTESTCASE_HPP
index 4f7ad7e..4fa0f58 100644 (file)
@@ -324,6 +324,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat
 
        DE_ASSERT(!m_instance);
        m_instance = vktCase->createInstance(m_context);
+       m_context.resultSetOnValidation(false);
 }
 
 void TestCaseExecutor::deinit (tcu::TestCase*)
@@ -335,38 +336,7 @@ void TestCaseExecutor::deinit (tcu::TestCase*)
 
        // Collect and report any debug messages
        if (m_debugReportRecorder)
-       {
-               // \note We are not logging INFORMATION and DEBUG messages
-               static const vk::VkDebugReportFlagsEXT                  errorFlags              = vk::VK_DEBUG_REPORT_ERROR_BIT_EXT;
-               static const vk::VkDebugReportFlagsEXT                  logFlags                = errorFlags
-                                                                                                                                               | vk::VK_DEBUG_REPORT_WARNING_BIT_EXT
-                                                                                                                                               | vk::VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
-
-               typedef vk::DebugReportRecorder::MessageList    DebugMessages;
-
-               const DebugMessages&    messages        = m_debugReportRecorder->getMessages();
-               tcu::TestLog&                   log                     = m_context.getTestContext().getLog();
-
-               if (messages.begin() != messages.end())
-               {
-                       const tcu::ScopedLogSection     section         (log, "DebugMessages", "Debug Messages");
-                       int                                                     numErrors       = 0;
-
-                       for (DebugMessages::const_iterator curMsg = messages.begin(); curMsg != messages.end(); ++curMsg)
-                       {
-                               if ((curMsg->flags & logFlags) != 0)
-                                       log << tcu::TestLog::Message << *curMsg << tcu::TestLog::EndMessage;
-
-                               if ((curMsg->flags & errorFlags) != 0)
-                                       numErrors += 1;
-                       }
-
-                       m_debugReportRecorder->clearMessages();
-
-                       if (numErrors > 0)
-                               m_context.getTestContext().setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, (de::toString(numErrors) + " API usage errors found").c_str());
-               }
-       }
+               collectAndReportDebugMessages(*m_debugReportRecorder, m_context);
 }
 
 tcu::TestNode::IterateResult TestCaseExecutor::iterate (tcu::TestCase*)
@@ -377,9 +347,12 @@ tcu::TestNode::IterateResult TestCaseExecutor::iterate (tcu::TestCase*)
 
        if (result.isComplete())
        {
-               // Vulkan tests shouldn't set result directly
-               DE_ASSERT(m_context.getTestContext().getTestResult() == QP_TEST_RESULT_LAST);
-               m_context.getTestContext().setTestResult(result.getCode(), result.getDescription().c_str());
+               // Vulkan tests shouldn't set result directly except when using a debug report messenger to catch validation errors.
+               DE_ASSERT(m_context.getTestContext().getTestResult() == QP_TEST_RESULT_LAST || m_context.resultSetOnValidation());
+
+               // Override result if not set previously by a debug report messenger.
+               if (!m_context.resultSetOnValidation())
+                       m_context.getTestContext().setTestResult(result.getCode(), result.getDescription().c_str());
                return tcu::TestNode::STOP;
        }
        else
index 8a7b25f..2ff94a3 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -47,6 +48,7 @@
 #include "tcuFormatUtil.hpp"
 #include "tcuPlatform.hpp"
 #include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deUniquePtr.hpp"
 #include "deStringUtil.hpp"
@@ -89,11 +91,10 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface&               vkp,
-                                                                               deUint32                                                version,
-                                                                               const Extensions&                               supportedExtensions,
-                                                                               Type                                                    wsiType,
-                                                                               const VkAllocationCallbacks*    pAllocator      = DE_NULL)
+CustomInstance createInstanceWithWsi (Context&                                         context,
+                                                                         const Extensions&                             supportedExtensions,
+                                                                         Type                                                  wsiType,
+                                                                         const VkAllocationCallbacks*  pAllocator      = DE_NULL)
 {
        vector<string>  extensions;
 
@@ -115,7 +116,7 @@ Move<VkInstance> createInstanceWithWsi (const PlatformInterface&            vkp,
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+       return createCustomInstanceWithExtensions(context, extensions, pAllocator);
 }
 
 VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void)
@@ -131,7 +132,8 @@ Move<VkDevice> createDeviceWithWsi (const vk::PlatformInterface&    vkp,
                                                                        VkPhysicalDevice                                physicalDevice,
                                                                        const Extensions&                               supportedExtensions,
                                                                        const deUint32                                  queueFamilyIndex,
-                                                                       const VkAllocationCallbacks*    pAllocator = DE_NULL)
+                                                                       const VkAllocationCallbacks*    pAllocator,
+                                                                       bool                                                    validationEnabled)
 {
        const float                                             queuePriorities[]       = { 1.0f };
        const VkDeviceQueueCreateInfo   queueInfos[]            =
@@ -155,7 +157,7 @@ Move<VkDevice> createDeviceWithWsi (const vk::PlatformInterface&    vkp,
        if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_hdr_metadata")))
                extensions.push_back("VK_EXT_hdr_metadata");
 
-       const VkDeviceCreateInfo                deviceParams    =
+       VkDeviceCreateInfo              deviceParams    =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
                DE_NULL,
@@ -169,7 +171,7 @@ Move<VkDevice> createDeviceWithWsi (const vk::PlatformInterface&    vkp,
                &features
        };
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 deUint32 getNumQueueFamilyIndices (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
@@ -208,18 +210,17 @@ deUint32 chooseQueueFamilyIndex (const InstanceInterface& vki, VkPhysicalDevice
 struct InstanceHelper
 {
        const vector<VkExtensionProperties>     supportedExtensions;
-       const Unique<VkInstance>                        instance;
-       const InstanceDriver                            vki;
+       const CustomInstance                            instance;
+       const InstanceDriver&                           vki;
 
        InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions   (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                                                                                                                                          DE_NULL))
-               , instance                              (createInstanceWithWsi(context.getPlatformInterface(),
-                                                                                                          context.getUsedApiVersion(),
+               , instance                              (createInstanceWithWsi(context,
                                                                                                           supportedExtensions,
                                                                                                           wsiType,
                                                                                                           pAllocator))
-               , vki                                   (context.getPlatformInterface(), *instance)
+               , vki                                   (instance.getDriver())
        {}
 };
 
@@ -244,7 +245,8 @@ struct DeviceHelper
                                                                                                 physicalDevice,
                                                                                                 enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
                                                                                                 queueFamilyIndex,
-                                                                                                pAllocator))
+                                                                                                pAllocator,
+                                                                                                context.getTestContext().getCommandLine().isValidationEnabled()))
                , vkd                           (context.getPlatformInterface(), instance, *device)
                , queue                         (getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
        {
@@ -797,8 +799,8 @@ tcu::TestStatus basicExtensionTest (Context& context, Type wsiType)
        const tcu::UVec2                                desiredSize             (256, 256);
        const InstanceHelper                    instHelper              (context, wsiType);
        const NativeObjects                             native                  (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper               (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper               (context, instHelper.vki, instHelper.instance, *surface);
 
        if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
                TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
@@ -831,7 +833,7 @@ tcu::TestStatus surfaceFormatRenderTest (Context& context,
 {
        const tcu::UVec2                                        desiredSize             (256, 256);
        const InstanceHelper                            instHelper              (context, wsiType);
-       const DeviceHelper                                      devHelper               (context, instHelper.vki, *instHelper.instance, surface);
+       const DeviceHelper                                      devHelper               (context, instHelper.vki, instHelper.instance, surface);
        const DeviceInterface&                          vkd                             = devHelper.vkd;
        const VkDevice                                          device                  = *devHelper.device;
        SimpleAllocator                                         allocator               (vkd, device, getPhysicalDeviceMemoryProperties(instHelper.vki, devHelper.physicalDevice));
@@ -971,8 +973,8 @@ tcu::TestStatus surfaceFormatRenderTests (Context& context, Type wsiType)
        const tcu::UVec2                                        desiredSize             (256, 256);
        const InstanceHelper                            instHelper              (context, wsiType);
        const NativeObjects                                     native                  (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>                      surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                                      devHelper               (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>                      surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                                      devHelper               (context, instHelper.vki, instHelper.instance, *surface);
 
        if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
                TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
@@ -992,8 +994,8 @@ tcu::TestStatus surfaceFormatRenderWithHdrTests (Context& context, Type wsiType)
        const tcu::UVec2                                        desiredSize             (256, 256);
        const InstanceHelper                            instHelper              (context, wsiType);
        const NativeObjects                                     native                  (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>                      surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                                      devHelper               (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>                      surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                                      devHelper               (context, instHelper.vki, instHelper.instance, *surface);
 
        if (!de::contains(context.getInstanceExtensions().begin(), context.getInstanceExtensions().end(), "VK_EXT_swapchain_colorspace"))
                TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
index d5da904..6d26419 100644 (file)
 #include "vktWsiDisplayTimingTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "tcuPlatform.hpp"
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deClock.h"
 
@@ -76,10 +78,9 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&           vkp,
-                                                                                               deUint32                                                        version,
-                                                                                               const Extensions&                                       supportedExtensions,
-                                                                                               vk::wsi::Type                                           wsiType)
+CustomInstance createInstanceWithWsi (Context&                                                 context,
+                                                                         const Extensions&                                     supportedExtensions,
+                                                                         vk::wsi::Type                                         wsiType)
 {
        vector<string>  extensions;
 
@@ -88,7 +89,7 @@ vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&          vk
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+       return vkt::createCustomInstanceWithExtensions(context, extensions);
 }
 
 vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -138,6 +139,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                                                                                        const Extensions&                                       supportedExtensions,
                                                                                        const deUint32                                          queueFamilyIndex,
                                                                                        bool                                                            requiresDisplayTiming,
+                                                                                       bool                                                            validationEnabled,
                                                                                        const vk::VkAllocationCallbacks*        pAllocator = DE_NULL)
 {
        const float                                                     queuePriorities[]       = { 1.0f };
@@ -179,7 +181,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                        TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
        }
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&       platform,
@@ -544,8 +546,8 @@ private:
        const deUint32                                                  m_quadCount;
        const vk::PlatformInterface&                    m_vkp;
        const Extensions                                                m_instanceExtensions;
-       const vk::Unique<vk::VkInstance>                m_instance;
-       const vk::InstanceDriver                                m_vki;
+       const CustomInstance                                    m_instance;
+       const vk::InstanceDriver&                               m_vki;
        const vk::VkPhysicalDevice                              m_physicalDevice;
        const de::UniquePtr<vk::wsi::Display>   m_nativeDisplay;
        const de::UniquePtr<vk::wsi::Window>    m_nativeWindow;
@@ -691,17 +693,17 @@ DisplayTimingTestInstance::DisplayTimingTestInstance (Context& context, const Te
        , m_quadCount                           (16u)
        , m_vkp                                         (context.getPlatformInterface())
        , m_instanceExtensions          (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                            (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
-       , m_vki                                         (m_vkp, *m_instance)
-       , m_physicalDevice                      (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                            (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+       , m_vki                                         (m_instance.getDriver())
+       , m_physicalDevice                      (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_nativeDisplay                       (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
        , m_nativeWindow                        (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
-       , m_surface                                     (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+       , m_surface                                     (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
 
        , m_queueFamilyIndex            (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
        , m_deviceExtensions            (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                                      (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useDisplayTiming))
-       , m_vkd                                         (m_vkp, *m_instance, *m_device)
+       , m_device                                      (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useDisplayTiming, context.getTestContext().getCommandLine().isValidationEnabled()))
+       , m_vkd                                         (m_vkp, m_instance, *m_device)
        , m_queue                                       (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
 
        , m_commandPool                         (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
index 2e378eb..54889e3 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vkRefUtil.hpp"
 #include "vkWsiPlatform.hpp"
 #include "vkWsiUtil.hpp"
@@ -41,6 +42,7 @@
 #include "tcuPlatform.hpp"
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 #include <vector>
 #include <string>
@@ -78,10 +80,9 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&           vkp,
-                                                                                               deUint32                                                        version,
-                                                                                               const Extensions&                                       supportedExtensions,
-                                                                                               vk::wsi::Type                                           wsiType)
+CustomInstance createInstanceWithWsi (Context&                                                 context,
+                                                                         const Extensions&                                     supportedExtensions,
+                                                                         vk::wsi::Type                                         wsiType)
 {
        vector<string>  extensions;
 
@@ -90,7 +91,7 @@ vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&          vk
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+       return vkt::createCustomInstanceWithExtensions(context, extensions);
 }
 
 vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -140,6 +141,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                                                                                        const Extensions&                                       supportedExtensions,
                                                                                        const deUint32                                          queueFamilyIndex,
                                                                                        bool                                                            requiresIncrementalPresent,
+                                                                                       bool                                                            validationEnabled,
                                                                                        const vk::VkAllocationCallbacks*        pAllocator = DE_NULL)
 {
        const float                                                     queuePriorities[]       = { 1.0f };
@@ -181,7 +183,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                        TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
        }
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&       platform,
@@ -654,8 +656,8 @@ private:
        const bool                                                                              m_useIncrementalPresent;
        const vk::PlatformInterface&                                    m_vkp;
        const Extensions                                                                m_instanceExtensions;
-       const vk::Unique<vk::VkInstance>                                m_instance;
-       const vk::InstanceDriver                                                m_vki;
+       const CustomInstance                                                    m_instance;
+       const vk::InstanceDriver&                                               m_vki;
        const vk::VkPhysicalDevice                                              m_physicalDevice;
        const de::UniquePtr<vk::wsi::Display>                   m_nativeDisplay;
        const de::UniquePtr<vk::wsi::Window>                    m_nativeWindow;
@@ -830,17 +832,17 @@ IncrementalPresentTestInstance::IncrementalPresentTestInstance (Context& context
        , m_useIncrementalPresent       (testConfig.useIncrementalPresent)
        , m_vkp                                         (context.getPlatformInterface())
        , m_instanceExtensions          (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                            (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
-       , m_vki                                         (m_vkp, *m_instance)
-       , m_physicalDevice                      (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                            (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+       , m_vki                                         (m_instance.getDriver())
+       , m_physicalDevice                      (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_nativeDisplay                       (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
        , m_nativeWindow                        (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
-       , m_surface                                     (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+       , m_surface                                     (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
 
        , m_queueFamilyIndex            (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
        , m_deviceExtensions            (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                                      (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useIncrementalPresent))
-       , m_vkd                                         (m_vkp, *m_instance, *m_device)
+       , m_device                                      (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useIncrementalPresent, context.getTestContext().getCommandLine().isValidationEnabled()))
+       , m_vkd                                         (m_vkp, m_instance, *m_device)
        , m_queue                                       (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
 
        , m_commandPool                         (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
index 1241b0f..48e990b 100644 (file)
@@ -22,6 +22,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktWsiSharedPresentableImageTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
@@ -41,6 +42,7 @@
 #include "tcuPlatform.hpp"
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 #include <vector>
 #include <string>
@@ -78,11 +80,11 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&           vkp,
-                                                                                               deUint32                                                        version,
-                                                                                               const Extensions&                                       supportedExtensions,
-                                                                                               vk::wsi::Type                                           wsiType)
+CustomInstance createInstanceWithWsi (Context&                                                 context,
+                                                                         const Extensions&                                     supportedExtensions,
+                                                                         vk::wsi::Type                                         wsiType)
 {
+       const deUint32  version = context.getUsedApiVersion();
        vector<string>  extensions;
 
        if (!vk::isCoreInstanceExtension(version, "VK_KHR_get_physical_device_properties2"))
@@ -96,7 +98,7 @@ vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&          vk
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), extensions);
+       return vkt::createCustomInstanceWithExtensions(context, extensions);
 }
 
 vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
@@ -146,6 +148,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                                                                                        const Extensions&                                       supportedExtensions,
                                                                                        const deUint32                                          queueFamilyIndex,
                                                                                        bool                                                            requiresSharedPresentableImage,
+                                                                                       bool                                                            validationEnabled,
                                                                                        const vk::VkAllocationCallbacks*        pAllocator = DE_NULL)
 {
        const float                                                     queuePriorities[]       = { 1.0f };
@@ -187,7 +190,7 @@ vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::PlatformInterface&            vkp,
                        TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
        }
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&       platform,
@@ -567,8 +570,8 @@ private:
        const deUint32                                                                  m_quadCount;
        const vk::PlatformInterface&                                    m_vkp;
        const Extensions                                                                m_instanceExtensions;
-       const vk::Unique<vk::VkInstance>                                m_instance;
-       const vk::InstanceDriver                                                m_vki;
+       const CustomInstance                                                    m_instance;
+       const vk::InstanceDriver&                                               m_vki;
        const vk::VkPhysicalDevice                                              m_physicalDevice;
        const de::UniquePtr<vk::wsi::Display>                   m_nativeDisplay;
        const de::UniquePtr<vk::wsi::Window>                    m_nativeWindow;
@@ -741,17 +744,17 @@ SharedPresentableImageTestInstance::SharedPresentableImageTestInstance (Context&
        , m_quadCount                           (16u)
        , m_vkp                                         (context.getPlatformInterface())
        , m_instanceExtensions          (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
-       , m_instance                            (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType))
-       , m_vki                                         (m_vkp, *m_instance)
-       , m_physicalDevice                      (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+       , m_instance                            (createInstanceWithWsi(context, m_instanceExtensions, testConfig.wsiType))
+       , m_vki                                         (m_instance.getDriver())
+       , m_physicalDevice                      (vk::chooseDevice(m_vki, m_instance, context.getTestContext().getCommandLine()))
        , m_nativeDisplay                       (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
        , m_nativeWindow                        (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
-       , m_surface                                     (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+       , m_surface                                     (vk::wsi::createSurface(m_vki, m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
 
        , m_queueFamilyIndex            (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
        , m_deviceExtensions            (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
-       , m_device                                      (createDeviceWithWsi(m_vkp, *m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useSharedPresentableImage))
-       , m_vkd                                         (m_vkp, *m_instance, *m_device)
+       , m_device                                      (createDeviceWithWsi(m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useSharedPresentableImage, context.getTestContext().getCommandLine().isValidationEnabled()))
+       , m_vkd                                         (m_vkp, m_instance, *m_device)
        , m_queue                                       (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
 
        , m_commandPool                         (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
index f53ae27..c5fe166 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -169,14 +170,14 @@ struct CheckPhysicalDeviceSurfacePresentModesIncompleteResult : public CheckInco
 
 typedef vector<VkExtensionProperties> Extensions;
 
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface&               vkp,
-                                                                               deUint32                                                version,
-                                                                               const Extensions&                               supportedExtensions,
-                                                                               Type                                                    wsiType,
-                                                                               const vector<string>                    extraExtensions,
-                                                                               const VkAllocationCallbacks*    pAllocator      = DE_NULL)
+CustomInstance createInstanceWithWsi (Context&                                         context,
+                                                                         const Extensions&                             supportedExtensions,
+                                                                         Type                                                  wsiType,
+                                                                         const vector<string>                  extraExtensions,
+                                                                         const VkAllocationCallbacks*  pAllocator      = DE_NULL)
 {
-       vector<string>  extensions = extraExtensions;
+       const deUint32  version         = context.getUsedApiVersion();
+       vector<string>  extensions      = extraExtensions;
 
        extensions.push_back("VK_KHR_surface");
        extensions.push_back(getExtensionName(wsiType));
@@ -194,37 +195,35 @@ Move<VkInstance> createInstanceWithWsi (const PlatformInterface&          vkp,
                        instanceExtensions.push_back(*extensionName);
        }
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), instanceExtensions, pAllocator);
+       return vkt::createCustomInstanceWithExtensions(context, instanceExtensions, pAllocator);
 }
 
 struct InstanceHelper
 {
        const vector<VkExtensionProperties>     supportedExtensions;
-       Unique<VkInstance>                                      instance;
-       const InstanceDriver                            vki;
+       CustomInstance                                          instance;
+       const InstanceDriver&                           vki;
 
        InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions   (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                                                                                                                                          DE_NULL))
-               , instance                              (createInstanceWithWsi(context.getPlatformInterface(),
-                                                                                                          context.getUsedApiVersion(),
+               , instance                              (createInstanceWithWsi(context,
                                                                                                           supportedExtensions,
                                                                                                           wsiType,
                                                                                                           vector<string>(),
                                                                                                           pAllocator))
-               , vki                                   (context.getPlatformInterface(), *instance)
+               , vki                                   (instance.getDriver())
        {}
 
        InstanceHelper (Context& context, Type wsiType, const vector<string>& extensions, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions   (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                                                                                                                                          DE_NULL))
-               , instance                              (createInstanceWithWsi(context.getPlatformInterface(),
-                                                                                                          context.getUsedApiVersion(),
+               , instance                              (createInstanceWithWsi(context,
                                                                                                           supportedExtensions,
                                                                                                           wsiType,
                                                                                                           extensions,
                                                                                                           pAllocator))
-               , vki                                   (context.getPlatformInterface(), *instance)
+               , vki                                   (instance.getDriver())
        {}
 };
 
@@ -282,7 +281,7 @@ tcu::TestStatus createSurfaceTest (Context& context, Type wsiType)
 {
        const InstanceHelper            instHelper      (context, wsiType);
        const NativeObjects                     native          (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+       const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
 
        return tcu::TestStatus::pass("Creating surface succeeded");
 }
@@ -296,7 +295,7 @@ tcu::TestStatus createSurfaceCustomAllocatorTest (Context& context, Type wsiType
                const InstanceHelper            instHelper      (context, wsiType, allocationRecorder.getCallbacks());
                const NativeObjects                     native          (context, instHelper.supportedExtensions, wsiType);
                const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki,
-                                                                                                                          *instHelper.instance,
+                                                                                                                          instHelper.instance,
                                                                                                                           wsiType,
                                                                                                                           *native.display,
                                                                                                                           *native.window,
@@ -342,7 +341,7 @@ tcu::TestStatus createSurfaceSimulateOOMTest (Context& context, Type wsiType)
 
                        const NativeObjects                     native          (context, instHelper.supportedExtensions, wsiType);
                        const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki,
-                                                                                                                                  *instHelper.instance,
+                                                                                                                                  instHelper.instance,
                                                                                                                                   wsiType,
                                                                                                                                   *native.display,
                                                                                                                                   *native.window,
@@ -393,8 +392,8 @@ tcu::TestStatus querySurfaceSupportTest (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper                              (context, wsiType);
        const NativeObjects                             native                                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        // On Android surface must be supported by all devices and queue families
        const bool                                              expectSupportedOnAll    = wsiType == TYPE_ANDROID;
@@ -488,8 +487,8 @@ tcu::TestStatus querySurfaceCapabilitiesTest (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper                              (context, wsiType);
        const NativeObjects                             native                                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -516,8 +515,8 @@ tcu::TestStatus querySurfaceCapabilities2Test (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper                              (context, wsiType, vector<string>(1, string("VK_KHR_get_surface_capabilities2")));
        const NativeObjects                             native                                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices                 = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -577,8 +576,8 @@ tcu::TestStatus querySurfaceProtectedCapabilitiesTest (Context& context, Type ws
        requiredExtensions.push_back("VK_KHR_surface_protected_capabilities");
        const InstanceHelper            instHelper              (context, wsiType, requiredExtensions);
        const NativeObjects             native                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>      surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices         = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>      surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices         = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -670,8 +669,8 @@ tcu::TestStatus querySurfaceFormatsTest (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper              (context, wsiType);
        const NativeObjects                             native                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -716,8 +715,8 @@ tcu::TestStatus querySurfaceFormats2Test (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper              (context, wsiType, vector<string>(1, string("VK_KHR_get_surface_capabilities2")));
        const NativeObjects                             native                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -826,8 +825,8 @@ tcu::TestStatus querySurfacePresentModesTest (Context& context, Type wsiType)
 
        const InstanceHelper                    instHelper              (context, wsiType);
        const NativeObjects                             native                  (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
 
        for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
        {
@@ -879,7 +878,7 @@ tcu::TestStatus queryDevGroupSurfacePresentCapabilitiesTest (Context& context, T
        deUint8                                                                                 buffer                                  [sizeof(VkDeviceGroupPresentCapabilitiesKHR) + GUARD_SIZE];
        deUint32                                                                                queueFamilyIndex                = 0;
        VkDeviceGroupPresentCapabilitiesKHR*                    presentCapabilities;
-       VkPhysicalDevice                                                                physicalDevice                  = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+       VkPhysicalDevice                                                                physicalDevice                  = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
        const Extensions&                                                               supportedExtensions             = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
        std::vector<const char*>                                                deviceExtensions;
 
@@ -893,7 +892,7 @@ tcu::TestStatus queryDevGroupSurfacePresentCapabilitiesTest (Context& context, T
                        TCU_THROW(NotSupportedError, (string(deviceExtensions[ndx]) + " is not supported").c_str());
        }
 
-       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
 
        const std::vector<VkQueueFamilyProperties>              queueProps                              = getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
        for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
@@ -917,6 +916,7 @@ tcu::TestStatus queryDevGroupSurfacePresentCapabilitiesTest (Context& context, T
                deviceGroupProps[devGroupIdx].physicalDeviceCount,              //physicalDeviceCount
                deviceGroupProps[devGroupIdx].physicalDevices                   //physicalDevices
        };
+
        const VkDeviceCreateInfo                                                deviceCreateInfo                =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                                   //sType;
@@ -930,8 +930,9 @@ tcu::TestStatus queryDevGroupSurfacePresentCapabilitiesTest (Context& context, T
                (deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0]),    //ppEnabledExtensionNames;
                DE_NULL,                                                                                                                //pEnabledFeatures;
        };
-       Move<VkDevice>          deviceGroup = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
-       const DeviceDriver      vk      (context.getPlatformInterface(), *instHelper.instance, *deviceGroup);
+
+       Move<VkDevice>          deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+       const DeviceDriver      vk      (context.getPlatformInterface(), instHelper.instance, *deviceGroup);
 
 
        presentCapabilities = reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR*>(buffer);
@@ -972,7 +973,7 @@ tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsi
        tcu::ResultCollector                                    results                         (log);
        const InstanceHelper                                    instHelper                      (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
        const NativeObjects                                             native                          (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>                              surface                         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+       const Unique<VkSurfaceKHR>                              surface                         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
        const float                                                             queuePriority           = 1.0f;
        const tcu::CommandLine&                                 cmdLine                         = context.getTestContext().getCommandLine();
        const deUint32                                                  devGroupIdx                     = cmdLine.getVKDeviceGroupId() - 1;
@@ -988,7 +989,7 @@ tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsi
        VkRect2D*                                                               presentRectangles;
        VkDeviceGroupPresentModeFlagsKHR*               presentModeFlags;
        vector<deUint8>                                                 rectanglesBuffer;
-       VkPhysicalDevice                                                physicalDevice          = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+       VkPhysicalDevice                                                physicalDevice          = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
        const Extensions&                                               supportedExtensions     = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
        std::vector<const char*>                                deviceExtensions;
 
@@ -1002,7 +1003,7 @@ tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsi
                        TCU_THROW(NotSupportedError, (string(deviceExtensions[ndx]) + " is not supported").c_str());
        }
 
-       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
        const std::vector<VkQueueFamilyProperties>      queueProps              = getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
        for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
        {
@@ -1025,7 +1026,8 @@ tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsi
                deviceGroupProps[devGroupIdx].physicalDeviceCount,              //physicalDeviceCount
                deviceGroupProps[devGroupIdx].physicalDevices                   //physicalDevices
        };
-       const VkDeviceCreateInfo                                                deviceCreateInfo =
+
+       const VkDeviceCreateInfo                                        deviceCreateInfo =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                                   //sType;
                &deviceGroupInfo,                                                                                               //pNext;
@@ -1039,8 +1041,8 @@ tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsi
                DE_NULL,                                                                                                                //pEnabledFeatures;
        };
 
-       Move<VkDevice>          deviceGroup = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
-       const DeviceDriver      vk      (context.getPlatformInterface(), *instHelper.instance, *deviceGroup);
+       Move<VkDevice>          deviceGroup = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+       const DeviceDriver      vk      (context.getPlatformInterface(), instHelper.instance, *deviceGroup);
        presentModeFlags = reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR*>(buffer);
        deMemset(buffer, GUARD_VALUE, sizeof(buffer));
 
@@ -1124,7 +1126,7 @@ tcu::TestStatus createSurfaceInitialSizeTest (Context& context, Type wsiType)
                                                                                                                                   instHelper.supportedExtensions,
                                                                                                                                   wsiType));
 
-       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
+       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
        const UVec2                                             sizes[]                 =
        {
                UVec2(64, 64),
@@ -1138,7 +1140,7 @@ tcu::TestStatus createSurfaceInitialSizeTest (Context& context, Type wsiType)
        {
                const UVec2&                            testSize                = sizes[sizeNdx];
                const UniquePtr<Window>         nativeWindow    (createWindow(*nativeDisplay, tcu::just(testSize)));
-               const Unique<VkSurfaceKHR>      surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
+               const Unique<VkSurfaceKHR>      surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
 
                for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx)
                {
@@ -1169,8 +1171,8 @@ tcu::TestStatus resizeSurfaceTest (Context& context, Type wsiType)
                                                                                                                                   wsiType));
        UniquePtr<Window>                               nativeWindow    (createWindow(*nativeDisplay, tcu::nothing<UVec2>()));
 
-       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance);
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
+       const vector<VkPhysicalDevice>  physicalDevices = enumeratePhysicalDevices(instHelper.vki, instHelper.instance);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *nativeDisplay, *nativeWindow));
 
        const UVec2                                             sizes[]                 =
        {
@@ -1218,13 +1220,13 @@ tcu::TestStatus destroyNullHandleSurfaceTest (Context& context, Type wsiType)
        const VkSurfaceKHR              nullHandle      = DE_NULL;
 
        // Default allocator
-       instHelper.vki.destroySurfaceKHR(*instHelper.instance, nullHandle, DE_NULL);
+       instHelper.vki.destroySurfaceKHR(instHelper.instance, nullHandle, DE_NULL);
 
        // Custom allocator
        {
                AllocationCallbackRecorder      recordingAllocator      (getSystemAllocator(), 1u);
 
-               instHelper.vki.destroySurfaceKHR(*instHelper.instance, nullHandle, recordingAllocator.getCallbacks());
+               instHelper.vki.destroySurfaceKHR(instHelper.instance, nullHandle, recordingAllocator.getCallbacks());
 
                if (recordingAllocator.getNumRecords() != 0u)
                        return tcu::TestStatus::fail("Implementation allocated/freed the memory");
index 671e95b..332ecfb 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vktTestCaseUtil.hpp"
 #include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 
 #include "vkDefs.hpp"
 #include "vkPlatform.hpp"
@@ -89,12 +90,11 @@ void checkAllSupported (const Extensions& supportedExtensions, const vector<stri
        }
 }
 
-Move<VkInstance> createInstanceWithWsi (const PlatformInterface&               vkp,
-                                                                               deUint32                                                version,
-                                                                               const Extensions&                               supportedExtensions,
-                                                                               Type                                                    wsiType,
-                                                                               const vector<string>                    extraExtensions,
-                                                                               const VkAllocationCallbacks*    pAllocator      = DE_NULL)
+CustomInstance createInstanceWithWsi (Context&                                         context,
+                                                                         const Extensions&                             supportedExtensions,
+                                                                         Type                                                  wsiType,
+                                                                         const vector<string>                  extraExtensions,
+                                                                         const VkAllocationCallbacks*  pAllocator      = DE_NULL)
 {
        vector<string>  extensions = extraExtensions;
 
@@ -116,7 +116,7 @@ Move<VkInstance> createInstanceWithWsi (const PlatformInterface&            vkp,
 
        checkAllSupported(supportedExtensions, extensions);
 
-       return vk::createDefaultInstance(vkp, version, vector<string>(), extensions, pAllocator);
+       return vkt::createCustomInstanceWithExtensions(context, extensions, pAllocator);
 }
 
 VkPhysicalDeviceFeatures getDeviceFeaturesForWsi (void)
@@ -132,6 +132,7 @@ Move<VkDevice> createDeviceWithWsi (const PlatformInterface&                vkp,
                                                                        VkPhysicalDevice                                physicalDevice,
                                                                        const Extensions&                               supportedExtensions,
                                                                        const deUint32                                  queueFamilyIndex,
+                                                                       bool                                                    validationEnabled,
                                                                        const VkAllocationCallbacks*    pAllocator = DE_NULL)
 {
        const float                                             queuePriorities[]       = { 1.0f };
@@ -148,6 +149,7 @@ Move<VkDevice> createDeviceWithWsi (const PlatformInterface&                vkp,
        };
        const VkPhysicalDeviceFeatures  features                = getDeviceFeaturesForWsi();
        const char* const                               extensions[]    = { "VK_KHR_swapchain" };
+
        const VkDeviceCreateInfo                deviceParams    =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
@@ -168,7 +170,7 @@ Move<VkDevice> createDeviceWithWsi (const PlatformInterface&                vkp,
                        TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
        }
 
-       return createDevice(vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
+       return createCustomDevice(validationEnabled, vkp, instance, vki, physicalDevice, &deviceParams, pAllocator);
 }
 
 vector<deUint32> getSupportedQueueFamilyIndices (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface)
@@ -202,31 +204,29 @@ deUint32 chooseQueueFamilyIndex (const InstanceInterface& vki, VkPhysicalDevice
 struct InstanceHelper
 {
        const vector<VkExtensionProperties>     supportedExtensions;
-       const Unique<VkInstance>                        instance;
-       const InstanceDriver                            vki;
+       const CustomInstance                            instance;
+       const InstanceDriver&                           vki;
 
        InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions   (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                                                                                                                                          DE_NULL))
-               , instance                              (createInstanceWithWsi(context.getPlatformInterface(),
-                                                                                                          context.getUsedApiVersion(),
+               , instance                              (createInstanceWithWsi(context,
                                                                                                           supportedExtensions,
                                                                                                           wsiType,
                                                                                                           vector<string>(),
                                                                                                           pAllocator))
-               , vki                                   (context.getPlatformInterface(), *instance)
+               , vki                                   (instance.getDriver())
        {}
 
        InstanceHelper (Context& context, Type wsiType, const vector<string>& extensions, const VkAllocationCallbacks* pAllocator = DE_NULL)
                : supportedExtensions   (enumerateInstanceExtensionProperties(context.getPlatformInterface(),
                                                                                                                                          DE_NULL))
-               , instance                              (createInstanceWithWsi(context.getPlatformInterface(),
-                                                                                                          context.getUsedApiVersion(),
+               , instance                              (createInstanceWithWsi(context,
                                                                                                           supportedExtensions,
                                                                                                           wsiType,
                                                                                                           extensions,
                                                                                                           pAllocator))
-               , vki                                   (context.getPlatformInterface(), *instance)
+               , vki                                   (instance.getDriver())
        {}
 };
 
@@ -251,6 +251,7 @@ struct DeviceHelper
                                                                                                 physicalDevice,
                                                                                                 enumerateDeviceExtensionProperties(vki, physicalDevice, DE_NULL),
                                                                                                 queueFamilyIndex,
+                                                                                                context.getTestContext().getCommandLine().isValidationEnabled(),
                                                                                                 pAllocator))
                , vkd                           (context.getPlatformInterface(), context.getInstance(), *device)
                , queue                         (getDeviceQueue(vkd, *device, queueFamilyIndex, 0))
@@ -581,8 +582,8 @@ tcu::TestStatus createSwapchainTest (Context& context, TestParameters params)
        tcu::TestLog&                                                   log                     = context.getTestContext().getLog();
        const InstanceHelper                                    instHelper      (context, params.wsiType);
        const NativeObjects                                             native          (context, instHelper.supportedExtensions, params.wsiType);
-       const Unique<VkSurfaceKHR>                              surface         (createSurface(instHelper.vki, *instHelper.instance, params.wsiType, *native.display, *native.window));
-       const DeviceHelper                                              devHelper       (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>                              surface         (createSurface(instHelper.vki, instHelper.instance, params.wsiType, *native.display, *native.window));
+       const DeviceHelper                                              devHelper       (context, instHelper.vki, instHelper.instance, *surface);
        const vector<VkSwapchainCreateInfoKHR>  cases           (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
        const VkSurfaceCapabilitiesKHR                  capabilities(getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface));
 
@@ -677,12 +678,12 @@ tcu::TestStatus createSwapchainSimulateOOMTest (Context& context, TestParameters
                const InstanceHelper                                    instHelper      (context, params.wsiType, failingAllocator.getCallbacks());
                const NativeObjects                                             native          (context, instHelper.supportedExtensions, params.wsiType);
                const Unique<VkSurfaceKHR>                              surface         (createSurface(instHelper.vki,
-                                                                                                                                                       *instHelper.instance,
+                                                                                                                                                       instHelper.instance,
                                                                                                                                                        params.wsiType,
                                                                                                                                                        *native.display,
                                                                                                                                                        *native.window,
                                                                                                                                                        failingAllocator.getCallbacks()));
-               const DeviceHelper                                              devHelper       (context, instHelper.vki, *instHelper.instance, *surface, failingAllocator.getCallbacks());
+               const DeviceHelper                                              devHelper       (context, instHelper.vki, instHelper.instance, *surface, failingAllocator.getCallbacks());
                const vector<VkSwapchainCreateInfoKHR>  allCases        (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
 
                if (maxCases < allCases.size())
@@ -747,11 +748,11 @@ tcu::TestStatus testImageSwapchainCreateInfo (Context& context, Type wsiType)
        const InstanceHelper            instHelper                      (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
        const NativeObjects                     native                          (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
        const Unique<VkSurfaceKHR>      surface                         (createSurface(instHelper.vki,
-                                                                                                                                  *instHelper.instance,
+                                                                                                                                  instHelper.instance,
                                                                                                                                   wsiType,
                                                                                                                                   *native.display,
                                                                                                                                   *native.window));
-       const DeviceHelper                      devHelper                       (context, instHelper.vki, *instHelper.instance, *surface);
+       const DeviceHelper                      devHelper                       (context, instHelper.vki, instHelper.instance, *surface);
        const Extensions&                       deviceExtensions        = enumerateDeviceExtensionProperties(instHelper.vki, devHelper.physicalDevice, DE_NULL);
 
        // structures this tests checks were added in revision 69
@@ -1509,8 +1510,8 @@ tcu::TestStatus basicRenderTest (Context& context, Type wsiType)
        const tcu::UVec2                                desiredSize                                     (256, 256);
        const InstanceHelper                    instHelper                                      (context, wsiType);
        const NativeObjects                             native                                          (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface                                         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper                                       (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface                                         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper                                       (context, instHelper.vki, instHelper.instance, *surface);
        const DeviceInterface&                  vkd                                                     = devHelper.vkd;
        const VkDevice                                  device                                          = *devHelper.device;
        SimpleAllocator                                 allocator                                       (vkd, device, getPhysicalDeviceMemoryProperties(instHelper.vki, devHelper.physicalDevice));
@@ -1624,7 +1625,7 @@ tcu::TestStatus deviceGroupRenderTest (Context& context, Type wsiType)
 {
        const InstanceHelper            instHelper                      (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
        const tcu::CommandLine&         cmdLine                         = context.getTestContext().getCommandLine();
-       VkPhysicalDevice                        physicalDevice          = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+       VkPhysicalDevice                        physicalDevice          = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
        const Extensions&                       supportedExtensions     = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
 
        std::vector<const char*> deviceExtensions;
@@ -1640,11 +1641,11 @@ tcu::TestStatus deviceGroupRenderTest (Context& context, Type wsiType)
 
        const tcu::UVec2                                                                desiredSize                                     (256, 256);
        const NativeObjects                                                             native                                          (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>                                              surface                                         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+       const Unique<VkSurfaceKHR>                                              surface                                         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
 
        const deUint32                                                                  devGroupIdx                                     = cmdLine.getVKDeviceGroupId() - 1;
        const deUint32                                                                  deviceIdx                                       = context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
-       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                        = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                        = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
        deUint32                                                                                physicalDevicesInGroupCount     = deviceGroupProps[devGroupIdx].physicalDeviceCount;
        const VkPhysicalDevice*                                                 physicalDevicesInGroup          = deviceGroupProps[devGroupIdx].physicalDevices;
        deUint32                                                                                queueFamilyIndex                        = chooseQueueFamilyIndex(instHelper.vki, physicalDevicesInGroup[deviceIdx], *surface);
@@ -1670,7 +1671,8 @@ tcu::TestStatus deviceGroupRenderTest (Context& context, Type wsiType)
                1u,                                                                                                                             // queueCount
                &queuePriority,                                                                                                 // pQueuePriorities
        };
-       const VkDeviceCreateInfo deviceCreateInfo =
+
+       const VkDeviceCreateInfo        deviceCreateInfo =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                                   // sType
                &groupDeviceInfo,                                                                                               // pNext
@@ -1683,8 +1685,9 @@ tcu::TestStatus deviceGroupRenderTest (Context& context, Type wsiType)
                &deviceExtensions[0],                                                                                   // ppEnabledExtensionNames
                DE_NULL,                                                                                                                // pEnabledFeatures
        };
-       Move<VkDevice>                                  groupDevice                                     = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
-       const DeviceDriver                              vkd                                                     (context.getPlatformInterface(), *instHelper.instance, *groupDevice);
+
+       Move<VkDevice>                                  groupDevice                                     = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
+       const DeviceDriver                              vkd                                                     (context.getPlatformInterface(), instHelper.instance, *groupDevice);
        VkQueue                                                 queue                                           (getDeviceQueue(vkd, *groupDevice, queueFamilyIndex, 0));
        SimpleAllocator                                 allocator                                       (vkd, *groupDevice, getPhysicalDeviceMemoryProperties(instHelper.vki, physicalDevicesInGroup[deviceIdx]));
 
@@ -1850,7 +1853,7 @@ tcu::TestStatus deviceGroupRenderTest2 (Context& context, Type wsiType)
 {
        const InstanceHelper            instHelper                      (context, wsiType, vector<string>(1, string("VK_KHR_device_group_creation")));
        const tcu::CommandLine&         cmdLine                         = context.getTestContext().getCommandLine();
-       VkPhysicalDevice                        physicalDevice          = chooseDevice(instHelper.vki, *instHelper.instance, cmdLine);
+       VkPhysicalDevice                        physicalDevice          = chooseDevice(instHelper.vki, instHelper.instance, cmdLine);
        const Extensions&                       deviceExtensions        = enumerateDeviceExtensionProperties(instHelper.vki, physicalDevice, DE_NULL);
 
        // structures this tests checks were added in revision 69
@@ -1868,11 +1871,11 @@ tcu::TestStatus deviceGroupRenderTest2 (Context& context, Type wsiType)
 
        const tcu::UVec2                                                                desiredSize                                     (256, 256);
        const NativeObjects                                                             native                                          (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>                                              surface                                         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+       const Unique<VkSurfaceKHR>                                              surface                                         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
 
        const deUint32                                                                  devGroupIdx                                     = cmdLine.getVKDeviceGroupId() - 1;
        const deUint32                                                                  deviceIdx                                       = context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
-       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                        = enumeratePhysicalDeviceGroups(instHelper.vki, *instHelper.instance);
+       const vector<VkPhysicalDeviceGroupProperties>   deviceGroupProps                        = enumeratePhysicalDeviceGroups(instHelper.vki, instHelper.instance);
        deUint32                                                                                physicalDevicesInGroupCount     = deviceGroupProps[devGroupIdx].physicalDeviceCount;
        const VkPhysicalDevice*                                                 physicalDevicesInGroup          = deviceGroupProps[devGroupIdx].physicalDevices;
        deUint32                                                                                queueFamilyIndex                        = chooseQueueFamilyIndex(instHelper.vki, physicalDevicesInGroup[deviceIdx], *surface);
@@ -1902,6 +1905,7 @@ tcu::TestStatus deviceGroupRenderTest2 (Context& context, Type wsiType)
                1u,                                                                                                                             // queueCount
                &queuePriority,                                                                                                 // pQueuePriorities
        };
+
        const VkDeviceCreateInfo deviceCreateInfo =
        {
                VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                                   // sType
@@ -1915,8 +1919,9 @@ tcu::TestStatus deviceGroupRenderTest2 (Context& context, Type wsiType)
                &requiredExtensions[0],                                                                                 // ppEnabledExtensionNames
                DE_NULL,                                                                                                                // pEnabledFeatures
        };
-       Move<VkDevice>                                          groupDevice                     = createDevice(context.getPlatformInterface(), *instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
-       const DeviceDriver                                      vkd                                     (context.getPlatformInterface(), *instHelper.instance, *groupDevice);
+
+       Move<VkDevice>                                          groupDevice                     = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(), instHelper.instance, instHelper.vki, physicalDevicesInGroup[deviceIdx], &deviceCreateInfo);
+       const DeviceDriver                                      vkd                                     (context.getPlatformInterface(), instHelper.instance, *groupDevice);
        VkQueue                                                         queue                           (getDeviceQueue(vkd, *groupDevice, queueFamilyIndex, 0));
        SimpleAllocator                                         allocator                       (vkd, *groupDevice, getPhysicalDeviceMemoryProperties(instHelper.vki, physicalDevicesInGroup[deviceIdx]));
 
@@ -2205,8 +2210,8 @@ tcu::TestStatus resizeSwapchainTest (Context& context, Type wsiType)
        const tcu::UVec2                                desiredSize                     (256, 256);
        const InstanceHelper                    instHelper                      (context, wsiType);
        const NativeObjects                             native                          (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface                         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper                       (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface                         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper                       (context, instHelper.vki, instHelper.instance, *surface);
        const PlatformProperties&               platformProperties      = getPlatformProperties(wsiType);
        const VkSurfaceCapabilitiesKHR  capabilities            = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface);
        const DeviceInterface&                  vkd                                     = devHelper.vkd;
@@ -2341,8 +2346,8 @@ tcu::TestStatus getImagesIncompleteResultTest (Context& context, Type wsiType)
        const tcu::UVec2                                desiredSize             (256, 256);
        const InstanceHelper                    instHelper              (context, wsiType);
        const NativeObjects                             native                  (context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper               (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface                 (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper               (context, instHelper.vki, instHelper.instance, *surface);
        const VkSwapchainCreateInfoKHR  swapchainInfo   = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2);
        const Unique<VkSwapchainKHR>    swapchain               (createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo));
 
@@ -2365,8 +2370,8 @@ tcu::TestStatus getImagesResultsCountTest (Context& context, Type wsiType)
        const tcu::UVec2                                desiredSize(256, 256);
        const InstanceHelper                    instHelper(context, wsiType);
        const NativeObjects                             native(context, instHelper.supportedExtensions, wsiType, tcu::just(desiredSize));
-       const Unique<VkSurfaceKHR>              surface(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                              devHelper(context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>              surface(createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                              devHelper(context, instHelper.vki, instHelper.instance, *surface);
        const VkSwapchainCreateInfoKHR  swapchainInfo = getBasicSwapchainParameters(wsiType, instHelper.vki, devHelper.physicalDevice, *surface, desiredSize, 2);
        const Unique<VkSwapchainKHR>    swapchain(createSwapchainKHR(devHelper.vkd, *devHelper.device, &swapchainInfo));
 
@@ -2394,8 +2399,8 @@ tcu::TestStatus destroyNullHandleSwapchainTest (Context& context, Type wsiType)
 {
        const InstanceHelper            instHelper      (context, wsiType);
        const NativeObjects                     native          (context, instHelper.supportedExtensions, wsiType);
-       const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
-       const DeviceHelper                      devHelper       (context, instHelper.vki, *instHelper.instance, *surface);
+       const Unique<VkSurfaceKHR>      surface         (createSurface(instHelper.vki, instHelper.instance, wsiType, *native.display, *native.window));
+       const DeviceHelper                      devHelper       (context, instHelper.vki, instHelper.instance, *surface);
        const VkSwapchainKHR            nullHandle      = DE_NULL;
 
        // Default allocator
index ac78252..a3a68f9 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "vktYCbCrFormatTests.hpp"
 #include "vktTestCaseUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
 #include "vktTestGroupUtil.hpp"
 #include "vktShaderExecutor.hpp"
 #include "vktYCbCrUtil.hpp"
@@ -427,9 +428,8 @@ tcu::TestStatus testFormat (Context& context, TestParameters params)
                },
        };
        VkResult                                propsResult;
-       const PlatformInterface&                vkp                     = context.getPlatformInterface();
-       const Unique<VkInstance>                instance                (createInstanceWithExtension(vkp, context.getUsedApiVersion(), "VK_KHR_get_physical_device_properties2"));
-       const InstanceDriver                    vki                     (vkp, *instance);
+       const CustomInstance                    instance        (createCustomInstanceWithExtension(context, "VK_KHR_get_physical_device_properties2"));
+       const InstanceDriver&                   vki                     (instance.getDriver());
 
        // Verify that a yuv image consumes at least one descriptor
        propsResult = vki.getPhysicalDeviceImageFormatProperties2(context.getPhysicalDevice(), &imageFormatInfo, &extProperties);