dzn: Fix segmentation fault when Direct3D 12 user mode
authorMouriNaruto <Mouri_Naruto@Outlook.com>
Thu, 11 May 2023 15:22:50 +0000 (23:22 +0800)
committerKenji Mouri <mouri_naruto@outlook.com>
Thu, 11 May 2023 15:58:51 +0000 (15:58 +0000)
driver from at least one of GPUs is not available.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22961>

src/microsoft/vulkan/dzn_device.c

index 67f3225..ae2e556 100644 (file)
@@ -401,7 +401,7 @@ dzn_physical_device_create(struct vk_instance *instance,
    /* TODO: something something queue families */
 
    result = dzn_wsi_init(pdev);
-   if (result != VK_SUCCESS) {
+   if (result != VK_SUCCESS || !pdev->dev) {
       list_del(&pdev->vk.link);
       dzn_physical_device_destroy(&pdev->vk);
       return result;
@@ -671,16 +671,17 @@ dzn_physical_device_get_d3d12_dev(struct dzn_physical_device *pdev)
                                       pdev->adapter,
                                       instance->factory,
                                       !instance->dxil_validator);
-
-      if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device10, (void **)&pdev->dev10)))
-         pdev->dev10 = NULL;
-      if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device11, (void **)&pdev->dev11)))
-         pdev->dev11 = NULL;
-      if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device12, (void **)&pdev->dev12)))
-         pdev->dev12 = NULL;
-      dzn_physical_device_cache_caps(pdev);
-      dzn_physical_device_init_memory(pdev);
-      dzn_physical_device_init_uuids(pdev);
+      if (pdev->dev) {
+         if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device10, (void **)&pdev->dev10)))
+            pdev->dev10 = NULL;
+         if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device11, (void **)&pdev->dev11)))
+            pdev->dev11 = NULL;
+         if (FAILED(ID3D12Device1_QueryInterface(pdev->dev, &IID_ID3D12Device12, (void **)&pdev->dev12)))
+            pdev->dev12 = NULL;
+         dzn_physical_device_cache_caps(pdev);
+         dzn_physical_device_init_memory(pdev);
+         dzn_physical_device_init_uuids(pdev);
+      }   
    }
    mtx_unlock(&pdev->dev_lock);