add swapchain format query
							parent
							
								
									c9290c90ce
								
							
						
					
					
						commit
						ed020691cc
					
				|  | @ -1242,6 +1242,12 @@ REFRESHAPI Refresh_Texture* Refresh_AcquireSwapchainTexture( | ||||||
| 	void *windowHandle | 	void *windowHandle | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  | /* Returns the format of the swapchain for the given window. */ | ||||||
|  | REFRESHAPI Refresh_TextureFormat Refresh_GetSwapchainFormat( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle | ||||||
|  | ); | ||||||
|  | 
 | ||||||
| /* Submits all of the enqueued commands. */ | /* Submits all of the enqueued commands. */ | ||||||
| REFRESHAPI void Refresh_Submit( | REFRESHAPI void Refresh_Submit( | ||||||
| 	Refresh_Device* device, | 	Refresh_Device* device, | ||||||
|  | @ -1249,7 +1255,7 @@ REFRESHAPI void Refresh_Submit( | ||||||
| 	Refresh_CommandBuffer **pCommandBuffers | 	Refresh_CommandBuffer **pCommandBuffers | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Waits for the previous submission to complete. */ | /* Waits for all submissions to complete. */ | ||||||
| REFRESHAPI void Refresh_Wait( | REFRESHAPI void Refresh_Wait( | ||||||
| 	Refresh_Device *device | 	Refresh_Device *device | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | @ -725,6 +725,17 @@ Refresh_Texture* Refresh_AcquireSwapchainTexture( | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Refresh_TextureFormat Refresh_GetSwapchainFormat( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	if (device == NULL) { return 0; } | ||||||
|  | 	return device->GetSwapchainFormat( | ||||||
|  | 		device->driverData, | ||||||
|  | 		windowHandle | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Refresh_Submit( | void Refresh_Submit( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	uint32_t commandBufferCount, | 	uint32_t commandBufferCount, | ||||||
|  |  | ||||||
|  | @ -448,6 +448,11 @@ struct Refresh_Device | ||||||
| 		void *windowHandle | 		void *windowHandle | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	Refresh_TextureFormat (*GetSwapchainFormat)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		void *windowHandle | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| 	void(*Submit)( | 	void(*Submit)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		uint32_t commandBufferCount, | 		uint32_t commandBufferCount, | ||||||
|  | @ -504,6 +509,7 @@ struct Refresh_Device | ||||||
| 	ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(Submit, name) \ | 	ASSIGN_DRIVER_FUNC(Submit, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(Wait, name) | 	ASSIGN_DRIVER_FUNC(Wait, name) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3849,7 +3849,6 @@ static uint8_t VULKAN_INTERNAL_ChooseSwapSurfaceFormat( | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Refresh_LogError("Desired surface format is unavailable."); |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -3961,7 +3960,7 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 		return CREATE_SWAPCHAIN_FAIL; | 		return CREATE_SWAPCHAIN_FAIL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	swapchainData->swapchainFormat = VK_FORMAT_B8G8R8A8_UNORM; | 	swapchainData->swapchainFormat = VK_FORMAT_R8G8B8A8_UNORM; | ||||||
| 	swapchainData->swapchainSwizzle.r = VK_COMPONENT_SWIZZLE_IDENTITY; | 	swapchainData->swapchainSwizzle.r = VK_COMPONENT_SWIZZLE_IDENTITY; | ||||||
| 	swapchainData->swapchainSwizzle.g = VK_COMPONENT_SWIZZLE_IDENTITY; | 	swapchainData->swapchainSwizzle.g = VK_COMPONENT_SWIZZLE_IDENTITY; | ||||||
| 	swapchainData->swapchainSwizzle.b = VK_COMPONENT_SWIZZLE_IDENTITY; | 	swapchainData->swapchainSwizzle.b = VK_COMPONENT_SWIZZLE_IDENTITY; | ||||||
|  | @ -3973,22 +3972,36 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 		swapchainSupportDetails.formatsLength, | 		swapchainSupportDetails.formatsLength, | ||||||
| 		&swapchainData->surfaceFormat | 		&swapchainData->surfaceFormat | ||||||
| 	)) { | 	)) { | ||||||
| 		renderer->vkDestroySurfaceKHR( | 		Refresh_LogWarn("RGBA8 swapchain unsupported, falling back to BGRA8 with swizzle"); | ||||||
| 			renderer->instance, | 		swapchainData->swapchainFormat = VK_FORMAT_B8G8R8A8_UNORM; | ||||||
| 			swapchainData->surface, | 		swapchainData->swapchainSwizzle.r = VK_COMPONENT_SWIZZLE_B; | ||||||
| 			NULL | 		swapchainData->swapchainSwizzle.g = VK_COMPONENT_SWIZZLE_G; | ||||||
| 		); | 		swapchainData->swapchainSwizzle.b = VK_COMPONENT_SWIZZLE_R; | ||||||
| 		if (swapchainSupportDetails.formatsLength > 0) | 		swapchainData->swapchainSwizzle.a = VK_COMPONENT_SWIZZLE_A; | ||||||
| 		{ | 
 | ||||||
| 			SDL_free(swapchainSupportDetails.formats); | 		if (!VULKAN_INTERNAL_ChooseSwapSurfaceFormat( | ||||||
|  | 			swapchainData->swapchainFormat, | ||||||
|  | 			swapchainSupportDetails.formats, | ||||||
|  | 			swapchainSupportDetails.formatsLength, | ||||||
|  | 			&swapchainData->surfaceFormat | ||||||
|  | 		)) { | ||||||
|  | 			renderer->vkDestroySurfaceKHR( | ||||||
|  | 				renderer->instance, | ||||||
|  | 				swapchainData->surface, | ||||||
|  | 				NULL | ||||||
|  | 			); | ||||||
|  | 			if (swapchainSupportDetails.formatsLength > 0) | ||||||
|  | 			{ | ||||||
|  | 				SDL_free(swapchainSupportDetails.formats); | ||||||
|  | 			} | ||||||
|  | 			if (swapchainSupportDetails.presentModesLength > 0) | ||||||
|  | 			{ | ||||||
|  | 				SDL_free(swapchainSupportDetails.presentModes); | ||||||
|  | 			} | ||||||
|  | 			SDL_free(swapchainData); | ||||||
|  | 			Refresh_LogError("Device does not support swap chain format"); | ||||||
|  | 			return CREATE_SWAPCHAIN_FAIL; | ||||||
| 		} | 		} | ||||||
| 		if (swapchainSupportDetails.presentModesLength > 0) |  | ||||||
| 		{ |  | ||||||
| 			SDL_free(swapchainSupportDetails.presentModes); |  | ||||||
| 		} |  | ||||||
| 		SDL_free(swapchainData); |  | ||||||
| 		Refresh_LogError("Device does not support swap chain format"); |  | ||||||
| 		return CREATE_SWAPCHAIN_FAIL; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!VULKAN_INTERNAL_ChooseSwapPresentMode( | 	if (!VULKAN_INTERNAL_ChooseSwapPresentMode( | ||||||
|  | @ -8626,6 +8639,33 @@ static Refresh_Texture* VULKAN_AcquireSwapchainTexture( | ||||||
| 	return (Refresh_Texture*) swapchainTexture; | 	return (Refresh_Texture*) swapchainTexture; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static Refresh_TextureFormat VULKAN_GetSwapchainFormat( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	VulkanSwapchainData *swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA); | ||||||
|  | 
 | ||||||
|  | 	if (swapchainData == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogWarn("No swapchain for this window!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (swapchainData->swapchainFormat == VK_FORMAT_R8G8B8A8_UNORM) | ||||||
|  | 	{ | ||||||
|  | 		return REFRESH_TEXTUREFORMAT_R8G8B8A8; | ||||||
|  | 	} | ||||||
|  | 	else if (swapchainData->swapchainFormat == VK_FORMAT_B8G8R8A8_UNORM) | ||||||
|  | 	{ | ||||||
|  | 		return REFRESH_TEXTUREFORMAT_B8G8R8A8; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogWarn("Unrecognized swapchain format!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* Synchronization management */ | /* Synchronization management */ | ||||||
| 
 | 
 | ||||||
| static VkFence VULKAN_INTERNAL_AcquireFence( | static VkFence VULKAN_INTERNAL_AcquireFence( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue