[PATCH vkd3d 03/10] tests: Implement --adapter option for Vulkan tests.

Józef Kucia joseph.kucia at gmail.com
Tue Mar 5 11:16:58 CST 2019


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 tests/d3d12_crosstest.h | 208 +++++++++++++++++++++-------------------
 1 file changed, 108 insertions(+), 100 deletions(-)

diff --git a/tests/d3d12_crosstest.h b/tests/d3d12_crosstest.h
index be6076a45950..082118fa35fe 100644
--- a/tests/d3d12_crosstest.h
+++ b/tests/d3d12_crosstest.h
@@ -268,6 +268,25 @@ static IUnknown *create_adapter(void)
     return adapter;
 }
 
+static ID3D12Device *create_device(void)
+{
+    IUnknown *adapter = NULL;
+    ID3D12Device *device;
+    HRESULT hr;
+
+    if ((use_warp_device || use_adapter_idx) && !(adapter = create_adapter()))
+    {
+        trace("Failed to create adapter.\n");
+        return NULL;
+    }
+
+    hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device);
+    if (adapter)
+        IUnknown_Release(adapter);
+
+    return SUCCEEDED(hr) ? device : NULL;
+}
+
 static void init_adapter_info(void)
 {
     IDXGIAdapter *dxgi_adapter;
@@ -340,9 +359,39 @@ static inline bool is_radv_device(ID3D12Device *device)
     return false;
 }
 #else
-static bool have_VK_KHR_driver_properties;
 static VkDriverIdKHR vk_driver_id;
 
+static bool check_device_extension(VkPhysicalDevice vk_physical_device, const char *name)
+{
+    VkExtensionProperties *properties;
+    bool ret = false;
+    unsigned int i;
+    uint32_t count;
+    VkResult vr;
+
+    vr = vkEnumerateDeviceExtensionProperties(vk_physical_device, NULL, &count, NULL);
+    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
+    if (!count)
+        return false;
+
+    properties = calloc(count, sizeof(*properties));
+    ok(properties, "Failed to allocate memory.\n");
+
+    vr = vkEnumerateDeviceExtensionProperties(vk_physical_device, NULL, &count, properties);
+    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
+    for (i = 0; i < count; ++i)
+    {
+        if (!strcmp(properties[i].extensionName, name))
+        {
+            ret = true;
+            break;
+        }
+    }
+
+    free(properties);
+    return ret;
+}
+
 static HRESULT create_vkd3d_instance(struct vkd3d_instance **instance)
 {
     struct vkd3d_optional_instance_extensions_info optional_extensions_info;
@@ -367,21 +416,58 @@ static HRESULT create_vkd3d_instance(struct vkd3d_instance **instance)
     return vkd3d_create_instance(&instance_create_info, instance);
 }
 
+static VkPhysicalDevice select_physical_device(struct vkd3d_instance *instance)
+{
+    VkPhysicalDevice *vk_physical_devices;
+    VkPhysicalDevice vk_physical_device;
+    VkInstance vk_instance;
+    uint32_t count;
+    VkResult vr;
+
+    vk_instance = vkd3d_instance_get_vk_instance(instance);
+
+    vr = vkEnumeratePhysicalDevices(vk_instance, &count, NULL);
+    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
+
+    if (use_adapter_idx >= count)
+    {
+        trace("Invalid physical device index %u.\n", use_adapter_idx);
+        return VK_NULL_HANDLE;
+    }
+
+    vk_physical_devices = calloc(count, sizeof(*vk_physical_devices));
+    ok(vk_physical_devices, "Failed to allocate memory.\n");
+    vr = vkEnumeratePhysicalDevices(vk_instance, &count, vk_physical_devices);
+    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
+
+    vk_physical_device = vk_physical_devices[use_adapter_idx];
+
+    free(vk_physical_devices);
+
+    return vk_physical_device;
+}
+
 static HRESULT create_vkd3d_device(struct vkd3d_instance *instance,
         D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device)
 {
     struct vkd3d_device_create_info device_create_info;
+    VkPhysicalDevice vk_physical_device;
 
     static const char * const device_extensions[] =
     {
         VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME,
     };
 
+    if (!(vk_physical_device = select_physical_device(instance)))
+        return E_INVALIDARG;
+
     memset(&device_create_info, 0, sizeof(device_create_info));
     device_create_info.type = VKD3D_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
     device_create_info.minimum_feature_level = minimum_feature_level;
     device_create_info.instance = instance;
-    if (have_VK_KHR_driver_properties)
+    device_create_info.vk_physical_device = vk_physical_device;
+
+    if (check_device_extension(vk_physical_device, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))
     {
         device_create_info.device_extensions = device_extensions;
         device_create_info.device_extension_count = ARRAY_SIZE(device_extensions);
@@ -390,55 +476,19 @@ static HRESULT create_vkd3d_device(struct vkd3d_instance *instance,
     return vkd3d_create_device(&device_create_info, iid, device);
 }
 
-static bool check_device_extension(VkPhysicalDevice vk_physical_device, const char *name)
-{
-    VkExtensionProperties *properties;
-    bool ret = false;
-    unsigned int i;
-    uint32_t count;
-    VkResult vr;
-
-    vr = vkEnumerateDeviceExtensionProperties(vk_physical_device, NULL, &count, NULL);
-    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
-    if (!count)
-        return false;
-
-    properties = calloc(count, sizeof(*properties));
-    ok(properties, "Failed to allocate memory.\n");
-
-    vr = vkEnumerateDeviceExtensionProperties(vk_physical_device, NULL, &count, properties);
-    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
-    for (i = 0; i < count; ++i)
-    {
-        if (!strcmp(properties[i].extensionName, name))
-        {
-            ret = true;
-            break;
-        }
-    }
-
-    free(properties);
-    return ret;
-}
-
-HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter,
-        D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device)
+static ID3D12Device *create_device(void)
 {
     struct vkd3d_instance *instance;
+    ID3D12Device *device;
     HRESULT hr;
 
     if (SUCCEEDED(hr = create_vkd3d_instance(&instance)))
     {
-        hr = create_vkd3d_device(instance, minimum_feature_level,  iid, device);
+        hr = create_vkd3d_device(instance, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device);
         vkd3d_instance_decref(instance);
     }
 
-    return hr;
-}
-
-static IUnknown *create_adapter(void)
-{
-    return NULL;
+    return SUCCEEDED(hr) ? device : NULL;
 }
 
 static void init_adapter_info(void)
@@ -446,61 +496,38 @@ static void init_adapter_info(void)
     PFN_vkGetPhysicalDeviceProperties2KHR pfn_vkGetPhysicalDeviceProperties2KHR;
     VkPhysicalDeviceDriverPropertiesKHR driver_properties;
     VkPhysicalDeviceProperties2 device_properties2;
-    VkPhysicalDevice *vk_physical_devices;
     VkPhysicalDevice vk_physical_device;
     struct vkd3d_instance *instance;
-    VkInstance vk_instance;
     ID3D12Device *device;
-    uint32_t count, i;
-    VkResult vr;
     HRESULT hr;
 
     if (FAILED(hr = create_vkd3d_instance(&instance)))
         return;
 
-    vk_instance = vkd3d_instance_get_vk_instance(instance);
-
-    vr = vkEnumeratePhysicalDevices(vk_instance, &count, NULL);
-    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
-    vk_physical_devices = calloc(count, sizeof(*vk_physical_devices));
-    ok(vk_physical_devices, "Failed to allocate memory.\n");
-    vr = vkEnumeratePhysicalDevices(vk_instance, &count, vk_physical_devices);
-    ok(vr == VK_SUCCESS, "Got unexpected VkResult %d.\n", vr);
-
-    have_VK_KHR_driver_properties = true;
-    for (i = 0; i < count; ++i)
-    {
-        if (!check_device_extension(vk_physical_devices[i],VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))
-        {
-            have_VK_KHR_driver_properties = false;
-            break;
-        }
-    }
-
-    free(vk_physical_devices);
-
-    if (!have_VK_KHR_driver_properties)
-        goto done;
-
     if (FAILED(hr = create_vkd3d_device(instance, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device)))
         goto done;
 
     vk_physical_device = vkd3d_get_vk_physical_device(device);
 
-    pfn_vkGetPhysicalDeviceProperties2KHR
-            = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties2KHR");
-    ok(pfn_vkGetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR is NULL.\n");
+    if (check_device_extension(vk_physical_device, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))
+    {
+        VkInstance vk_instance = vkd3d_instance_get_vk_instance(instance);
+
+        pfn_vkGetPhysicalDeviceProperties2KHR
+                = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties2KHR");
+        ok(pfn_vkGetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR is NULL.\n");
 
-    memset(&device_properties2, 0, sizeof(device_properties2));
-    device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
-    device_properties2.pNext = &driver_properties;
-    memset(&driver_properties, 0, sizeof(driver_properties));
-    driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
-    pfn_vkGetPhysicalDeviceProperties2KHR(vk_physical_device, &device_properties2);
+        memset(&device_properties2, 0, sizeof(device_properties2));
+        device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+        device_properties2.pNext = &driver_properties;
+        memset(&driver_properties, 0, sizeof(driver_properties));
+        driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
+        pfn_vkGetPhysicalDeviceProperties2KHR(vk_physical_device, &device_properties2);
 
-    trace("Driver name: %s, driver info: %s.\n", driver_properties.driverName, driver_properties.driverInfo);
+        trace("Driver name: %s, driver info: %s.\n", driver_properties.driverName, driver_properties.driverInfo);
 
-    vk_driver_id = driver_properties.driverID;
+        vk_driver_id = driver_properties.driverID;
+    }
 
     ID3D12Device_Release(device);
 
@@ -530,25 +557,6 @@ static inline bool is_radv_device(ID3D12Device *device)
 }
 #endif
 
-static ID3D12Device *create_device(void)
-{
-    IUnknown *adapter = NULL;
-    ID3D12Device *device;
-    HRESULT hr;
-
-    if ((use_warp_device || use_adapter_idx) && !(adapter = create_adapter()))
-    {
-        trace("Failed to create adapter.\n");
-        return NULL;
-    }
-
-    hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device);
-    if (adapter)
-        IUnknown_Release(adapter);
-
-    return SUCCEEDED(hr) ? device : NULL;
-}
-
 static void parse_args(int argc, char **argv)
 {
     unsigned int i;
-- 
2.19.2




More information about the wine-devel mailing list