forked from MoonsideGames/Refresh
				
			render targets
							parent
							
								
									a6f13dff8d
								
							
						
					
					
						commit
						ba9447ae4c
					
				|  | @ -376,6 +376,12 @@ typedef struct REFRESH_Viewport | ||||||
| 	float maxDepth; | 	float maxDepth; | ||||||
| } REFRESH_Viewport; | } REFRESH_Viewport; | ||||||
| 
 | 
 | ||||||
|  | typedef struct REFRESH_TextureSlice | ||||||
|  | { | ||||||
|  | 	REFRESH_Texture *texture; | ||||||
|  | 	uint32_t layer; /* 0-5 for cube, or z-slice for 3D */ | ||||||
|  | } REFRESH_TextureSlice; | ||||||
|  | 
 | ||||||
| /* State structures */ | /* State structures */ | ||||||
| 
 | 
 | ||||||
| typedef struct REFRESH_SamplerStateCreateInfo | typedef struct REFRESH_SamplerStateCreateInfo | ||||||
|  | @ -565,7 +571,6 @@ typedef struct REFRESH_FramebufferCreateInfo | ||||||
| 	const REFRESH_DepthStencilTarget *pDepthTarget; | 	const REFRESH_DepthStencilTarget *pDepthTarget; | ||||||
| 	uint32_t width; | 	uint32_t width; | ||||||
| 	uint32_t height; | 	uint32_t height; | ||||||
| 	uint32_t layers; |  | ||||||
| } REFRESH_FramebufferCreateInfo; | } REFRESH_FramebufferCreateInfo; | ||||||
| 
 | 
 | ||||||
| /* Version API */ | /* Version API */ | ||||||
|  | @ -778,37 +783,15 @@ REFRESHAPI REFRESH_Texture* REFRESH_CreateTextureCube( | ||||||
| 	uint8_t canBeRenderTarget | 	uint8_t canBeRenderTarget | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Creates a depth/stencil texture to be used with a DepthStencilTarget.
 |  | ||||||
|  * |  | ||||||
|  * format: 	The pixel format of the depth/stencil data. |  | ||||||
|  * width: 	The width of the texture. |  | ||||||
|  * height: 	The height of the texture. |  | ||||||
|  * |  | ||||||
|  * Returns an allocated REFRESH_Texture* object. Note that the contents of |  | ||||||
|  * the texture are undefined until SetData is called. |  | ||||||
|  */ |  | ||||||
| REFRESHAPI REFRESH_DepthStencilTexture* REFRESH_CreateTextureDepthStencil( |  | ||||||
| 	REFRESH_Device *device, |  | ||||||
| 	REFRESH_DepthFormat format, |  | ||||||
| 	uint32_t width, |  | ||||||
| 	uint32_t height |  | ||||||
| ); |  | ||||||
| 
 |  | ||||||
| /* Creates a color target.
 | /* Creates a color target.
 | ||||||
|  * |  * | ||||||
|  * width: 				The width of the color target. |  | ||||||
|  * height: 				The height of the color target. |  | ||||||
|  * format: 				The pixel format of the color target. |  | ||||||
|  * multisampleCount:	The MSAA value for the color target. |  * multisampleCount:	The MSAA value for the color target. | ||||||
|  * texture: 			The texture that the color target will resolve to. |  * textureSlice: 		The texture slice that the color target will resolve to. | ||||||
|  */ |  */ | ||||||
| REFRESHAPI REFRESH_ColorTarget* REFRESH_GenColorTarget( | REFRESHAPI REFRESH_ColorTarget* REFRESH_GenColorTarget( | ||||||
| 	REFRESH_Device *device, | 	REFRESH_Device *device, | ||||||
| 	uint32_t width, | 	REFRESH_SampleCount multisampleCount, | ||||||
| 	uint32_t height, | 	REFRESH_TextureSlice textureSlice | ||||||
| 	REFRESH_SurfaceFormat format, |  | ||||||
| 	uint32_t multisampleCount, |  | ||||||
| 	REFRESH_Texture *texture |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Creates a depth/stencil target.
 | /* Creates a depth/stencil target.
 | ||||||
|  | @ -816,14 +799,12 @@ REFRESHAPI REFRESH_ColorTarget* REFRESH_GenColorTarget( | ||||||
|  * width:	The width of the depth/stencil target. |  * width:	The width of the depth/stencil target. | ||||||
|  * height: 	The height of the depth/stencil target. |  * height: 	The height of the depth/stencil target. | ||||||
|  * format:	The storage format of the depth/stencil target. |  * format:	The storage format of the depth/stencil target. | ||||||
|  * texture: The texture that the depth/stencil target will resolve to. |  | ||||||
|  */ |  */ | ||||||
| REFRESHAPI REFRESH_DepthStencilTarget* REFRESH_GenDepthStencilTarget( | REFRESHAPI REFRESH_DepthStencilTarget* REFRESH_GenDepthStencilTarget( | ||||||
| 	REFRESH_Device *device, | 	REFRESH_Device *device, | ||||||
| 	uint32_t width, | 	uint32_t width, | ||||||
| 	uint32_t height, | 	uint32_t height, | ||||||
| 	REFRESH_DepthFormat format, | 	REFRESH_DepthFormat format | ||||||
| 	REFRESH_Texture *texture |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Creates a vertex buffer to be used by Draw commands.
 | /* Creates a vertex buffer to be used by Draw commands.
 | ||||||
|  |  | ||||||
|  | @ -338,37 +338,16 @@ REFRESH_Texture* REFRESH_CreateTextureCube( | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| REFRESH_DepthStencilTexture* REFRESH_CreateTextureDepthStencil( |  | ||||||
|     REFRESH_Device *device, |  | ||||||
|     REFRESH_DepthFormat format, |  | ||||||
|     uint32_t width, |  | ||||||
|     uint32_t height |  | ||||||
| ) { |  | ||||||
|     NULL_RETURN_NULL(device); |  | ||||||
|     return device->CreateTextureDepthStencil( |  | ||||||
|         device->driverData, |  | ||||||
|         format, |  | ||||||
|         width, |  | ||||||
|         height |  | ||||||
|     ); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| REFRESH_ColorTarget* REFRESH_GenColorTarget( | REFRESH_ColorTarget* REFRESH_GenColorTarget( | ||||||
| 	REFRESH_Device *device, | 	REFRESH_Device *device, | ||||||
| 	uint32_t width, |  | ||||||
| 	uint32_t height, |  | ||||||
| 	REFRESH_SurfaceFormat format, |  | ||||||
| 	uint32_t multisampleCount, | 	uint32_t multisampleCount, | ||||||
| 	REFRESH_Texture *texture | 	REFRESH_TextureSlice textureSlice | ||||||
| ) { | ) { | ||||||
|     NULL_RETURN_NULL(device); |     NULL_RETURN_NULL(device); | ||||||
|     return device->GenColorTarget( |     return device->GenColorTarget( | ||||||
|         device->driverData, |         device->driverData, | ||||||
|         width, |  | ||||||
|         height, |  | ||||||
|         format, |  | ||||||
|         multisampleCount, |         multisampleCount, | ||||||
|         texture |         textureSlice | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -376,16 +355,14 @@ REFRESH_DepthStencilTarget* REFRESH_GenDepthStencilTarget( | ||||||
| 	REFRESH_Device *device, | 	REFRESH_Device *device, | ||||||
| 	uint32_t width, | 	uint32_t width, | ||||||
| 	uint32_t height, | 	uint32_t height, | ||||||
| 	REFRESH_DepthFormat format, | 	REFRESH_DepthFormat format | ||||||
| 	REFRESH_Texture *texture |  | ||||||
| ) { | ) { | ||||||
|     NULL_RETURN_NULL(device); |     NULL_RETURN_NULL(device); | ||||||
|     return device->GenDepthStencilTarget( |     return device->GenDepthStencilTarget( | ||||||
|         device->driverData, |         device->driverData, | ||||||
|         width, |         width, | ||||||
|         height, |         height, | ||||||
|         format, |         format | ||||||
|         texture |  | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -261,28 +261,17 @@ struct REFRESH_Device | ||||||
|         uint8_t canBeRenderTarget |         uint8_t canBeRenderTarget | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     REFRESH_DepthStencilTexture* (*CreateTextureDepthStencil)( |  | ||||||
|         REFRESH_Renderer *driverData, |  | ||||||
|         REFRESH_DepthFormat format, |  | ||||||
|         uint32_t width, |  | ||||||
|         uint32_t height |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     REFRESH_ColorTarget* (*GenColorTarget)( |     REFRESH_ColorTarget* (*GenColorTarget)( | ||||||
|         REFRESH_Renderer *driverData, |         REFRESH_Renderer *driverData, | ||||||
|         uint32_t width, |  | ||||||
|         uint32_t height, |  | ||||||
|         REFRESH_SurfaceFormat format, |  | ||||||
|         uint32_t multisampleCount, |         uint32_t multisampleCount, | ||||||
|         REFRESH_Texture *texture |         REFRESH_TextureSlice textureSlice | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     REFRESH_DepthStencilTarget* (*GenDepthStencilTarget)( |     REFRESH_DepthStencilTarget* (*GenDepthStencilTarget)( | ||||||
|         REFRESH_Renderer *driverData, |         REFRESH_Renderer *driverData, | ||||||
|         uint32_t width, |         uint32_t width, | ||||||
|         uint32_t height, |         uint32_t height, | ||||||
|         REFRESH_DepthFormat format, |         REFRESH_DepthFormat format | ||||||
|         REFRESH_Texture *texture |  | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     REFRESH_Buffer* (*GenVertexBuffer)( |     REFRESH_Buffer* (*GenVertexBuffer)( | ||||||
|  | @ -526,7 +515,6 @@ struct REFRESH_Device | ||||||
|     ASSIGN_DRIVER_FUNC(CreateTexture2D, name) \ |     ASSIGN_DRIVER_FUNC(CreateTexture2D, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateTexture3D, name) \ |     ASSIGN_DRIVER_FUNC(CreateTexture3D, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateTextureCube, name) \ |     ASSIGN_DRIVER_FUNC(CreateTextureCube, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateTextureDepthStencil, name) \ |  | ||||||
|     ASSIGN_DRIVER_FUNC(GenColorTarget, name) \ |     ASSIGN_DRIVER_FUNC(GenColorTarget, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(GenDepthStencilTarget, name) \ |     ASSIGN_DRIVER_FUNC(GenDepthStencilTarget, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(GenVertexBuffer, name) \ |     ASSIGN_DRIVER_FUNC(GenVertexBuffer, name) \ | ||||||
|  |  | ||||||
|  | @ -346,6 +346,8 @@ static VkBorderColor RefreshToVK_BorderColor[] = | ||||||
| 
 | 
 | ||||||
| /* Structures */ | /* Structures */ | ||||||
| 
 | 
 | ||||||
|  | /* Memory Allocation */ | ||||||
|  | 
 | ||||||
| typedef struct VulkanMemoryAllocation VulkanMemoryAllocation; | typedef struct VulkanMemoryAllocation VulkanMemoryAllocation; | ||||||
| 
 | 
 | ||||||
| typedef struct VulkanMemoryFreeRegion | typedef struct VulkanMemoryFreeRegion | ||||||
|  | @ -383,6 +385,195 @@ typedef struct VulkanMemoryAllocator | ||||||
| 	VulkanMemorySubAllocator subAllocators[VK_MAX_MEMORY_TYPES]; | 	VulkanMemorySubAllocator subAllocators[VK_MAX_MEMORY_TYPES]; | ||||||
| } VulkanMemoryAllocator; | } VulkanMemoryAllocator; | ||||||
| 
 | 
 | ||||||
|  | /* Memory Barriers */ | ||||||
|  | 
 | ||||||
|  | typedef struct VulkanResourceAccessInfo | ||||||
|  | { | ||||||
|  | 	VkPipelineStageFlags stageMask; | ||||||
|  | 	VkAccessFlags accessMask; | ||||||
|  | 	VkImageLayout imageLayout; | ||||||
|  | } VulkanResourceAccessInfo; | ||||||
|  | 
 | ||||||
|  | static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] = | ||||||
|  | { | ||||||
|  | 	/* RESOURCE_ACCESS_NONE */ | ||||||
|  | 	{ | ||||||
|  | 		0, | ||||||
|  | 		0, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_INDEX_BUFFER */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, | ||||||
|  | 		VK_ACCESS_INDEX_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_VERTEX_BUFFER */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, | ||||||
|  | 		VK_ACCESS_INDEX_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_SHADER_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_VERTEX_SHADER_READ_SAMPLED_IMAGE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_SHADER_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_UNIFORM_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_SAMPLED_IMAGE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_SHADER_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_COLOR_ATTACHMENT */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_FRAGMENT_SHADER_READ_DEPTH_STENCIL_ATTACHMENT */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_COLOR_ATTACHMENT_READ */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, | ||||||
|  | 		VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, | ||||||
|  | 		VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_TRANSFER_READ */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_TRANSFER_BIT, | ||||||
|  | 		VK_ACCESS_TRANSFER_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_HOST_READ */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_HOST_BIT, | ||||||
|  | 		VK_ACCESS_HOST_READ_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_GENERAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_PRESENT */ | ||||||
|  | 	{ | ||||||
|  | 		0, | ||||||
|  | 		0, | ||||||
|  | 		VK_IMAGE_LAYOUT_PRESENT_SRC_KHR | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_END_OF_READ */ | ||||||
|  | 	{ | ||||||
|  | 		0, | ||||||
|  | 		0, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_VERTEX_SHADER_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_SHADER_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_GENERAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_FRAGMENT_SHADER_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, | ||||||
|  | 		VK_ACCESS_SHADER_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_GENERAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_COLOR_ATTACHMENT_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, | ||||||
|  | 		VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, | ||||||
|  | 		VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_TRANSFER_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_TRANSFER_BIT, | ||||||
|  | 		VK_ACCESS_TRANSFER_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_HOST_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_HOST_BIT, | ||||||
|  | 		VK_ACCESS_HOST_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_GENERAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_COLOR_ATTACHMENT_READ_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, | ||||||
|  | 		VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, | ||||||
|  | 		VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_MEMORY_TRANSFER_READ_WRITE */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_TRANSFER_BIT, | ||||||
|  | 		VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_UNDEFINED | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 	/* RESOURCE_ACCESS_GENERAL */ | ||||||
|  | 	{ | ||||||
|  | 		VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | ||||||
|  | 		VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, | ||||||
|  | 		VK_IMAGE_LAYOUT_GENERAL | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Renderer Structure */ | ||||||
|  | 
 | ||||||
| typedef struct QueueFamilyIndices | typedef struct QueueFamilyIndices | ||||||
| { | { | ||||||
| 	uint32_t graphicsFamily; | 	uint32_t graphicsFamily; | ||||||
|  | @ -449,6 +640,7 @@ typedef struct VulkanRenderer | ||||||
| 	VkDescriptorSetLayout fragmentParamLayout; | 	VkDescriptorSetLayout fragmentParamLayout; | ||||||
| 
 | 
 | ||||||
| 	SDL_mutex *allocatorLock; | 	SDL_mutex *allocatorLock; | ||||||
|  | 	SDL_mutex *commandLock; | ||||||
| 
 | 
 | ||||||
|     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ |     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ | ||||||
| 		vkfntype_##func func; | 		vkfntype_##func func; | ||||||
|  | @ -457,6 +649,8 @@ typedef struct VulkanRenderer | ||||||
| 	#include "Refresh_Driver_Vulkan_vkfuncs.h" | 	#include "Refresh_Driver_Vulkan_vkfuncs.h" | ||||||
| } VulkanRenderer; | } VulkanRenderer; | ||||||
| 
 | 
 | ||||||
|  | /* Image Data */ | ||||||
|  | 
 | ||||||
| typedef struct VulkanTexture | typedef struct VulkanTexture | ||||||
| { | { | ||||||
| 	VulkanMemoryAllocation *allocation; | 	VulkanMemoryAllocation *allocation; | ||||||
|  | @ -469,7 +663,7 @@ typedef struct VulkanTexture | ||||||
| 	uint32_t depth; | 	uint32_t depth; | ||||||
| 	uint32_t layerCount; | 	uint32_t layerCount; | ||||||
| 	uint32_t levelCount; | 	uint32_t levelCount; | ||||||
| 	VkFormat surfaceFormat; | 	VkFormat format; | ||||||
| 	VulkanResourceAccessType resourceAccessType; | 	VulkanResourceAccessType resourceAccessType; | ||||||
| } VulkanTexture; | } VulkanTexture; | ||||||
| 
 | 
 | ||||||
|  | @ -482,22 +676,40 @@ typedef struct VulkanDepthStencilTexture | ||||||
| 	VkImage image; | 	VkImage image; | ||||||
| 	VkImageView view; | 	VkImageView view; | ||||||
| 	VkExtent2D dimensions; | 	VkExtent2D dimensions; | ||||||
| 	VkFormat surfaceFormat; | 	VkFormat format; | ||||||
| 	VulkanResourceAccessType resourceAccessType; | 	VulkanResourceAccessType resourceAccessType; | ||||||
| } VulkanDepthStencilTexture; | } VulkanDepthStencilTexture; | ||||||
| 
 | 
 | ||||||
| typedef struct VulkanColorTarget | typedef struct VulkanColorTarget | ||||||
| { | { | ||||||
| 	VulkanTexture *texture; | 	VulkanTexture *texture; | ||||||
| 	VkImageView imageView; | 	VkImageView view; | ||||||
|  | 	VulkanTexture *multisampleTexture; | ||||||
|  | 	uint32_t multisampleCount; | ||||||
| } VulkanColorTarget; | } VulkanColorTarget; | ||||||
| 
 | 
 | ||||||
| typedef struct VulkanDepthStencilTarget | typedef struct VulkanDepthStencilTarget | ||||||
| { | { | ||||||
| 	VulkanDepthStencilTexture *texture; | 	VulkanDepthStencilTexture *texture; | ||||||
| 	VkImageView imageView; | 	VkImageView view; | ||||||
| } VulkanDepthStencilTarget; | } VulkanDepthStencilTarget; | ||||||
| 
 | 
 | ||||||
|  | /* Forward declarations */ | ||||||
|  | 
 | ||||||
|  | static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer); | ||||||
|  | 
 | ||||||
|  | /* Macros */ | ||||||
|  | 
 | ||||||
|  | #define RECORD_CMD(cmdCall)					\ | ||||||
|  | 	SDL_LockMutex(renderer->commandLock);			\ | ||||||
|  | 	if (renderer->currentCommandBuffer == NULL)		\ | ||||||
|  | 	{							\ | ||||||
|  | 		VULKAN_INTERNAL_BeginCommandBuffer(renderer);	\ | ||||||
|  | 	}							\ | ||||||
|  | 	cmdCall;						\ | ||||||
|  | 	renderer->numActiveCommands += 1;			\ | ||||||
|  | 	SDL_UnlockMutex(renderer->commandLock); | ||||||
|  | 
 | ||||||
| /* Error Handling */ | /* Error Handling */ | ||||||
| 
 | 
 | ||||||
| static inline const char* VkErrorMessages(VkResult code) | static inline const char* VkErrorMessages(VkResult code) | ||||||
|  | @ -1023,6 +1235,97 @@ static uint8_t VULKAN_INTERNAL_FindAvailableMemory( | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* Memory Barriers */ | ||||||
|  | 
 | ||||||
|  | static void VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | 	VulkanRenderer *renderer, | ||||||
|  | 	VulkanResourceAccessType nextAccess, | ||||||
|  | 	VkImageAspectFlags aspectMask, | ||||||
|  | 	uint32_t baseLayer, | ||||||
|  | 	uint32_t layerCount, | ||||||
|  | 	uint32_t baseLevel, | ||||||
|  | 	uint32_t levelCount, | ||||||
|  | 	uint8_t discardContents, | ||||||
|  | 	VkImage image, | ||||||
|  | 	VulkanResourceAccessType *resourceAccessType | ||||||
|  | ) { | ||||||
|  | 	VkPipelineStageFlags srcStages = 0; | ||||||
|  | 	VkPipelineStageFlags dstStages = 0; | ||||||
|  | 	VkImageMemoryBarrier memoryBarrier; | ||||||
|  | 	VulkanResourceAccessType prevAccess; | ||||||
|  | 	const VulkanResourceAccessInfo *pPrevAccessInfo, *pNextAccessInfo; | ||||||
|  | 
 | ||||||
|  | 	if (*resourceAccessType == nextAccess) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; | ||||||
|  | 	memoryBarrier.pNext = NULL; | ||||||
|  | 	memoryBarrier.srcAccessMask = 0; | ||||||
|  | 	memoryBarrier.dstAccessMask = 0; | ||||||
|  | 	memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; | ||||||
|  | 	memoryBarrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED; | ||||||
|  | 	memoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; | ||||||
|  | 	memoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; | ||||||
|  | 	memoryBarrier.image = image; | ||||||
|  | 	memoryBarrier.subresourceRange.aspectMask = aspectMask; | ||||||
|  | 	memoryBarrier.subresourceRange.baseArrayLayer = baseLayer; | ||||||
|  | 	memoryBarrier.subresourceRange.layerCount = layerCount; | ||||||
|  | 	memoryBarrier.subresourceRange.baseMipLevel = baseLevel; | ||||||
|  | 	memoryBarrier.subresourceRange.levelCount = levelCount; | ||||||
|  | 
 | ||||||
|  | 	prevAccess = *resourceAccessType; | ||||||
|  | 	pPrevAccessInfo = &AccessMap[prevAccess]; | ||||||
|  | 
 | ||||||
|  | 	srcStages |= pPrevAccessInfo->stageMask; | ||||||
|  | 
 | ||||||
|  | 	if (prevAccess > RESOURCE_ACCESS_END_OF_READ) | ||||||
|  | 	{ | ||||||
|  | 		memoryBarrier.srcAccessMask |= pPrevAccessInfo->accessMask; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (discardContents) | ||||||
|  | 	{ | ||||||
|  | 		memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		memoryBarrier.oldLayout = pPrevAccessInfo->imageLayout; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pNextAccessInfo = &AccessMap[nextAccess]; | ||||||
|  | 
 | ||||||
|  | 	dstStages |= pNextAccessInfo->stageMask; | ||||||
|  | 
 | ||||||
|  | 	memoryBarrier.dstAccessMask |= pNextAccessInfo->accessMask; | ||||||
|  | 	memoryBarrier.newLayout = pNextAccessInfo->imageLayout; | ||||||
|  | 
 | ||||||
|  | 	if (srcStages == 0) | ||||||
|  | 	{ | ||||||
|  | 		srcStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; | ||||||
|  | 	} | ||||||
|  | 	if (dstStages == 0) | ||||||
|  | 	{ | ||||||
|  | 		dstStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	RECORD_CMD(renderer->vkCmdPipelineBarrier( | ||||||
|  | 		renderer->currentCommandBuffer, | ||||||
|  | 		srcStages, | ||||||
|  | 		dstStages, | ||||||
|  | 		0, | ||||||
|  | 		0, | ||||||
|  | 		NULL, | ||||||
|  | 		0, | ||||||
|  | 		NULL, | ||||||
|  | 		1, | ||||||
|  | 		&memoryBarrier | ||||||
|  | 	)); | ||||||
|  | 
 | ||||||
|  | 	*resourceAccessType = nextAccess; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* Command Buffers */ | /* Command Buffers */ | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer) | static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer) | ||||||
|  | @ -1867,7 +2170,7 @@ static REFRESH_Framebuffer* VULKAN_CreateFramebuffer( | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < colorAttachmentCount; i += 1) | 	for (i = 0; i < colorAttachmentCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		imageViews[i] = ((VulkanColorTarget*)framebufferCreateInfo->pColorTargets[i])->imageView; | 		imageViews[i] = ((VulkanColorTarget*)framebufferCreateInfo->pColorTargets[i])->view; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	vkFramebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; | 	vkFramebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; | ||||||
|  | @ -1878,7 +2181,7 @@ static REFRESH_Framebuffer* VULKAN_CreateFramebuffer( | ||||||
| 	vkFramebufferCreateInfo.pAttachments = imageViews; | 	vkFramebufferCreateInfo.pAttachments = imageViews; | ||||||
| 	vkFramebufferCreateInfo.width = framebufferCreateInfo->width; | 	vkFramebufferCreateInfo.width = framebufferCreateInfo->width; | ||||||
| 	vkFramebufferCreateInfo.height = framebufferCreateInfo->height; | 	vkFramebufferCreateInfo.height = framebufferCreateInfo->height; | ||||||
| 	vkFramebufferCreateInfo.layers = framebufferCreateInfo->layers; | 	vkFramebufferCreateInfo.layers = 1; | ||||||
| 
 | 
 | ||||||
| 	vulkanResult = renderer->vkCreateFramebuffer( | 	vulkanResult = renderer->vkCreateFramebuffer( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
|  | @ -1923,14 +2226,25 @@ static uint8_t VULKAN_INTERNAL_CreateTexture( | ||||||
| ) { | ) { | ||||||
| 	VkResult vulkanResult; | 	VkResult vulkanResult; | ||||||
| 	VkImageCreateInfo imageCreateInfo; | 	VkImageCreateInfo imageCreateInfo; | ||||||
|  | 	VkImageCreateFlags imageCreateFlags = 0; | ||||||
| 	VkImageViewCreateInfo imageViewCreateInfo; | 	VkImageViewCreateInfo imageViewCreateInfo; | ||||||
| 	uint8_t findMemoryResult; | 	uint8_t findMemoryResult; | ||||||
|  | 	uint8_t is3D = depth > 1 ? 1 : 0; | ||||||
| 	uint8_t layerCount = isCube ? 6 : 1; | 	uint8_t layerCount = isCube ? 6 : 1; | ||||||
| 	VkComponentMapping swizzle = IDENTITY_SWIZZLE; | 	VkComponentMapping swizzle = IDENTITY_SWIZZLE; | ||||||
| 
 | 
 | ||||||
|  | 	if (isCube) | ||||||
|  | 	{ | ||||||
|  | 		imageCreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; | ||||||
|  | 	} | ||||||
|  | 	else if (is3D) | ||||||
|  | 	{ | ||||||
|  | 		imageCreateFlags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; | 	imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; | ||||||
| 	imageCreateInfo.pNext = NULL; | 	imageCreateInfo.pNext = NULL; | ||||||
| 	imageCreateInfo.flags = isCube ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0; | 	imageCreateInfo.flags = imageCreateFlags; | ||||||
| 	imageCreateInfo.imageType = imageType; | 	imageCreateInfo.imageType = imageType; | ||||||
| 	imageCreateInfo.format = format; | 	imageCreateInfo.format = format; | ||||||
| 	imageCreateInfo.extent.width = width; | 	imageCreateInfo.extent.width = width; | ||||||
|  | @ -2036,7 +2350,7 @@ static uint8_t VULKAN_INTERNAL_CreateTexture( | ||||||
| 	texture->dimensions.width = width; | 	texture->dimensions.width = width; | ||||||
| 	texture->dimensions.height = height; | 	texture->dimensions.height = height; | ||||||
| 	texture->depth = depth; | 	texture->depth = depth; | ||||||
| 	texture->surfaceFormat = format; | 	texture->format = format; | ||||||
| 	texture->levelCount = levelCount; | 	texture->levelCount = levelCount; | ||||||
| 	texture->layerCount = layerCount; | 	texture->layerCount = layerCount; | ||||||
| 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | ||||||
|  | @ -2161,7 +2475,7 @@ static uint8_t VULKAN_INTERNAL_CreateTextureDepthStencil( | ||||||
| 
 | 
 | ||||||
| 	texture->dimensions.width = width; | 	texture->dimensions.width = width; | ||||||
| 	texture->dimensions.height = height; | 	texture->dimensions.height = height; | ||||||
| 	texture->surfaceFormat = format; | 	texture->format = format; | ||||||
| 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | ||||||
| 
 | 
 | ||||||
| 	return 1; | 	return 1; | ||||||
|  | @ -2293,47 +2607,121 @@ static REFRESH_Texture* VULKAN_CreateTextureCube( | ||||||
| 	return (REFRESH_Texture*) result; | 	return (REFRESH_Texture*) result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static REFRESH_DepthStencilTexture* VULKAN_CreateTextureDepthStencil( |  | ||||||
| 	REFRESH_Renderer *driverData, |  | ||||||
| 	REFRESH_DepthFormat format, |  | ||||||
| 	uint32_t width, |  | ||||||
| 	uint32_t height |  | ||||||
| ) { |  | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; |  | ||||||
| 	VulkanDepthStencilTexture *result; |  | ||||||
| 
 |  | ||||||
| 	result = (VulkanDepthStencilTexture*) SDL_malloc(sizeof(VulkanDepthStencilTexture)); |  | ||||||
| 
 |  | ||||||
| 	VULKAN_INTERNAL_CreateTextureDepthStencil( |  | ||||||
| 		renderer, |  | ||||||
| 		width, |  | ||||||
| 		height, |  | ||||||
| 		RefreshToVK_DepthFormat[format], |  | ||||||
| 		result |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	return (REFRESH_DepthStencilTexture*) result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static REFRESH_ColorTarget* VULKAN_GenColorTarget( | static REFRESH_ColorTarget* VULKAN_GenColorTarget( | ||||||
| 	REFRESH_Renderer *driverData, | 	REFRESH_Renderer *driverData, | ||||||
| 	uint32_t width, | 	REFRESH_SampleCount multisampleCount, | ||||||
| 	uint32_t height, | 	REFRESH_TextureSlice textureSlice | ||||||
| 	REFRESH_SurfaceFormat format, |  | ||||||
| 	uint32_t multisampleCount, |  | ||||||
| 	REFRESH_Texture *texture |  | ||||||
| ) { | ) { | ||||||
|     SDL_assert(0); | 	VkResult vulkanResult; | ||||||
|  | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
|  | 	VulkanColorTarget *colorTarget = (VulkanColorTarget*) SDL_malloc(sizeof(VulkanColorTarget)); | ||||||
|  | 	VkImageViewCreateInfo imageViewCreateInfo; | ||||||
|  | 	VkComponentMapping swizzle = IDENTITY_SWIZZLE; | ||||||
|  | 
 | ||||||
|  | 	colorTarget->texture = (VulkanTexture*) textureSlice.texture; | ||||||
|  | 	colorTarget->multisampleTexture = NULL; | ||||||
|  | 	colorTarget->multisampleCount = 1; | ||||||
|  | 
 | ||||||
|  | 	/* create resolve target for multisample */ | ||||||
|  | 	if (multisampleCount > 1) | ||||||
|  | 	{ | ||||||
|  | 		colorTarget->multisampleTexture = | ||||||
|  | 			(VulkanTexture*) SDL_malloc(sizeof(VulkanTexture)); | ||||||
|  | 
 | ||||||
|  | 		VULKAN_INTERNAL_CreateTexture( | ||||||
|  | 			renderer, | ||||||
|  | 			colorTarget->texture->dimensions.width, | ||||||
|  | 			colorTarget->texture->dimensions.height, | ||||||
|  | 			1, | ||||||
|  | 			0, | ||||||
|  | 			RefreshToVK_SampleCount[multisampleCount], | ||||||
|  | 			1, | ||||||
|  | 			RefreshToVK_SurfaceFormat[colorTarget->texture->format], | ||||||
|  | 			VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
|  | 			VK_IMAGE_TILING_OPTIMAL, | ||||||
|  | 			VK_IMAGE_TYPE_2D, | ||||||
|  | 			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, | ||||||
|  | 			colorTarget->multisampleTexture | ||||||
|  | 		); | ||||||
|  | 		colorTarget->multisampleCount = multisampleCount; | ||||||
|  | 
 | ||||||
|  | 		VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | 			renderer, | ||||||
|  | 			RESOURCE_ACCESS_COLOR_ATTACHMENT_READ_WRITE, | ||||||
|  | 			VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
|  | 			0, | ||||||
|  | 			colorTarget->multisampleTexture->layerCount, | ||||||
|  | 			0, | ||||||
|  | 			colorTarget->multisampleTexture->levelCount, | ||||||
|  | 			0, | ||||||
|  | 			colorTarget->multisampleTexture->image, | ||||||
|  | 			&colorTarget->multisampleTexture->resourceAccessType | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* create framebuffer compatible views for RenderTarget */ | ||||||
|  | 	imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; | ||||||
|  | 	imageViewCreateInfo.pNext = NULL; | ||||||
|  | 	imageViewCreateInfo.flags = 0; | ||||||
|  | 	imageViewCreateInfo.image = colorTarget->texture->image; | ||||||
|  | 	imageViewCreateInfo.format = colorTarget->texture->format; | ||||||
|  | 	imageViewCreateInfo.components = swizzle; | ||||||
|  | 	imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | ||||||
|  | 	imageViewCreateInfo.subresourceRange.baseMipLevel = 0; | ||||||
|  | 	imageViewCreateInfo.subresourceRange.levelCount = 1; | ||||||
|  | 	imageViewCreateInfo.subresourceRange.baseArrayLayer = textureSlice.layer; | ||||||
|  | 	imageViewCreateInfo.subresourceRange.layerCount = 1; | ||||||
|  | 	imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; | ||||||
|  | 
 | ||||||
|  | 	vulkanResult = renderer->vkCreateImageView( | ||||||
|  | 		renderer->logicalDevice, | ||||||
|  | 		&imageViewCreateInfo, | ||||||
|  | 		NULL, | ||||||
|  | 		&colorTarget->view | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (vulkanResult != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		LogVulkanResult( | ||||||
|  | 			"vkCreateImageView", | ||||||
|  | 			vulkanResult | ||||||
|  | 		); | ||||||
|  | 		REFRESH_LogError("Failed to create color attachment image view"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return (REFRESH_ColorTarget*) colorTarget; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static REFRESH_DepthStencilTarget* VULKAN_GenDepthStencilTarget( | static REFRESH_DepthStencilTarget* VULKAN_GenDepthStencilTarget( | ||||||
| 	REFRESH_Renderer *driverData, | 	REFRESH_Renderer *driverData, | ||||||
| 	uint32_t width, | 	uint32_t width, | ||||||
| 	uint32_t height, | 	uint32_t height, | ||||||
| 	REFRESH_DepthFormat format, | 	REFRESH_DepthFormat format | ||||||
| 	REFRESH_Texture *texture |  | ||||||
| ) { | ) { | ||||||
|     SDL_assert(0); | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
|  | 	VulkanDepthStencilTarget *depthStencilTarget = | ||||||
|  | 		(VulkanDepthStencilTarget*) SDL_malloc( | ||||||
|  | 			sizeof(VulkanDepthStencilTarget) | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 	VulkanDepthStencilTexture *texture = | ||||||
|  | 		(VulkanDepthStencilTexture*) SDL_malloc( | ||||||
|  | 			sizeof(VulkanDepthStencilTexture) | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 	VULKAN_INTERNAL_CreateTextureDepthStencil( | ||||||
|  | 		renderer, | ||||||
|  | 		width, | ||||||
|  | 		height, | ||||||
|  | 		RefreshToVK_DepthFormat[format], | ||||||
|  | 		texture | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	depthStencilTarget->texture = texture; | ||||||
|  | 	depthStencilTarget->view = texture->view; | ||||||
|  | 
 | ||||||
|  |     return (REFRESH_DepthStencilTarget*) depthStencilTarget; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static REFRESH_Buffer* VULKAN_GenVertexBuffer( | static REFRESH_Buffer* VULKAN_GenVertexBuffer( | ||||||
|  | @ -3891,6 +4279,7 @@ static REFRESH_Device* VULKAN_CreateDevice( | ||||||
| 	/* Threading */ | 	/* Threading */ | ||||||
| 
 | 
 | ||||||
| 	renderer->allocatorLock = SDL_CreateMutex(); | 	renderer->allocatorLock = SDL_CreateMutex(); | ||||||
|  | 	renderer->commandLock = SDL_CreateMutex(); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue