implement SetData and GetData
							parent
							
								
									0c095fa56d
								
							
						
					
					
						commit
						6674076423
					
				|  | @ -695,11 +695,32 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] = | |||
| 
 | ||||
| /* Memory structures */ | ||||
| 
 | ||||
| typedef struct VulkanBufferContainer /* cast from Refresh_Buffer */ | ||||
| /* We use pointer indirection so that defrag can occur without objects
 | ||||
|  * needing to be aware of the backing buffers changing. | ||||
|  */ | ||||
| typedef struct VulkanBufferContainer | ||||
| { | ||||
| 	VulkanBuffer *vulkanBuffer; | ||||
| } VulkanBufferContainer; | ||||
| 
 | ||||
| /* CpuBuffers consist of multiple backing buffer containers so that data transfers
 | ||||
|  * can occur safely without the client having to explicitly manage transfer timing. | ||||
|  */ | ||||
| typedef struct VulkanCpuBufferContainer /* cast from Refresh_CpuBuffer */ | ||||
| { | ||||
| 	uint32_t sizeInBytes; | ||||
| 	VulkanBufferContainer *activeBuffer; | ||||
| 
 | ||||
| 	/* These are all the buffers that have been used by this container.
 | ||||
| 	 * If a buffer is bound and then updated with Discard, a new buffer | ||||
| 	 * will be added to this list. | ||||
| 	 * These can be reused after they are submitted and command processing is complete. | ||||
| 	 */ | ||||
| 	uint32_t bufferCapacity; | ||||
| 	uint32_t bufferCount; | ||||
| 	VulkanBufferContainer **backingBuffers; | ||||
| } VulkanCpuBufferContainer; | ||||
| 
 | ||||
| struct VulkanBuffer | ||||
| { | ||||
| 	VkBuffer buffer; | ||||
|  | @ -711,10 +732,13 @@ struct VulkanBuffer | |||
| 	uint8_t requireHostVisible; | ||||
| 	uint8_t preferDeviceLocal; | ||||
| 	uint8_t requireHostLocal; | ||||
| 	uint8_t preserveContentsOnDefrag; | ||||
| 
 | ||||
| 	SDL_atomic_t referenceCount; /* Tracks command buffer usage */ | ||||
| 
 | ||||
| 	VulkanBufferContainer *container; | ||||
| 
 | ||||
| 	uint8_t markedForDestroy; /* so that defrag doesn't double-free */ | ||||
| }; | ||||
| 
 | ||||
| typedef enum VulkanUniformBufferType | ||||
|  | @ -802,6 +826,8 @@ struct VulkanTexture | |||
| 	SDL_atomic_t referenceCount; | ||||
| 
 | ||||
| 	VulkanTextureContainer *container; | ||||
| 
 | ||||
| 	uint8_t markedForDestroy; /* so that defrag doesn't double-free */ | ||||
| }; | ||||
| 
 | ||||
| typedef struct VulkanRenderTarget | ||||
|  | @ -3248,6 +3274,28 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier( | |||
| 
 | ||||
| /* Resource tracking */ | ||||
| 
 | ||||
| #define ADD_TO_ARRAY_UNIQUE(resource, type, array, count, capacity) \ | ||||
| 	uint32_t i; \ | ||||
| 	\ | ||||
| 	for (i = 0; i < commandBuffer->count; i += 1) \ | ||||
| 	{ \ | ||||
| 		if (commandBuffer->array[i] == resource) \ | ||||
| 		{ \ | ||||
| 			return; \ | ||||
| 		} \ | ||||
| 	} \ | ||||
| 	\ | ||||
| 	if (commandBuffer->count == commandBuffer->capacity) \ | ||||
| 	{ \ | ||||
| 		commandBuffer->capacity += 1; \ | ||||
| 		commandBuffer->array = SDL_realloc( \ | ||||
| 			commandBuffer->array, \ | ||||
| 			commandBuffer->capacity * sizeof(type) \ | ||||
| 		); \ | ||||
| 	} \ | ||||
| 	commandBuffer->array[commandBuffer->count] = resource; \ | ||||
| 	commandBuffer->count += 1; | ||||
| 
 | ||||
| #define TRACK_RESOURCE(resource, type, array, count, capacity) \ | ||||
| 	uint32_t i; \ | ||||
| 	\ | ||||
|  | @ -3269,10 +3317,8 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier( | |||
| 	} \ | ||||
| 	commandBuffer->array[commandBuffer->count] = resource; \ | ||||
| 	commandBuffer->count += 1; \ | ||||
| 	\ | ||||
| 	SDL_AtomicIncRef(&resource->referenceCount); | ||||
| 
 | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_TrackBuffer( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanCommandBuffer *commandBuffer, | ||||
|  | @ -3391,7 +3437,7 @@ static void VULKAN_INTERNAL_TrackCopiedTexture( | |||
| 	VulkanCommandBuffer *commandBuffer, | ||||
| 	VulkanTexture *texture | ||||
| ) { | ||||
| 	TRACK_RESOURCE( | ||||
| 	ADD_TO_ARRAY_UNIQUE( | ||||
| 		texture, | ||||
| 		VulkanTexture*, | ||||
| 		copiedTextures, | ||||
|  | @ -3406,7 +3452,7 @@ static void VULKAN_INTERNAL_TrackCopiedBuffer( | |||
| 	VulkanCommandBuffer *commandBuffer, | ||||
| 	VulkanBuffer *buffer | ||||
| ) { | ||||
| 	TRACK_RESOURCE( | ||||
| 	ADD_TO_ARRAY_UNIQUE( | ||||
| 		buffer, | ||||
| 		VulkanBuffer*, | ||||
| 		copiedGpuBuffers, | ||||
|  | @ -4145,7 +4191,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | |||
| 	uint8_t requireHostVisible, | ||||
| 	uint8_t requireHostLocal, | ||||
| 	uint8_t preferDeviceLocal, | ||||
| 	uint8_t dedicatedAllocation | ||||
| 	uint8_t dedicatedAllocation, | ||||
| 	uint8_t preserveContentsOnDefrag | ||||
| ) { | ||||
| 	VulkanBuffer* buffer; | ||||
| 	VkResult vulkanResult; | ||||
|  | @ -4160,6 +4207,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | |||
| 	buffer->requireHostVisible = requireHostVisible; | ||||
| 	buffer->requireHostLocal = requireHostLocal; | ||||
| 	buffer->preferDeviceLocal = preferDeviceLocal; | ||||
| 	buffer->preserveContentsOnDefrag = preserveContentsOnDefrag; | ||||
| 	buffer->markedForDestroy = 0; | ||||
| 
 | ||||
| 	bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | ||||
| 	bufferCreateInfo.pNext = NULL; | ||||
|  | @ -4277,6 +4326,7 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject( | |||
| 		1, | ||||
| 		0, | ||||
| 		1, | ||||
| 		1, | ||||
| 		1 | ||||
| 	); | ||||
| 
 | ||||
|  | @ -4321,12 +4371,17 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject( | |||
| 	return uniformBufferObject; | ||||
| } | ||||
| 
 | ||||
| /* Buffer indirection so we can cleanly defrag GpuBuffers */ | ||||
| /* Indirection so we can cleanly defrag buffers */ | ||||
| static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	uint32_t sizeInBytes, | ||||
| 	VulkanResourceAccessType resourceAccessType, | ||||
| 	VkBufferUsageFlags usageFlags | ||||
| 	VkBufferUsageFlags usageFlags, | ||||
| 	uint8_t requireHostVisible, | ||||
| 	uint8_t requireHostLocal, | ||||
| 	uint8_t preferDeviceLocal, | ||||
| 	uint8_t dedicatedAllocation, | ||||
| 	uint8_t preserveContentsOnDefrag | ||||
| ) { | ||||
| 	VulkanBufferContainer* bufferContainer; | ||||
| 	VulkanBuffer* buffer; | ||||
|  | @ -4339,10 +4394,11 @@ static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer( | |||
| 		sizeInBytes, | ||||
| 		resourceAccessType, | ||||
| 		usageFlags, | ||||
| 		0, | ||||
| 		0, | ||||
| 		1, | ||||
| 		0 | ||||
| 		requireHostVisible, | ||||
| 		requireHostLocal, | ||||
| 		preferDeviceLocal, | ||||
| 		dedicatedAllocation, | ||||
| 		preserveContentsOnDefrag | ||||
| 	); | ||||
| 
 | ||||
| 	if (buffer == NULL) | ||||
|  | @ -5413,6 +5469,7 @@ static VulkanTexture* VULKAN_INTERNAL_CreateTexture( | |||
| 
 | ||||
| 	texture->isCube = 0; | ||||
| 	texture->is3D = 0; | ||||
| 	texture->markedForDestroy = 0; | ||||
| 
 | ||||
| 	if (isCube) | ||||
| 	{ | ||||
|  | @ -6812,20 +6869,26 @@ static Refresh_GpuBuffer* VULKAN_CreateGpuBuffer( | |||
| 		(VulkanRenderer*) driverData, | ||||
| 		sizeInBytes, | ||||
| 		resourceAccessType, | ||||
| 		vulkanUsageFlags | ||||
| 		vulkanUsageFlags, | ||||
| 		0, | ||||
| 		0, | ||||
| 		1, | ||||
| 		0, | ||||
| 		1 | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer( | ||||
| 	Refresh_Renderer *driverData, | ||||
| 	uint32_t sizeInBytes, | ||||
| 	void **pDataPtr | ||||
| 	uint32_t sizeInBytes | ||||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VkBufferUsageFlags vulkanUsageFlags = | ||||
| 		VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; | ||||
| 	VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) SDL_malloc(sizeof(VulkanCpuBufferContainer)); | ||||
| 
 | ||||
| 	VulkanBuffer *vulkanBuffer = VULKAN_INTERNAL_CreateBuffer( | ||||
| 	bufferContainer->sizeInBytes = sizeInBytes; | ||||
| 	bufferContainer->activeBuffer = VULKAN_INTERNAL_CreateBufferContainer( | ||||
| 		renderer, | ||||
| 		sizeInBytes, | ||||
| 		RESOURCE_ACCESS_NONE, | ||||
|  | @ -6833,12 +6896,18 @@ static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer( | |||
| 		1, | ||||
| 		1, | ||||
| 		0, | ||||
| 		1 | ||||
| 		0, | ||||
| 		0 | ||||
| 	); | ||||
| 
 | ||||
| 	*pDataPtr = vulkanBuffer->usedRegion->allocation->mapPointer; | ||||
| 	bufferContainer->bufferCapacity = 1; | ||||
| 	bufferContainer->bufferCount = 1; | ||||
| 	bufferContainer->backingBuffers = SDL_malloc( | ||||
| 		bufferContainer->bufferCapacity * sizeof(VulkanBufferContainer*) | ||||
| 	); | ||||
| 	bufferContainer->backingBuffers[0] = bufferContainer->activeBuffer; | ||||
| 
 | ||||
| 	return (Refresh_CpuBuffer*) vulkanBuffer; | ||||
| 	return (Refresh_CpuBuffer*) bufferContainer; | ||||
| } | ||||
| 
 | ||||
| /* Setters */ | ||||
|  | @ -7169,6 +7238,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture( | |||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanTexture *vulkanTexture | ||||
| ) { | ||||
| 	if (vulkanTexture->markedForDestroy) { return; } | ||||
| 
 | ||||
| 	SDL_LockMutex(renderer->disposeLock); | ||||
| 
 | ||||
| 	EXPAND_ARRAY_IF_NEEDED( | ||||
|  | @ -7184,6 +7255,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture( | |||
| 	] = vulkanTexture; | ||||
| 	renderer->texturesToDestroyCount += 1; | ||||
| 
 | ||||
| 	vulkanTexture->markedForDestroy = 1; | ||||
| 
 | ||||
| 	SDL_UnlockMutex(renderer->disposeLock); | ||||
| } | ||||
| 
 | ||||
|  | @ -7232,6 +7305,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer( | |||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanBuffer *vulkanBuffer | ||||
| ) { | ||||
| 	if (vulkanBuffer->markedForDestroy) { return; } | ||||
| 
 | ||||
| 	SDL_LockMutex(renderer->disposeLock); | ||||
| 
 | ||||
| 	EXPAND_ARRAY_IF_NEEDED( | ||||
|  | @ -7247,6 +7322,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer( | |||
| 	] = vulkanBuffer; | ||||
| 	renderer->buffersToDestroyCount += 1; | ||||
| 
 | ||||
| 	vulkanBuffer->markedForDestroy = 1; | ||||
| 
 | ||||
| 	SDL_UnlockMutex(renderer->disposeLock); | ||||
| } | ||||
| 
 | ||||
|  | @ -7262,7 +7339,7 @@ static void VULKAN_QueueDestroyGpuBuffer( | |||
| 
 | ||||
| 	VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer); | ||||
| 
 | ||||
| 	/* Containers are just client handles, so we can destroy immediately */ | ||||
| 	/* Containers are just client handles, so we can free immediately */ | ||||
| 	SDL_free(vulkanBufferContainer); | ||||
| 
 | ||||
| 	SDL_UnlockMutex(renderer->disposeLock); | ||||
|  | @ -7273,11 +7350,20 @@ static void VULKAN_QueueDestroyCpuBuffer( | |||
| 	Refresh_CpuBuffer *buffer | ||||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer; | ||||
| 	VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) buffer; | ||||
| 	uint32_t i; | ||||
| 
 | ||||
| 	SDL_LockMutex(renderer->disposeLock); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer); | ||||
| 	for (i = 0; i < bufferContainer->bufferCount; i += 1) | ||||
| 	{ | ||||
| 		VULKAN_INTERNAL_QueueDestroyBuffer(renderer, bufferContainer->backingBuffers[i]->vulkanBuffer); | ||||
| 		SDL_free(bufferContainer->backingBuffers[i]); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Containers are just client handles, so we can free immediately */ | ||||
| 	SDL_free(bufferContainer->backingBuffers); | ||||
| 	SDL_free(bufferContainer); | ||||
| 
 | ||||
| 	SDL_UnlockMutex(renderer->disposeLock); | ||||
| } | ||||
|  | @ -8342,6 +8428,108 @@ static void VULKAN_EndComputePass( | |||
| 	vulkanCommandBuffer->currentComputePipeline = NULL; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_DiscardActiveCpuBuffer( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer | ||||
| ) { | ||||
| 	VulkanBufferContainer *cpuBuffer; | ||||
| 	uint32_t i; | ||||
| 
 | ||||
| 	cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 0; | ||||
| 
 | ||||
| 	/* If a previously-discarded buffer is available, we can use that. */ | ||||
| 	for (i = 0; i < cpuBufferContainer->bufferCount; i += 1) | ||||
| 	{ | ||||
| 		cpuBuffer = cpuBufferContainer->backingBuffers[i]; | ||||
| 		if (SDL_AtomicGet(&cpuBuffer->vulkanBuffer->referenceCount) == 0) | ||||
| 		{ | ||||
| 			cpuBufferContainer->activeBuffer = cpuBuffer; | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* No buffer is available, generate a new one. */ | ||||
| 	cpuBufferContainer->activeBuffer = VULKAN_INTERNAL_CreateBufferContainer( | ||||
| 		renderer, | ||||
| 		cpuBufferContainer->sizeInBytes, | ||||
| 		RESOURCE_ACCESS_NONE, | ||||
| 		VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, | ||||
| 		1, | ||||
| 		1, | ||||
| 		0, | ||||
| 		0, | ||||
| 		0 | ||||
| 	); | ||||
| 
 | ||||
| 	EXPAND_ARRAY_IF_NEEDED( | ||||
| 		cpuBufferContainer->backingBuffers, | ||||
| 		VulkanBufferContainer*, | ||||
| 		cpuBufferContainer->bufferCount + 1, | ||||
| 		cpuBufferContainer->bufferCapacity, | ||||
| 		cpuBufferContainer->bufferCapacity * 2 | ||||
| 	); | ||||
| 
 | ||||
| 	cpuBufferContainer->backingBuffers[ | ||||
| 		cpuBufferContainer->bufferCount | ||||
| 	] = cpuBufferContainer->activeBuffer; | ||||
| 	cpuBufferContainer->bufferCount += 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_SetData( | ||||
| 	Refresh_Renderer *driverData, | ||||
| 	void* data, | ||||
| 	Refresh_CpuBuffer *cpuBuffer, | ||||
| 	Refresh_BufferCopy *copyParams, | ||||
| 	Refresh_SetDataOptions option | ||||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VulkanBuffer *vulkanBuffer = cpuBufferContainer->activeBuffer->vulkanBuffer; | ||||
| 
 | ||||
| 	if (option == REFRESH_SETDATAOPTIONS_DISCARD && SDL_AtomicGet(&vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 		VULKAN_INTERNAL_DiscardActiveCpuBuffer( | ||||
| 			renderer, | ||||
| 			cpuBufferContainer | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	uint8_t *bufferPointer = | ||||
| 		vulkanBuffer->usedRegion->allocation->mapPointer + | ||||
| 		vulkanBuffer->usedRegion->resourceOffset + | ||||
| 		copyParams->dstOffset; | ||||
| 
 | ||||
| 	SDL_memcpy( | ||||
| 		bufferPointer, | ||||
| 		((uint8_t*) data) + copyParams->srcOffset, | ||||
| 		copyParams->size | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_GetData( | ||||
| 	Refresh_Renderer *driverData, | ||||
| 	Refresh_CpuBuffer *cpuBuffer, | ||||
| 	void* data, | ||||
| 	Refresh_BufferCopy *copyParams | ||||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VulkanBuffer *vulkanBuffer = cpuBufferContainer->activeBuffer->vulkanBuffer; | ||||
| 
 | ||||
| 	uint8_t *bufferPointer = | ||||
| 		vulkanBuffer->usedRegion->allocation->mapPointer + | ||||
| 		vulkanBuffer->usedRegion->resourceOffset + | ||||
| 		copyParams->srcOffset; | ||||
| 
 | ||||
| 	SDL_memcpy( | ||||
| 		((uint8_t*) data) + copyParams->dstOffset, | ||||
| 		bufferPointer, | ||||
| 		copyParams->size | ||||
| 	); | ||||
| 
 | ||||
| 	vulkanBuffer->preserveContentsOnDefrag = 0; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_BeginCopyPass( | ||||
| 	Refresh_Renderer *driverData, | ||||
| 	Refresh_CommandBuffer *commandBuffer | ||||
|  | @ -8362,7 +8550,7 @@ static void VULKAN_UploadToTexture( | |||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | ||||
| 	VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
|  | @ -8370,7 +8558,7 @@ static void VULKAN_UploadToTexture( | |||
| 		renderer, | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		RESOURCE_ACCESS_TRANSFER_READ, | ||||
| 		vulkanCpuBuffer | ||||
| 		bufferContainer->activeBuffer->vulkanBuffer | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||
|  | @ -8403,14 +8591,14 @@ static void VULKAN_UploadToTexture( | |||
| 
 | ||||
| 	renderer->vkCmdCopyBufferToImage( | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		vulkanCpuBuffer->buffer, | ||||
| 		bufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||
| 		vulkanTexture->image, | ||||
| 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | ||||
| 		1, | ||||
| 		&imageCopy | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBuffer->vulkanBuffer); | ||||
| 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||
| 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||
| } | ||||
|  | @ -8424,7 +8612,7 @@ static void VULKAN_UploadToBuffer( | |||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | ||||
| 	VkBufferCopy bufferCopy; | ||||
| 
 | ||||
|  | @ -8432,7 +8620,7 @@ static void VULKAN_UploadToBuffer( | |||
| 		renderer, | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		RESOURCE_ACCESS_TRANSFER_READ, | ||||
| 		vulkanCpuBuffer | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
|  | @ -8448,13 +8636,13 @@ static void VULKAN_UploadToBuffer( | |||
| 
 | ||||
| 	renderer->vkCmdCopyBuffer( | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		vulkanCpuBuffer->buffer, | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||
| 		vulkanGpuBuffer->buffer, | ||||
| 		1, | ||||
| 		&bufferCopy | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||
| } | ||||
|  | @ -8469,14 +8657,14 @@ static void VULKAN_DownloadFromTexture( | |||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||
| 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | ||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 		renderer, | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||
| 		vulkanCpuBuffer | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||
|  | @ -8511,14 +8699,16 @@ static void VULKAN_DownloadFromTexture( | |||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		vulkanTexture->image, | ||||
| 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | ||||
| 		vulkanCpuBuffer->buffer, | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||
| 		1, | ||||
| 		&imageCopy | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer); | ||||
| 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||
| 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||
| 
 | ||||
| 	cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_DownloadFromBuffer( | ||||
|  | @ -8530,7 +8720,7 @@ static void VULKAN_DownloadFromBuffer( | |||
| ) { | ||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | ||||
| 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||
| 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | ||||
| 	VkBufferCopy bufferCopy; | ||||
| 
 | ||||
|  | @ -8538,7 +8728,7 @@ static void VULKAN_DownloadFromBuffer( | |||
| 		renderer, | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||
| 		vulkanCpuBuffer | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
|  | @ -8555,14 +8745,16 @@ static void VULKAN_DownloadFromBuffer( | |||
| 	renderer->vkCmdCopyBuffer( | ||||
| 		vulkanCommandBuffer->commandBuffer, | ||||
| 		vulkanGpuBuffer->buffer, | ||||
| 		vulkanCpuBuffer->buffer, | ||||
| 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||
| 		1, | ||||
| 		&bufferCopy | ||||
| 	); | ||||
| 
 | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||
| 
 | ||||
| 	cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_CopyTextureToTexture( | ||||
|  | @ -10118,7 +10310,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | |||
| 			currentRegion = allocation->usedRegions[i]; | ||||
| 			copyResourceAccessType = RESOURCE_ACCESS_NONE; | ||||
| 
 | ||||
| 			if (currentRegion->isBuffer) | ||||
| 			if (currentRegion->isBuffer && !currentRegion->vulkanBuffer->markedForDestroy) | ||||
| 			{ | ||||
| 				currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; | ||||
| 
 | ||||
|  | @ -10130,7 +10322,8 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | |||
| 					currentRegion->vulkanBuffer->requireHostVisible, | ||||
| 					currentRegion->vulkanBuffer->requireHostLocal, | ||||
| 					currentRegion->vulkanBuffer->preferDeviceLocal, | ||||
| 					0 | ||||
| 					0, | ||||
| 					currentRegion->vulkanBuffer->preserveContentsOnDefrag | ||||
| 				); | ||||
| 
 | ||||
| 				if (newBuffer == NULL) | ||||
|  | @ -10139,43 +10332,47 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | |||
| 					return 0; | ||||
| 				} | ||||
| 
 | ||||
| 				originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType; | ||||
| 				/* Copy buffer contents if necessary */ | ||||
| 				if (currentRegion->vulkanBuffer->preserveContentsOnDefrag) | ||||
| 				{ | ||||
| 					originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType; | ||||
| 
 | ||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 					renderer, | ||||
| 					commandBuffer->commandBuffer, | ||||
| 					RESOURCE_ACCESS_TRANSFER_READ, | ||||
| 					currentRegion->vulkanBuffer | ||||
| 				); | ||||
| 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 						renderer, | ||||
| 						commandBuffer->commandBuffer, | ||||
| 						RESOURCE_ACCESS_TRANSFER_READ, | ||||
| 						currentRegion->vulkanBuffer | ||||
| 					); | ||||
| 
 | ||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 					renderer, | ||||
| 					commandBuffer->commandBuffer, | ||||
| 					RESOURCE_ACCESS_TRANSFER_WRITE, | ||||
| 					newBuffer | ||||
| 				); | ||||
| 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 						renderer, | ||||
| 						commandBuffer->commandBuffer, | ||||
| 						RESOURCE_ACCESS_TRANSFER_WRITE, | ||||
| 						newBuffer | ||||
| 					); | ||||
| 
 | ||||
| 				bufferCopy.srcOffset = 0; | ||||
| 				bufferCopy.dstOffset = 0; | ||||
| 				bufferCopy.size = currentRegion->resourceSize; | ||||
| 					bufferCopy.srcOffset = 0; | ||||
| 					bufferCopy.dstOffset = 0; | ||||
| 					bufferCopy.size = currentRegion->resourceSize; | ||||
| 
 | ||||
| 				renderer->vkCmdCopyBuffer( | ||||
| 					commandBuffer->commandBuffer, | ||||
| 					currentRegion->vulkanBuffer->buffer, | ||||
| 					newBuffer->buffer, | ||||
| 					1, | ||||
| 					&bufferCopy | ||||
| 				); | ||||
| 					renderer->vkCmdCopyBuffer( | ||||
| 						commandBuffer->commandBuffer, | ||||
| 						currentRegion->vulkanBuffer->buffer, | ||||
| 						newBuffer->buffer, | ||||
| 						1, | ||||
| 						&bufferCopy | ||||
| 					); | ||||
| 
 | ||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 					renderer, | ||||
| 					commandBuffer->commandBuffer, | ||||
| 					originalResourceAccessType, | ||||
| 					newBuffer | ||||
| 				); | ||||
| 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||
| 						renderer, | ||||
| 						commandBuffer->commandBuffer, | ||||
| 						originalResourceAccessType, | ||||
| 						newBuffer | ||||
| 					); | ||||
| 
 | ||||
| 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer); | ||||
| 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | ||||
| 					VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer); | ||||
| 					VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | ||||
| 				} | ||||
| 
 | ||||
| 				/* re-point original container to new buffer */ | ||||
| 				if (currentRegion->vulkanBuffer->container != NULL) | ||||
|  | @ -10189,7 +10386,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | |||
| 
 | ||||
| 				renderer->needDefrag = 1; | ||||
| 			} | ||||
| 			else | ||||
| 			else if (!currentRegion->vulkanTexture->markedForDestroy) | ||||
| 			{ | ||||
| 				newTexture = VULKAN_INTERNAL_CreateTexture( | ||||
| 					renderer, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue