forked from MoonsideGames/Refresh
				
			Compare commits
	
		
			No commits in common. "11d262dc1113606ec594c2d5097ceb0a62db0067" and "ade74d73fe32bcaf43e7d5692444df0f7aa3f893" have entirely different histories. 
		
	
	
		
			11d262dc11
			...
			ade74d73fe
		
	
		|  | @ -281,7 +281,11 @@ typedef enum Refresh_BlendFactor | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA, | 	REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA, | ||||||
| 	REFRESH_BLENDFACTOR_CONSTANT_COLOR, | 	REFRESH_BLENDFACTOR_CONSTANT_COLOR, | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, | 	REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, | ||||||
| 	REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE | 	REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE, | ||||||
|  | 	REFRESH_BLENDFACTOR_SRC1_COLOR, | ||||||
|  | 	REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_COLOR, | ||||||
|  | 	REFRESH_BLENDFACTOR_SRC1_ALPHA, | ||||||
|  | 	REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_ALPHA | ||||||
| } Refresh_BlendFactor; | } Refresh_BlendFactor; | ||||||
| 
 | 
 | ||||||
| typedef enum Refresh_ColorComponentFlagBits | typedef enum Refresh_ColorComponentFlagBits | ||||||
|  | @ -376,14 +380,6 @@ typedef struct Refresh_TextureSlice | ||||||
| 	uint32_t level; | 	uint32_t level; | ||||||
| } Refresh_TextureSlice; | } Refresh_TextureSlice; | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_IndirectDrawCommand |  | ||||||
| { |  | ||||||
| 	uint32_t vertexCount; |  | ||||||
| 	uint32_t instanceCount; |  | ||||||
| 	uint32_t firstVertex; |  | ||||||
| 	uint32_t firstInstance; |  | ||||||
| } Refresh_IndirectDrawCommand; |  | ||||||
| 
 |  | ||||||
| /* State structures */ | /* State structures */ | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_SamplerStateCreateInfo | typedef struct Refresh_SamplerStateCreateInfo | ||||||
|  | @ -450,6 +446,12 @@ typedef struct Refresh_ColorAttachmentBlendState | ||||||
| 	Refresh_ColorComponentFlags colorWriteMask; | 	Refresh_ColorComponentFlags colorWriteMask; | ||||||
| } Refresh_ColorAttachmentBlendState; | } Refresh_ColorAttachmentBlendState; | ||||||
| 
 | 
 | ||||||
|  | typedef struct Refresh_ComputePipelineLayoutCreateInfo | ||||||
|  | { | ||||||
|  | 	uint32_t bufferBindingCount; | ||||||
|  | 	uint32_t imageBindingCount; | ||||||
|  | } Refresh_ComputePipelineLayoutCreateInfo; | ||||||
|  | 
 | ||||||
| typedef struct Refresh_ShaderModuleCreateInfo | typedef struct Refresh_ShaderModuleCreateInfo | ||||||
| { | { | ||||||
| 	size_t codeSize; | 	size_t codeSize; | ||||||
|  | @ -488,6 +490,7 @@ typedef struct Refresh_ComputeShaderInfo | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_RasterizerState | typedef struct Refresh_RasterizerState | ||||||
| { | { | ||||||
|  | 	uint8_t depthClampEnable; | ||||||
| 	Refresh_FillMode fillMode; | 	Refresh_FillMode fillMode; | ||||||
| 	Refresh_CullMode cullMode; | 	Refresh_CullMode cullMode; | ||||||
| 	Refresh_FrontFace frontFace; | 	Refresh_FrontFace frontFace; | ||||||
|  | @ -674,7 +677,6 @@ REFRESHAPI void Refresh_DrawPrimitives( | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
 | /* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
 | ||||||
|  * The buffer layout should match the layout of Refresh_IndirectDrawCommand. |  | ||||||
|  * |  * | ||||||
|  * buffer:              A buffer containing draw parameters. |  * buffer:              A buffer containing draw parameters. | ||||||
|  * offsetInBytes:       The offset to start reading from the draw buffer. |  * offsetInBytes:       The offset to start reading from the draw buffer. | ||||||
|  | @ -758,11 +760,6 @@ REFRESHAPI Refresh_Buffer* Refresh_CreateBuffer( | ||||||
| /* Setters */ | /* Setters */ | ||||||
| 
 | 
 | ||||||
| /* Uploads image data to a texture object.
 | /* Uploads image data to a texture object.
 | ||||||
|  * |  | ||||||
|  * NOTE:  |  | ||||||
|  *	DO NOT expect this to execute in sequence relative to other commands! |  | ||||||
|  *	Calling SetTextureData in a command buffer that also references the |  | ||||||
|  *	texture may result in undefined behavior. |  | ||||||
|  * |  * | ||||||
|  * 	textureSlice:		The texture slice to be updated. |  * 	textureSlice:		The texture slice to be updated. | ||||||
|  * 	data:				A pointer to the image data. |  * 	data:				A pointer to the image data. | ||||||
|  | @ -1039,9 +1036,7 @@ REFRESHAPI void Refresh_SetScissor( | ||||||
| 	Refresh_Rect *scissor | 	Refresh_Rect *scissor | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Binds vertex buffers for use with subsequent draw calls.
 | /* Binds vertex buffers for use with subsequent draw calls. */ | ||||||
|  * Note that this may only be called after binding a graphics pipeline. |  | ||||||
|  */ |  | ||||||
| REFRESHAPI void Refresh_BindVertexBuffers( | REFRESHAPI void Refresh_BindVertexBuffers( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  |  | ||||||
|  | @ -126,7 +126,11 @@ static TEMPLATE_BLEND_FACTOR_TYPE RefreshToTEMPLATE_BlendFactor[] = | ||||||
| 	0,	/* ONE_MINUS_DST_ALPHA */ | 	0,	/* ONE_MINUS_DST_ALPHA */ | ||||||
| 	0,	/* CONSTANT_COLOR */ | 	0,	/* CONSTANT_COLOR */ | ||||||
| 	0,	/* ONE_MINUS_CONSTANT_COLOR */ | 	0,	/* ONE_MINUS_CONSTANT_COLOR */ | ||||||
| 	0	/* SRC_ALPHA_SATURATE */ | 	0,	/* SRC_ALPHA_SATURATE */ | ||||||
|  | 	0,	/* SRC1_COLOR */ | ||||||
|  | 	0,	/* ONE_MINUS_SRC1_COLOR */ | ||||||
|  | 	0,	/* SRC1_ALPHA */ | ||||||
|  | 	0	/* ONE_MINUS_SRC1_ALPHA */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] = | static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] = | ||||||
|  |  | ||||||
|  | @ -287,7 +287,11 @@ static VkBlendFactor RefreshToVK_BlendFactor[] = | ||||||
| 	VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, | 	VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, | ||||||
| 	VK_BLEND_FACTOR_CONSTANT_ALPHA, | 	VK_BLEND_FACTOR_CONSTANT_ALPHA, | ||||||
| 	VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA, | 	VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA, | ||||||
| 	VK_BLEND_FACTOR_SRC_ALPHA_SATURATE | 	VK_BLEND_FACTOR_SRC_ALPHA_SATURATE, | ||||||
|  | 	VK_BLEND_FACTOR_SRC1_COLOR, | ||||||
|  | 	VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, | ||||||
|  | 	VK_BLEND_FACTOR_SRC1_ALPHA, | ||||||
|  | 	VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static VkBlendOp RefreshToVK_BlendOp[] = | static VkBlendOp RefreshToVK_BlendOp[] = | ||||||
|  | @ -3822,7 +3826,8 @@ static void VULKAN_INTERNAL_BindUniformBuffer( | ||||||
| 
 | 
 | ||||||
| static uint8_t VULKAN_INTERNAL_CreateUniformBuffer( | static uint8_t VULKAN_INTERNAL_CreateUniformBuffer( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanUniformBufferPool *bufferPool | 	VulkanUniformBufferPool *bufferPool, | ||||||
|  | 	VkDeviceSize blockSize | ||||||
| ) { | ) { | ||||||
| 	VulkanResourceAccessType resourceAccessType; | 	VulkanResourceAccessType resourceAccessType; | ||||||
| 	VkDescriptorSetLayout descriptorSetLayout; | 	VkDescriptorSetLayout descriptorSetLayout; | ||||||
|  | @ -4028,7 +4033,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_AcquireUniformBufferFromPool( | ||||||
| 
 | 
 | ||||||
| 	if (bufferPool->availableBufferCount == 0) | 	if (bufferPool->availableBufferCount == 0) | ||||||
| 	{ | 	{ | ||||||
| 		if (!VULKAN_INTERNAL_CreateUniformBuffer(renderer, bufferPool)) | 		if (!VULKAN_INTERNAL_CreateUniformBuffer(renderer, bufferPool, blockSize)) | ||||||
| 		{ | 		{ | ||||||
| 			SDL_UnlockMutex(bufferPool->lock); | 			SDL_UnlockMutex(bufferPool->lock); | ||||||
| 			Refresh_LogError("Failed to create uniform buffer!"); | 			Refresh_LogError("Failed to create uniform buffer!"); | ||||||
|  | @ -6133,7 +6138,7 @@ static Refresh_GraphicsPipeline* VULKAN_CreateGraphicsPipeline( | ||||||
| 	rasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; | 	rasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; | ||||||
| 	rasterizationStateCreateInfo.pNext = NULL; | 	rasterizationStateCreateInfo.pNext = NULL; | ||||||
| 	rasterizationStateCreateInfo.flags = 0; | 	rasterizationStateCreateInfo.flags = 0; | ||||||
| 	rasterizationStateCreateInfo.depthClampEnable = VK_FALSE; | 	rasterizationStateCreateInfo.depthClampEnable = pipelineCreateInfo->rasterizerState.depthClampEnable; | ||||||
| 	rasterizationStateCreateInfo.rasterizerDiscardEnable = VK_FALSE; | 	rasterizationStateCreateInfo.rasterizerDiscardEnable = VK_FALSE; | ||||||
| 	rasterizationStateCreateInfo.polygonMode = RefreshToVK_PolygonMode[ | 	rasterizationStateCreateInfo.polygonMode = RefreshToVK_PolygonMode[ | ||||||
| 		pipelineCreateInfo->rasterizerState.fillMode | 		pipelineCreateInfo->rasterizerState.fillMode | ||||||
|  | @ -6840,6 +6845,12 @@ static void VULKAN_SetTextureData( | ||||||
| 	uint32_t bufferRowLength; | 	uint32_t bufferRowLength; | ||||||
| 	uint32_t bufferImageHeight; | 	uint32_t bufferImageHeight; | ||||||
| 
 | 
 | ||||||
|  | 	if (vulkanCommandBuffer->renderPassInProgress) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot perform buffer updates mid-render pass!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
|  | @ -7333,6 +7344,12 @@ static void VULKAN_SetBufferData( | ||||||
| 	VkBufferCopy bufferCopy; | 	VkBufferCopy bufferCopy; | ||||||
| 	VulkanResourceAccessType accessType = vulkanBuffer->resourceAccessType; | 	VulkanResourceAccessType accessType = vulkanBuffer->resourceAccessType; | ||||||
| 
 | 
 | ||||||
|  | 	if (vulkanCommandBuffer->renderPassInProgress) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot perform buffer updates mid-render pass!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
|  | @ -7460,6 +7477,18 @@ static uint32_t VULKAN_PushFragmentShaderUniforms( | ||||||
| 	VulkanGraphicsPipeline* graphicsPipeline = vulkanCommandBuffer->currentGraphicsPipeline; | 	VulkanGraphicsPipeline* graphicsPipeline = vulkanCommandBuffer->currentGraphicsPipeline; | ||||||
| 	uint32_t offset; | 	uint32_t offset; | ||||||
| 
 | 
 | ||||||
|  | 	if (graphicsPipeline == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot push uniforms if a pipeline is not bound!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (graphicsPipeline->fragmentUniformBlockSize == 0) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Bound pipeline's fragment stage does not declare uniforms!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if ( | 	if ( | ||||||
| 		vulkanCommandBuffer->fragmentUniformBuffer->offset + | 		vulkanCommandBuffer->fragmentUniformBuffer->offset + | ||||||
| 		graphicsPipeline->fragmentUniformBlockSize >= | 		graphicsPipeline->fragmentUniformBlockSize >= | ||||||
|  | @ -7502,6 +7531,18 @@ static uint32_t VULKAN_PushComputeShaderUniforms( | ||||||
| 	VulkanComputePipeline* computePipeline = vulkanCommandBuffer->currentComputePipeline; | 	VulkanComputePipeline* computePipeline = vulkanCommandBuffer->currentComputePipeline; | ||||||
| 	uint32_t offset; | 	uint32_t offset; | ||||||
| 
 | 
 | ||||||
|  | 	if (computePipeline == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot push uniforms if a pipeline is not bound!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (computePipeline->uniformBlockSize == 0) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Bound compute pipeline does not declare uniforms!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if ( | 	if ( | ||||||
| 		vulkanCommandBuffer->computeUniformBuffer->offset + | 		vulkanCommandBuffer->computeUniformBuffer->offset + | ||||||
| 		computePipeline->uniformBlockSize >= | 		computePipeline->uniformBlockSize >= | ||||||
|  | @ -8250,6 +8291,12 @@ static void VULKAN_SetViewport( | ||||||
| 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 
 | 
 | ||||||
|  | 	if (!vulkanCommandBuffer->renderPassInProgress) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Illegal to set viewport state outside of a render pass!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	VULKAN_INTERNAL_SetCurrentViewport( | 	VULKAN_INTERNAL_SetCurrentViewport( | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
| 		viewport | 		viewport | ||||||
|  | @ -8281,6 +8328,12 @@ static void VULKAN_SetScissor( | ||||||
| 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 
 | 
 | ||||||
|  | 	if (!vulkanCommandBuffer->renderPassInProgress) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Illegal to set scissor state outside of a render pass!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	VULKAN_INTERNAL_SetCurrentScissor( | 	VULKAN_INTERNAL_SetCurrentScissor( | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
| 		scissor | 		scissor | ||||||
|  | @ -8317,6 +8370,12 @@ static void VULKAN_BeginRenderPass( | ||||||
| 	uint32_t framebufferWidth = UINT32_MAX; | 	uint32_t framebufferWidth = UINT32_MAX; | ||||||
| 	uint32_t framebufferHeight = UINT32_MAX; | 	uint32_t framebufferHeight = UINT32_MAX; | ||||||
| 
 | 
 | ||||||
|  | 	if (colorAttachmentCount == 0 && depthStencilAttachmentInfo == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Render pass must have at least one render target!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* The framebuffer cannot be larger than the smallest attachment. */ | 	/* The framebuffer cannot be larger than the smallest attachment. */ | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < colorAttachmentCount; i += 1) | 	for (i = 0; i < colorAttachmentCount; i += 1) | ||||||
|  | @ -8627,6 +8686,12 @@ static void VULKAN_BindGraphicsPipeline( | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanGraphicsPipeline* pipeline = (VulkanGraphicsPipeline*) graphicsPipeline; | 	VulkanGraphicsPipeline* pipeline = (VulkanGraphicsPipeline*) graphicsPipeline; | ||||||
| 
 | 
 | ||||||
|  | 	if (!vulkanCommandBuffer->renderPassInProgress) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Illegal to bind a graphics pipeline outside of a render pass!"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (	vulkanCommandBuffer->vertexUniformBuffer != renderer->dummyVertexUniformBuffer && | 	if (	vulkanCommandBuffer->vertexUniformBuffer != renderer->dummyVertexUniformBuffer && | ||||||
| 		vulkanCommandBuffer->vertexUniformBuffer != NULL | 		vulkanCommandBuffer->vertexUniformBuffer != NULL | ||||||
| 	) { | 	) { | ||||||
|  | @ -9351,6 +9416,13 @@ static Refresh_Texture* VULKAN_AcquireSwapchainTexture( | ||||||
| 	VulkanPresentData *presentData; | 	VulkanPresentData *presentData; | ||||||
| 
 | 
 | ||||||
| 	windowData = VULKAN_INTERNAL_FetchWindowData(windowHandle); | 	windowData = VULKAN_INTERNAL_FetchWindowData(windowHandle); | ||||||
|  | 
 | ||||||
|  | 	if (windowData == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot acquire swapchain texture, window has not been claimed!"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	swapchainData = windowData->swapchainData; | 	swapchainData = windowData->swapchainData; | ||||||
| 
 | 
 | ||||||
| 	/* Window is claimed but swapchain is invalid! */ | 	/* Window is claimed but swapchain is invalid! */ | ||||||
|  | @ -10535,9 +10607,10 @@ static uint8_t VULKAN_INTERNAL_CreateLogicalDevice( | ||||||
| 	/* specifying used device features */ | 	/* specifying used device features */ | ||||||
| 
 | 
 | ||||||
| 	SDL_zero(deviceFeatures); | 	SDL_zero(deviceFeatures); | ||||||
|  | 	deviceFeatures.occlusionQueryPrecise = VK_TRUE; | ||||||
| 	deviceFeatures.fillModeNonSolid = VK_TRUE; | 	deviceFeatures.fillModeNonSolid = VK_TRUE; | ||||||
|  | 	deviceFeatures.depthClamp = VK_TRUE; | ||||||
| 	deviceFeatures.samplerAnisotropy = VK_TRUE; | 	deviceFeatures.samplerAnisotropy = VK_TRUE; | ||||||
| 	deviceFeatures.multiDrawIndirect = VK_TRUE; |  | ||||||
| 
 | 
 | ||||||
| 	/* creating the logical device */ | 	/* creating the logical device */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue