Browse Source

win-capture: Fix crash if GPU can't Vulkan capture

jpark37 5 years ago
parent
commit
348fcd5b00
1 changed files with 27 additions and 20 deletions
  1. 27 20
      plugins/win-capture/graphics-hook/vulkan-capture.c

+ 27 - 20
plugins/win-capture/graphics-hook/vulkan-capture.c

@@ -1181,18 +1181,17 @@ static inline bool is_device_link_info(VkLayerDeviceCreateInfo *lici)
 }
 
 static VkResult VKAPI OBS_CreateDevice(VkPhysicalDevice phy_device,
-				       const VkDeviceCreateInfo *cinfo,
+				       const VkDeviceCreateInfo *info,
 				       const VkAllocationCallbacks *ac,
 				       VkDevice *p_device)
 {
-	VkDeviceCreateInfo info = *cinfo;
 	struct vk_inst_data *idata = get_inst_data(phy_device);
 	struct vk_inst_funcs *ifuncs = &idata->funcs;
 	struct vk_data *data = NULL;
 
 	VkResult ret = VK_ERROR_INITIALIZATION_FAILED;
 
-	VkLayerDeviceCreateInfo *ldci = (void *)info.pNext;
+	VkLayerDeviceCreateInfo *ldci = (void *)info->pNext;
 
 	/* -------------------------------------------------------- */
 	/* step through chain until we get to the link info         */
@@ -1222,8 +1221,7 @@ static VkResult VKAPI OBS_CreateDevice(VkPhysicalDevice phy_device,
 	PFN_vkCreateDevice createFunc =
 		(PFN_vkCreateDevice)gipa(VK_NULL_HANDLE, "vkCreateDevice");
 
-	ret = createFunc(phy_device, idata->valid ? &info : cinfo, ac,
-			 p_device);
+	ret = createFunc(phy_device, info, ac, p_device);
 	if (ret != VK_SUCCESS) {
 		goto fail;
 	}
@@ -1291,6 +1289,7 @@ static VkResult VKAPI OBS_CreateDevice(VkPhysicalDevice phy_device,
 	if (funcs_not_found) {
 		goto fail;
 	}
+
 	if (!idata->valid) {
 		flog("instance not valid");
 		goto fail;
@@ -1320,11 +1319,15 @@ static void VKAPI OBS_DestroyDevice(VkDevice device,
 	if (!data)
 		return;
 
-	for (uint32_t fam_idx = 0; fam_idx < _countof(data->cmd_pools);
-	     fam_idx++) {
-		struct vk_cmd_pool_data *pool_data = &data->cmd_pools[fam_idx];
-		if (pool_data->cmd_pool != VK_NULL_HANDLE) {
-			vk_shtex_destroy_cmd_pool_objects(data, pool_data);
+	if (data->valid) {
+		for (uint32_t fam_idx = 0; fam_idx < _countof(data->cmd_pools);
+		     fam_idx++) {
+			struct vk_cmd_pool_data *pool_data =
+				&data->cmd_pools[fam_idx];
+			if (pool_data->cmd_pool != VK_NULL_HANDLE) {
+				vk_shtex_destroy_cmd_pool_objects(data,
+								  pool_data);
+			}
 		}
 	}
 
@@ -1339,15 +1342,17 @@ OBS_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *cinfo,
 		       const VkAllocationCallbacks *ac, VkSwapchainKHR *p_sc)
 {
 	struct vk_data *data = get_device_data(device);
-	struct vk_device_funcs *funcs = &data->funcs;
 
 	VkSwapchainCreateInfoKHR info = *cinfo;
-	info.imageUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+	if (data->valid)
+		info.imageUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
 
+	struct vk_device_funcs *funcs = &data->funcs;
 	VkResult res = funcs->CreateSwapchainKHR(device, &info, ac, p_sc);
 	debug_res("CreateSwapchainKHR", res);
-	if (res != VK_SUCCESS)
+	if ((res != VK_SUCCESS) || !data->valid)
 		return res;
+
 	VkSwapchainKHR sc = *p_sc;
 
 	uint32_t count = 0;
@@ -1379,14 +1384,16 @@ static void VKAPI OBS_DestroySwapchainKHR(VkDevice device, VkSwapchainKHR sc,
 	struct vk_data *data = get_device_data(device);
 	struct vk_device_funcs *funcs = &data->funcs;
 
-	struct vk_swap_data *swap = get_swap_data(data, sc);
-	if (swap) {
-		if (data->cur_swap == swap) {
-			vk_shtex_free(data);
+	if (data->valid) {
+		struct vk_swap_data *swap = get_swap_data(data, sc);
+		if (swap) {
+			if (data->cur_swap == swap) {
+				vk_shtex_free(data);
+			}
+
+			swap->sc = VK_NULL_HANDLE;
+			swap->hwnd = NULL;
 		}
-
-		swap->sc = VK_NULL_HANDLE;
-		swap->hwnd = NULL;
 	}
 
 	funcs->DestroySwapchainKHR(device, sc, ac);