Compare commits
	
		
			4 Commits 
		
	
	
		
			53c439ef04
			...
			db1455ceb0
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | db1455ceb0 | |
|  | 39b97dec27 | |
|  | b5dcddea49 | |
|  | 7297eba889 | 
|  | @ -1,4 +1,4 @@ | ||||||
| /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
 | /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
 | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2020 Evan Hemsley |  * Copyright (c) 2020 Evan Hemsley | ||||||
|  * |  * | ||||||
|  | @ -79,7 +79,8 @@ typedef struct VulkanExtensions | ||||||
| #define ALLOCATION_INCREMENT 16000000           /* 16MB */ | #define ALLOCATION_INCREMENT 16000000           /* 16MB */ | ||||||
| #define TRANSFER_BUFFER_STARTING_SIZE 8000000 	/* 8MB */ | #define TRANSFER_BUFFER_STARTING_SIZE 8000000 	/* 8MB */ | ||||||
| #define POOLED_TRANSFER_BUFFER_SIZE 16000000    /* 16MB */ | #define POOLED_TRANSFER_BUFFER_SIZE 16000000    /* 16MB */ | ||||||
| #define UBO_BUFFER_SIZE 16000 			        /* 16KB */ | #define UBO_BUFFER_SIZE 16000000				/* 16MB */ | ||||||
|  | #define UBO_SECTION_SIZE 4000 			        /* 4KB */ | ||||||
| #define DESCRIPTOR_POOL_STARTING_SIZE 128 | #define DESCRIPTOR_POOL_STARTING_SIZE 128 | ||||||
| #define DEFRAG_TIME 200 | #define DEFRAG_TIME 200 | ||||||
| #define WINDOW_DATA "Refresh_VulkanWindowData" | #define WINDOW_DATA "Refresh_VulkanWindowData" | ||||||
|  | @ -560,8 +561,8 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] = | ||||||
| 
 | 
 | ||||||
| 	/* RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE */ | 	/* RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE */ | ||||||
| 	{ | 	{ | ||||||
| 		VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, | 		VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, | ||||||
| 		VK_ACCESS_SHADER_READ_BIT, | 		VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, | ||||||
| 		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL | 		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | @ -719,8 +720,8 @@ typedef struct VulkanUniformBufferPool VulkanUniformBufferPool; | ||||||
| typedef struct VulkanUniformBuffer | typedef struct VulkanUniformBuffer | ||||||
| { | { | ||||||
| 	VulkanUniformBufferPool *pool; | 	VulkanUniformBufferPool *pool; | ||||||
| 	VulkanBufferContainer *vulkanBufferContainer; /* use container to avoid defrag issues */ | 	VkDeviceSize poolOffset; /* memory offset relative to the pool buffer */ | ||||||
| 	VkDeviceSize offset; | 	VkDeviceSize offset; /* based on uniform pushes */ | ||||||
| 	VkDescriptorSet descriptorSet; | 	VkDescriptorSet descriptorSet; | ||||||
| } VulkanUniformBuffer; | } VulkanUniformBuffer; | ||||||
| 
 | 
 | ||||||
|  | @ -746,10 +747,13 @@ typedef struct VulkanUniformDescriptorPool | ||||||
| 	uint32_t availableDescriptorSetCount; | 	uint32_t availableDescriptorSetCount; | ||||||
| } VulkanUniformDescriptorPool; | } VulkanUniformDescriptorPool; | ||||||
| 
 | 
 | ||||||
|  | /* This is actually just one buffer that we carve slices out of. */ | ||||||
| struct VulkanUniformBufferPool | struct VulkanUniformBufferPool | ||||||
| { | { | ||||||
| 	VulkanUniformBufferType type; | 	VulkanUniformBufferType type; | ||||||
| 	VulkanUniformDescriptorPool descriptorPool; | 	VulkanUniformDescriptorPool descriptorPool; | ||||||
|  | 	VulkanBuffer *buffer; | ||||||
|  | 	VkDeviceSize nextAvailableOffset; | ||||||
| 	SDL_mutex *lock; | 	SDL_mutex *lock; | ||||||
| 
 | 
 | ||||||
| 	VulkanUniformBuffer **availableBuffers; | 	VulkanUniformBuffer **availableBuffers; | ||||||
|  | @ -1011,6 +1015,7 @@ typedef struct RenderPassHash | ||||||
| 	uint32_t colorAttachmentCount; | 	uint32_t colorAttachmentCount; | ||||||
| 	RenderPassDepthStencilTargetDescription depthStencilTargetDescription; | 	RenderPassDepthStencilTargetDescription depthStencilTargetDescription; | ||||||
| 	Refresh_SampleCount colorAttachmentSampleCount; | 	Refresh_SampleCount colorAttachmentSampleCount; | ||||||
|  | 	VkImageLayout finalLayout; | ||||||
| } RenderPassHash; | } RenderPassHash; | ||||||
| 
 | 
 | ||||||
| typedef struct RenderPassHashMap | typedef struct RenderPassHashMap | ||||||
|  | @ -1042,6 +1047,11 @@ static inline uint8_t RenderPassHash_Compare( | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (a->finalLayout != b->finalLayout) | ||||||
|  | 	{ | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for (i = 0; i < a->colorAttachmentCount; i += 1) | 	for (i = 0; i < a->colorAttachmentCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		if (a->colorTargetDescriptions[i].format != b->colorTargetDescriptions[i].format) | 		if (a->colorTargetDescriptions[i].format != b->colorTargetDescriptions[i].format) | ||||||
|  | @ -1776,6 +1786,8 @@ typedef struct VulkanRenderer | ||||||
| 	VkDescriptorSetLayout vertexUniformDescriptorSetLayout; | 	VkDescriptorSetLayout vertexUniformDescriptorSetLayout; | ||||||
| 	VkDescriptorSetLayout fragmentUniformDescriptorSetLayout; | 	VkDescriptorSetLayout fragmentUniformDescriptorSetLayout; | ||||||
| 	VkDescriptorSetLayout computeUniformDescriptorSetLayout; | 	VkDescriptorSetLayout computeUniformDescriptorSetLayout; | ||||||
|  | 
 | ||||||
|  | 	VulkanBuffer *dummyBuffer; | ||||||
| 	VulkanUniformBuffer *dummyVertexUniformBuffer; | 	VulkanUniformBuffer *dummyVertexUniformBuffer; | ||||||
| 	VulkanUniformBuffer *dummyFragmentUniformBuffer; | 	VulkanUniformBuffer *dummyFragmentUniformBuffer; | ||||||
| 	VulkanUniformBuffer *dummyComputeUniformBuffer; | 	VulkanUniformBuffer *dummyComputeUniformBuffer; | ||||||
|  | @ -4197,6 +4209,36 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool( | ||||||
| 	VulkanUniformBufferType uniformBufferType | 	VulkanUniformBufferType uniformBufferType | ||||||
| ) { | ) { | ||||||
| 	VulkanUniformBufferPool* uniformBufferPool = SDL_malloc(sizeof(VulkanUniformBufferPool)); | 	VulkanUniformBufferPool* uniformBufferPool = SDL_malloc(sizeof(VulkanUniformBufferPool)); | ||||||
|  | 	VulkanResourceAccessType resourceAccessType; | ||||||
|  | 
 | ||||||
|  | 	if (uniformBufferType == UNIFORM_BUFFER_VERTEX) | ||||||
|  | 	{ | ||||||
|  | 		resourceAccessType = RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER; | ||||||
|  | 	} | ||||||
|  | 	else if (uniformBufferType == UNIFORM_BUFFER_FRAGMENT) | ||||||
|  | 	{ | ||||||
|  | 		resourceAccessType = RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER; | ||||||
|  | 	} | ||||||
|  | 	else if (uniformBufferType == UNIFORM_BUFFER_COMPUTE) | ||||||
|  | 	{ | ||||||
|  | 		resourceAccessType = RESOURCE_ACCESS_COMPUTE_SHADER_READ_UNIFORM_BUFFER; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Unrecognized uniform buffer type!"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	uniformBufferPool->buffer = VULKAN_INTERNAL_CreateBuffer( | ||||||
|  | 		renderer, | ||||||
|  | 		UBO_BUFFER_SIZE, | ||||||
|  | 		resourceAccessType, | ||||||
|  | 		VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, | ||||||
|  | 		0, | ||||||
|  | 		1 | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	uniformBufferPool->nextAvailableOffset = 0; | ||||||
| 
 | 
 | ||||||
| 	uniformBufferPool->type = uniformBufferType; | 	uniformBufferPool->type = uniformBufferType; | ||||||
| 	uniformBufferPool->lock = SDL_CreateMutex(); | 	uniformBufferPool->lock = SDL_CreateMutex(); | ||||||
|  | @ -4230,12 +4272,6 @@ static void VULKAN_INTERNAL_BindUniformBuffer( | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->boundUniformBuffers[commandBuffer->boundUniformBufferCount] = uniformBuffer; | 	commandBuffer->boundUniformBuffers[commandBuffer->boundUniformBufferCount] = uniformBuffer; | ||||||
| 	commandBuffer->boundUniformBufferCount += 1; | 	commandBuffer->boundUniformBufferCount += 1; | ||||||
| 
 |  | ||||||
| 	VULKAN_INTERNAL_TrackBuffer( |  | ||||||
| 		renderer, |  | ||||||
| 		commandBuffer, |  | ||||||
| 		uniformBuffer->vulkanBufferContainer->vulkanBuffer |  | ||||||
| 	); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Buffer indirection so we can cleanly defrag */ | /* Buffer indirection so we can cleanly defrag */ | ||||||
|  | @ -4304,22 +4340,18 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer( | ||||||
| 
 | 
 | ||||||
| 	VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer)); | 	VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer)); | ||||||
| 	uniformBuffer->pool = bufferPool; | 	uniformBuffer->pool = bufferPool; | ||||||
| 	uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer( | 	uniformBuffer->poolOffset = bufferPool->nextAvailableOffset; | ||||||
| 		renderer, | 	uniformBuffer->offset = 0; | ||||||
| 		UBO_BUFFER_SIZE, |  | ||||||
| 		resourceAccessType, |  | ||||||
| 		VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, |  | ||||||
| 		0 |  | ||||||
| 	); |  | ||||||
| 
 | 
 | ||||||
| 	if (uniformBuffer->vulkanBufferContainer == NULL) | 	bufferPool->nextAvailableOffset += UBO_SECTION_SIZE; | ||||||
|  | 
 | ||||||
|  | 	if (bufferPool->nextAvailableOffset >= UBO_BUFFER_SIZE) | ||||||
| 	{ | 	{ | ||||||
| 		Refresh_LogError("Failed to create buffer for uniform buffer!"); | 		Refresh_LogError("Uniform buffer overflow!"); | ||||||
|  | 		SDL_free(uniformBuffer); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	uniformBuffer->offset = 0; |  | ||||||
| 
 |  | ||||||
| 	/* Allocate a descriptor set for the uniform buffer */ | 	/* Allocate a descriptor set for the uniform buffer */ | ||||||
| 
 | 
 | ||||||
| 	if (bufferPool->descriptorPool.availableDescriptorSetCount == 0) | 	if (bufferPool->descriptorPool.availableDescriptorSetCount == 0) | ||||||
|  | @ -4329,6 +4361,7 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer( | ||||||
| 			&bufferPool->descriptorPool | 			&bufferPool->descriptorPool | ||||||
| 		)) { | 		)) { | ||||||
| 			Refresh_LogError("Failed to add uniform descriptor pool!"); | 			Refresh_LogError("Failed to add uniform descriptor pool!"); | ||||||
|  | 			SDL_free(uniformBuffer); | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -4393,15 +4426,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer( | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer)); | 	VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer)); | ||||||
| 	uniformBuffer->pool = NULL; | 	uniformBuffer->poolOffset = 0; | ||||||
| 	uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer( |  | ||||||
| 		renderer, |  | ||||||
| 		1, |  | ||||||
| 		resourceAccessType, |  | ||||||
| 		VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, |  | ||||||
| 		1 |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	uniformBuffer->offset = 0; | 	uniformBuffer->offset = 0; | ||||||
| 
 | 
 | ||||||
| 	/* Allocate a descriptor set for the uniform buffer */ | 	/* Allocate a descriptor set for the uniform buffer */ | ||||||
|  | @ -4416,7 +4441,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer( | ||||||
| 
 | 
 | ||||||
| 	/* Update the descriptor set for the first and last time! */ | 	/* Update the descriptor set for the first and last time! */ | ||||||
| 
 | 
 | ||||||
| 	descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer; | 	descriptorBufferInfo.buffer = renderer->dummyBuffer->buffer; | ||||||
| 	descriptorBufferInfo.offset = 0; | 	descriptorBufferInfo.offset = 0; | ||||||
| 	descriptorBufferInfo.range = VK_WHOLE_SIZE; | 	descriptorBufferInfo.range = VK_WHOLE_SIZE; | ||||||
| 
 | 
 | ||||||
|  | @ -4463,11 +4488,11 @@ static void VULKAN_INTERNAL_DestroyUniformBufferPool( | ||||||
| 	/* This is always destroyed after submissions, so all buffers are available */ | 	/* This is always destroyed after submissions, so all buffers are available */ | ||||||
| 	for (i = 0; i < uniformBufferPool->availableBufferCount; i += 1) | 	for (i = 0; i < uniformBufferPool->availableBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->availableBuffers[i]->vulkanBufferContainer->vulkanBuffer); |  | ||||||
| 		SDL_free(uniformBufferPool->availableBuffers[i]->vulkanBufferContainer); |  | ||||||
| 		SDL_free(uniformBufferPool->availableBuffers[i]); | 		SDL_free(uniformBufferPool->availableBuffers[i]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->buffer); | ||||||
|  | 
 | ||||||
| 	SDL_DestroyMutex(uniformBufferPool->lock); | 	SDL_DestroyMutex(uniformBufferPool->lock); | ||||||
| 	SDL_free(uniformBufferPool->availableBuffers); | 	SDL_free(uniformBufferPool->availableBuffers); | ||||||
| 	SDL_free(uniformBufferPool); | 	SDL_free(uniformBufferPool); | ||||||
|  | @ -4502,8 +4527,8 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_AcquireUniformBufferFromPool( | ||||||
| 
 | 
 | ||||||
| 	/* Update the descriptor set with the correct range */ | 	/* Update the descriptor set with the correct range */ | ||||||
| 
 | 
 | ||||||
| 	descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer; | 	descriptorBufferInfo.buffer = uniformBuffer->pool->buffer->buffer; | ||||||
| 	descriptorBufferInfo.offset = 0; | 	descriptorBufferInfo.offset = uniformBuffer->poolOffset; | ||||||
| 	descriptorBufferInfo.range = blockSize; | 	descriptorBufferInfo.range = blockSize; | ||||||
| 
 | 
 | ||||||
| 	writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | 	writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | ||||||
|  | @ -5183,13 +5208,7 @@ static void VULKAN_DestroyDevice( | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->submittedCommandBuffers); | 	SDL_free(renderer->submittedCommandBuffers); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBufferContainer->vulkanBuffer); | 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyBuffer); | ||||||
| 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer); |  | ||||||
| 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyComputeUniformBuffer->vulkanBufferContainer->vulkanBuffer); |  | ||||||
| 
 |  | ||||||
| 	SDL_free(renderer->dummyVertexUniformBuffer->vulkanBufferContainer); |  | ||||||
| 	SDL_free(renderer->dummyFragmentUniformBuffer->vulkanBufferContainer); |  | ||||||
| 	SDL_free(renderer->dummyComputeUniformBuffer->vulkanBufferContainer); |  | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->dummyVertexUniformBuffer); | 	SDL_free(renderer->dummyVertexUniformBuffer); | ||||||
| 	SDL_free(renderer->dummyFragmentUniformBuffer); | 	SDL_free(renderer->dummyFragmentUniformBuffer); | ||||||
|  | @ -5942,6 +5961,41 @@ static VulkanRenderTarget* VULKAN_INTERNAL_FetchRenderTarget( | ||||||
| 	return renderTarget; | 	return renderTarget; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static VkImageLayout VULKAN_INTERNAL_GetRenderPassFinalLayout( | ||||||
|  | 	VulkanTexture *texture | ||||||
|  | ) { | ||||||
|  | 	VkImageLayout finalLayout; | ||||||
|  | 
 | ||||||
|  | 	if (IsDepthFormat(texture->format)) | ||||||
|  | 	{ | ||||||
|  | 		if (texture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | ||||||
|  | 		{ | ||||||
|  | 			finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		if (texture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | ||||||
|  | 		{ | ||||||
|  | 			finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; | ||||||
|  | 		} | ||||||
|  | 		else if (texture->usageFlags & VK_IMAGE_USAGE_STORAGE_BIT) | ||||||
|  | 		{ | ||||||
|  | 			finalLayout = VK_IMAGE_LAYOUT_GENERAL; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return finalLayout; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanCommandBuffer *commandBuffer, | 	VulkanCommandBuffer *commandBuffer, | ||||||
|  | @ -5956,6 +6010,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 	VkAttachmentReference depthStencilAttachmentReference; | 	VkAttachmentReference depthStencilAttachmentReference; | ||||||
| 	VkRenderPassCreateInfo renderPassCreateInfo; | 	VkRenderPassCreateInfo renderPassCreateInfo; | ||||||
| 	VkSubpassDescription subpass; | 	VkSubpassDescription subpass; | ||||||
|  | 	VkSubpassDependency dep[2]; | ||||||
| 	VkRenderPass renderPass; | 	VkRenderPass renderPass; | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 
 | 
 | ||||||
|  | @ -6008,7 +6063,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].initialLayout = | 			attachmentDescriptions[attachmentDescriptionCount].initialLayout = | ||||||
| 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].finalLayout = | 			attachmentDescriptions[attachmentDescriptionCount].finalLayout = | ||||||
| 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 				VULKAN_INTERNAL_GetRenderPassFinalLayout(texture); | ||||||
| 
 | 
 | ||||||
| 			resolveReferences[resolveReferenceCount].attachment = | 			resolveReferences[resolveReferenceCount].attachment = | ||||||
| 				attachmentDescriptionCount; | 				attachmentDescriptionCount; | ||||||
|  | @ -6064,8 +6119,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].initialLayout = | 			attachmentDescriptions[attachmentDescriptionCount].initialLayout = | ||||||
| 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].finalLayout = | 			attachmentDescriptions[attachmentDescriptionCount].finalLayout = | ||||||
| 				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 				VULKAN_INTERNAL_GetRenderPassFinalLayout(texture); | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 			colorAttachmentReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount; | 			colorAttachmentReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount; | ||||||
| 			colorAttachmentReferences[colorAttachmentReferenceCount].layout = | 			colorAttachmentReferences[colorAttachmentReferenceCount].layout = | ||||||
|  | @ -6113,7 +6167,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 		attachmentDescriptions[attachmentDescriptionCount].initialLayout = | 		attachmentDescriptions[attachmentDescriptionCount].initialLayout = | ||||||
| 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; | 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; | ||||||
| 		attachmentDescriptions[attachmentDescriptionCount].finalLayout = | 		attachmentDescriptions[attachmentDescriptionCount].finalLayout = | ||||||
| 			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; | 			VULKAN_INTERNAL_GetRenderPassFinalLayout(texture); | ||||||
| 
 | 
 | ||||||
| 		depthStencilAttachmentReference.attachment = | 		depthStencilAttachmentReference.attachment = | ||||||
| 			attachmentDescriptionCount; | 			attachmentDescriptionCount; | ||||||
|  | @ -6135,6 +6189,37 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 		subpass.pResolveAttachments = NULL; | 		subpass.pResolveAttachments = NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	const VkPipelineStageFlags graphicsStages = 0 | ||||||
|  | 		| VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | ||||||
|  | 		; | ||||||
|  | 	const VkPipelineStageFlags outsideStages = 0 | ||||||
|  | 		| graphicsStages | ||||||
|  | 		| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_TRANSFER_BIT | ||||||
|  | 		; | ||||||
|  | 
 | ||||||
|  | 	dep[0].srcSubpass      = VK_SUBPASS_EXTERNAL; | ||||||
|  | 	dep[0].dstSubpass      = 0; | ||||||
|  | 	dep[0].srcStageMask    = outsideStages; | ||||||
|  | 	dep[0].dstStageMask    = graphicsStages; | ||||||
|  | 	dep[0].srcAccessMask   = VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[0].dstAccessMask   = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[0].dependencyFlags = 0; | ||||||
|  | 
 | ||||||
|  | 	dep[1].srcSubpass      = 0; | ||||||
|  | 	dep[1].dstSubpass      = VK_SUBPASS_EXTERNAL; | ||||||
|  | 	dep[1].srcStageMask    = graphicsStages; | ||||||
|  | 	dep[1].dstStageMask    = outsideStages; | ||||||
|  | 	dep[1].srcAccessMask   = VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[1].dstAccessMask   = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[1].dependencyFlags = 0; | ||||||
|  | 
 | ||||||
| 	renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; | 	renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; | ||||||
| 	renderPassCreateInfo.pNext = NULL; | 	renderPassCreateInfo.pNext = NULL; | ||||||
| 	renderPassCreateInfo.flags = 0; | 	renderPassCreateInfo.flags = 0; | ||||||
|  | @ -6142,8 +6227,8 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 	renderPassCreateInfo.attachmentCount = attachmentDescriptionCount; | 	renderPassCreateInfo.attachmentCount = attachmentDescriptionCount; | ||||||
| 	renderPassCreateInfo.subpassCount = 1; | 	renderPassCreateInfo.subpassCount = 1; | ||||||
| 	renderPassCreateInfo.pSubpasses = &subpass; | 	renderPassCreateInfo.pSubpasses = &subpass; | ||||||
| 	renderPassCreateInfo.dependencyCount = 0; | 	renderPassCreateInfo.dependencyCount = 2; | ||||||
| 	renderPassCreateInfo.pDependencies = NULL; | 	renderPassCreateInfo.pDependencies = dep; | ||||||
| 
 | 
 | ||||||
| 	vulkanResult = renderer->vkCreateRenderPass( | 	vulkanResult = renderer->vkCreateRenderPass( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
|  | @ -6172,6 +6257,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass( | ||||||
| 	VkAttachmentReference depthStencilAttachmentReference; | 	VkAttachmentReference depthStencilAttachmentReference; | ||||||
| 	Refresh_ColorAttachmentDescription attachmentDescription; | 	Refresh_ColorAttachmentDescription attachmentDescription; | ||||||
| 	VkSubpassDescription subpass; | 	VkSubpassDescription subpass; | ||||||
|  | 	VkSubpassDependency dep[2]; | ||||||
| 	VkRenderPassCreateInfo renderPassCreateInfo; | 	VkRenderPassCreateInfo renderPassCreateInfo; | ||||||
| 	VkRenderPass renderPass; | 	VkRenderPass renderPass; | ||||||
| 	VkResult result; | 	VkResult result; | ||||||
|  | @ -6182,6 +6268,7 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass( | ||||||
| 	uint32_t resolveReferenceCount = 0; | 	uint32_t resolveReferenceCount = 0; | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 
 | 
 | ||||||
|  | 	/* Note: Render pass compatibility does not care about layout */ | ||||||
| 	for (i = 0; i < attachmentInfo.colorAttachmentCount; i += 1) | 	for (i = 0; i < attachmentInfo.colorAttachmentCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		attachmentDescription = attachmentInfo.colorAttachmentDescriptions[i]; | 		attachmentDescription = attachmentInfo.colorAttachmentDescriptions[i]; | ||||||
|  | @ -6315,6 +6402,37 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass( | ||||||
| 		subpass.pResolveAttachments = NULL; | 		subpass.pResolveAttachments = NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	const VkPipelineStageFlags graphicsStages = 0 | ||||||
|  | 		| VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | ||||||
|  | 		; | ||||||
|  | 	const VkPipelineStageFlags outsideStages = 0 | ||||||
|  | 		| graphicsStages | ||||||
|  | 		| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | ||||||
|  | 		| VK_PIPELINE_STAGE_TRANSFER_BIT | ||||||
|  | 		; | ||||||
|  | 
 | ||||||
|  | 	dep[0].srcSubpass      = VK_SUBPASS_EXTERNAL; | ||||||
|  | 	dep[0].dstSubpass      = 0; | ||||||
|  | 	dep[0].srcStageMask    = outsideStages; | ||||||
|  | 	dep[0].dstStageMask    = graphicsStages; | ||||||
|  | 	dep[0].srcAccessMask   = VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[0].dstAccessMask   = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[0].dependencyFlags = 0; | ||||||
|  | 
 | ||||||
|  | 	dep[1].srcSubpass      = 0; | ||||||
|  | 	dep[1].dstSubpass      = VK_SUBPASS_EXTERNAL; | ||||||
|  | 	dep[1].srcStageMask    = graphicsStages; | ||||||
|  | 	dep[1].dstStageMask    = outsideStages; | ||||||
|  | 	dep[1].srcAccessMask   = VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[1].dstAccessMask   = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; | ||||||
|  | 	dep[1].dependencyFlags = 0; | ||||||
|  | 
 | ||||||
| 	renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; | 	renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; | ||||||
| 	renderPassCreateInfo.pNext = NULL; | 	renderPassCreateInfo.pNext = NULL; | ||||||
| 	renderPassCreateInfo.flags = 0; | 	renderPassCreateInfo.flags = 0; | ||||||
|  | @ -6322,8 +6440,8 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass( | ||||||
| 	renderPassCreateInfo.attachmentCount = attachmentDescriptionCount; | 	renderPassCreateInfo.attachmentCount = attachmentDescriptionCount; | ||||||
| 	renderPassCreateInfo.subpassCount = 1; | 	renderPassCreateInfo.subpassCount = 1; | ||||||
| 	renderPassCreateInfo.pSubpasses = &subpass; | 	renderPassCreateInfo.pSubpasses = &subpass; | ||||||
| 	renderPassCreateInfo.dependencyCount = 0; | 	renderPassCreateInfo.dependencyCount = 2; | ||||||
| 	renderPassCreateInfo.pDependencies = NULL; | 	renderPassCreateInfo.pDependencies = dep; | ||||||
| 
 | 
 | ||||||
| 	result = renderer->vkCreateRenderPass( | 	result = renderer->vkCreateRenderPass( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
|  | @ -7764,6 +7882,14 @@ static void VULKAN_SetBufferData( | ||||||
| 		vulkanBuffer | 		vulkanBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	// this janky call will wait for transfer writes to finish!
 | ||||||
|  | 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
|  | 		renderer, | ||||||
|  | 		vulkanCommandBuffer->commandBuffer, | ||||||
|  | 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
|  | 		vulkanBuffer | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| 	bufferCopy.srcOffset = transferBuffer->offset; | 	bufferCopy.srcOffset = transferBuffer->offset; | ||||||
| 	bufferCopy.dstOffset = offsetInBytes; | 	bufferCopy.dstOffset = offsetInBytes; | ||||||
| 	bufferCopy.size = (VkDeviceSize) dataLength; | 	bufferCopy.size = (VkDeviceSize) dataLength; | ||||||
|  | @ -7815,7 +7941,7 @@ static uint32_t VULKAN_PushVertexShaderUniforms( | ||||||
| 	if ( | 	if ( | ||||||
| 		vulkanCommandBuffer->vertexUniformBuffer->offset + | 		vulkanCommandBuffer->vertexUniformBuffer->offset + | ||||||
| 		graphicsPipeline->vertexUniformBlockSize >= | 		graphicsPipeline->vertexUniformBlockSize >= | ||||||
| 		UBO_BUFFER_SIZE | 		UBO_SECTION_SIZE | ||||||
| 	) { | 	) { | ||||||
| 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | ||||||
| 		VULKAN_INTERNAL_BindUniformBuffer( | 		VULKAN_INTERNAL_BindUniformBuffer( | ||||||
|  | @ -7833,8 +7959,8 @@ static uint32_t VULKAN_PushVertexShaderUniforms( | ||||||
| 	offset = vulkanCommandBuffer->vertexUniformBuffer->offset; | 	offset = vulkanCommandBuffer->vertexUniformBuffer->offset; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_SetBufferData( | 	VULKAN_INTERNAL_SetBufferData( | ||||||
| 		vulkanCommandBuffer->vertexUniformBuffer->vulkanBufferContainer->vulkanBuffer, | 		vulkanCommandBuffer->vertexUniformBuffer->pool->buffer, | ||||||
| 		vulkanCommandBuffer->vertexUniformBuffer->offset, | 		vulkanCommandBuffer->vertexUniformBuffer->poolOffset + vulkanCommandBuffer->vertexUniformBuffer->offset, | ||||||
| 		data, | 		data, | ||||||
| 		dataLengthInBytes | 		dataLengthInBytes | ||||||
| 	); | 	); | ||||||
|  | @ -7859,7 +7985,7 @@ static uint32_t VULKAN_PushFragmentShaderUniforms( | ||||||
| 	if ( | 	if ( | ||||||
| 		vulkanCommandBuffer->fragmentUniformBuffer->offset + | 		vulkanCommandBuffer->fragmentUniformBuffer->offset + | ||||||
| 		graphicsPipeline->fragmentUniformBlockSize >= | 		graphicsPipeline->fragmentUniformBlockSize >= | ||||||
| 		UBO_BUFFER_SIZE | 		UBO_SECTION_SIZE | ||||||
| 	) { | 	) { | ||||||
| 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | ||||||
| 		VULKAN_INTERNAL_BindUniformBuffer( | 		VULKAN_INTERNAL_BindUniformBuffer( | ||||||
|  | @ -7877,8 +8003,8 @@ static uint32_t VULKAN_PushFragmentShaderUniforms( | ||||||
| 	offset = vulkanCommandBuffer->fragmentUniformBuffer->offset; | 	offset = vulkanCommandBuffer->fragmentUniformBuffer->offset; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_SetBufferData( | 	VULKAN_INTERNAL_SetBufferData( | ||||||
| 		vulkanCommandBuffer->fragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer, | 		vulkanCommandBuffer->fragmentUniformBuffer->pool->buffer, | ||||||
| 		vulkanCommandBuffer->fragmentUniformBuffer->offset, | 		vulkanCommandBuffer->fragmentUniformBuffer->poolOffset + vulkanCommandBuffer->fragmentUniformBuffer->offset, | ||||||
| 		data, | 		data, | ||||||
| 		dataLengthInBytes | 		dataLengthInBytes | ||||||
| 	); | 	); | ||||||
|  | @ -7902,7 +8028,7 @@ static uint32_t VULKAN_PushComputeShaderUniforms( | ||||||
| 	if ( | 	if ( | ||||||
| 		vulkanCommandBuffer->computeUniformBuffer->offset + | 		vulkanCommandBuffer->computeUniformBuffer->offset + | ||||||
| 		computePipeline->uniformBlockSize >= | 		computePipeline->uniformBlockSize >= | ||||||
| 		UBO_BUFFER_SIZE | 		UBO_SECTION_SIZE | ||||||
| 	) { | 	) { | ||||||
| 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | 		/* We're out of space in this buffer, bind the old one and acquire a new one */ | ||||||
| 		VULKAN_INTERNAL_BindUniformBuffer( | 		VULKAN_INTERNAL_BindUniformBuffer( | ||||||
|  | @ -7920,8 +8046,8 @@ static uint32_t VULKAN_PushComputeShaderUniforms( | ||||||
| 	offset = vulkanCommandBuffer->computeUniformBuffer->offset; | 	offset = vulkanCommandBuffer->computeUniformBuffer->offset; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_SetBufferData( | 	VULKAN_INTERNAL_SetBufferData( | ||||||
| 		vulkanCommandBuffer->computeUniformBuffer->vulkanBufferContainer->vulkanBuffer, | 		vulkanCommandBuffer->computeUniformBuffer->pool->buffer, | ||||||
| 		vulkanCommandBuffer->computeUniformBuffer->offset, | 		vulkanCommandBuffer->computeUniformBuffer->poolOffset + vulkanCommandBuffer->computeUniformBuffer->offset, | ||||||
| 		data, | 		data, | ||||||
| 		dataLengthInBytes | 		dataLengthInBytes | ||||||
| 	); | 	); | ||||||
|  | @ -8468,6 +8594,8 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( | ||||||
| 		hash.depthStencilTargetDescription.stencilStoreOp = depthStencilAttachmentInfo->stencilStoreOp; | 		hash.depthStencilTargetDescription.stencilStoreOp = depthStencilAttachmentInfo->stencilStoreOp; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	hash.finalLayout = VULKAN_INTERNAL_GetRenderPassFinalLayout(texture); | ||||||
|  | 
 | ||||||
| 	renderPass = RenderPassHashArray_Fetch( | 	renderPass = RenderPassHashArray_Fetch( | ||||||
| 		&renderer->renderPassHashArray, | 		&renderer->renderPassHashArray, | ||||||
| 		&hash | 		&hash | ||||||
|  | @ -9026,35 +9154,11 @@ static void VULKAN_EndRenderPass( | ||||||
| 
 | 
 | ||||||
| 		if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | 		if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | ||||||
| 		{ | 		{ | ||||||
| 			VULKAN_INTERNAL_ImageMemoryBarrier( | 			currentTexture->resourceAccessType = RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE; | ||||||
| 				renderer, |  | ||||||
| 				vulkanCommandBuffer->commandBuffer, |  | ||||||
| 				RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE, |  | ||||||
| 				currentTexture->aspectFlags, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->layerCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->levelCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->image, |  | ||||||
| 				¤tTexture->resourceAccessType |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 		else if (currentTexture->usageFlags & VK_IMAGE_USAGE_STORAGE_BIT) | 		else if (currentTexture->usageFlags & VK_IMAGE_USAGE_STORAGE_BIT) | ||||||
| 		{ | 		{ | ||||||
| 			VULKAN_INTERNAL_ImageMemoryBarrier( | 			currentTexture->resourceAccessType = RESOURCE_ACCESS_COMPUTE_SHADER_STORAGE_IMAGE_READ_WRITE; | ||||||
| 				renderer, |  | ||||||
| 				vulkanCommandBuffer->commandBuffer, |  | ||||||
| 				RESOURCE_ACCESS_COMPUTE_SHADER_STORAGE_IMAGE_READ_WRITE, |  | ||||||
| 				currentTexture->aspectFlags, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->layerCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->levelCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->image, |  | ||||||
| 				¤tTexture->resourceAccessType |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	vulkanCommandBuffer->renderPassColorTargetCount = 0; | 	vulkanCommandBuffer->renderPassColorTargetCount = 0; | ||||||
|  | @ -9065,19 +9169,7 @@ static void VULKAN_EndRenderPass( | ||||||
| 
 | 
 | ||||||
| 		if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | 		if (currentTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | ||||||
| 		{ | 		{ | ||||||
| 			VULKAN_INTERNAL_ImageMemoryBarrier( | 			currentTexture->resourceAccessType = RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE; | ||||||
| 				renderer, |  | ||||||
| 				vulkanCommandBuffer->commandBuffer, |  | ||||||
| 				RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE, |  | ||||||
| 				currentTexture->aspectFlags, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->layerCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->levelCount, |  | ||||||
| 				0, |  | ||||||
| 				currentTexture->image, |  | ||||||
| 				¤tTexture->resourceAccessType |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	vulkanCommandBuffer->renderPassDepthTexture = NULL; | 	vulkanCommandBuffer->renderPassDepthTexture = NULL; | ||||||
|  | @ -11992,6 +12084,15 @@ static Refresh_Device* VULKAN_CreateDevice( | ||||||
| 
 | 
 | ||||||
| 	/* Dummy Uniform Buffers */ | 	/* Dummy Uniform Buffers */ | ||||||
| 
 | 
 | ||||||
|  | 	renderer->dummyBuffer = VULKAN_INTERNAL_CreateBuffer( | ||||||
|  | 		renderer, | ||||||
|  | 		1, | ||||||
|  | 		RESOURCE_ACCESS_GENERAL, | ||||||
|  | 		VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, | ||||||
|  | 		0, | ||||||
|  | 		1 | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| 	renderer->dummyVertexUniformBuffer = VULKAN_INTERNAL_CreateDummyUniformBuffer( | 	renderer->dummyVertexUniformBuffer = VULKAN_INTERNAL_CreateDummyUniformBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		UNIFORM_BUFFER_VERTEX | 		UNIFORM_BUFFER_VERTEX | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue