implement SetData and GetData
							parent
							
								
									0c095fa56d
								
							
						
					
					
						commit
						6674076423
					
				|  | @ -695,11 +695,32 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] = | ||||||
| 
 | 
 | ||||||
| /* Memory structures */ | /* 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; | 	VulkanBuffer *vulkanBuffer; | ||||||
| } VulkanBufferContainer; | } 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 | struct VulkanBuffer | ||||||
| { | { | ||||||
| 	VkBuffer buffer; | 	VkBuffer buffer; | ||||||
|  | @ -711,10 +732,13 @@ struct VulkanBuffer | ||||||
| 	uint8_t requireHostVisible; | 	uint8_t requireHostVisible; | ||||||
| 	uint8_t preferDeviceLocal; | 	uint8_t preferDeviceLocal; | ||||||
| 	uint8_t requireHostLocal; | 	uint8_t requireHostLocal; | ||||||
|  | 	uint8_t preserveContentsOnDefrag; | ||||||
| 
 | 
 | ||||||
| 	SDL_atomic_t referenceCount; /* Tracks command buffer usage */ | 	SDL_atomic_t referenceCount; /* Tracks command buffer usage */ | ||||||
| 
 | 
 | ||||||
| 	VulkanBufferContainer *container; | 	VulkanBufferContainer *container; | ||||||
|  | 
 | ||||||
|  | 	uint8_t markedForDestroy; /* so that defrag doesn't double-free */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| typedef enum VulkanUniformBufferType | typedef enum VulkanUniformBufferType | ||||||
|  | @ -802,6 +826,8 @@ struct VulkanTexture | ||||||
| 	SDL_atomic_t referenceCount; | 	SDL_atomic_t referenceCount; | ||||||
| 
 | 
 | ||||||
| 	VulkanTextureContainer *container; | 	VulkanTextureContainer *container; | ||||||
|  | 
 | ||||||
|  | 	uint8_t markedForDestroy; /* so that defrag doesn't double-free */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| typedef struct VulkanRenderTarget | typedef struct VulkanRenderTarget | ||||||
|  | @ -3248,6 +3274,28 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 
 | 
 | ||||||
| /* Resource tracking */ | /* 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) \ | #define TRACK_RESOURCE(resource, type, array, count, capacity) \ | ||||||
| 	uint32_t i; \ | 	uint32_t i; \ | ||||||
| 	\ | 	\ | ||||||
|  | @ -3269,10 +3317,8 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 	} \ | 	} \ | ||||||
| 	commandBuffer->array[commandBuffer->count] = resource; \ | 	commandBuffer->array[commandBuffer->count] = resource; \ | ||||||
| 	commandBuffer->count += 1; \ | 	commandBuffer->count += 1; \ | ||||||
| 	\ |  | ||||||
| 	SDL_AtomicIncRef(&resource->referenceCount); | 	SDL_AtomicIncRef(&resource->referenceCount); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| static void VULKAN_INTERNAL_TrackBuffer( | static void VULKAN_INTERNAL_TrackBuffer( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanCommandBuffer *commandBuffer, | 	VulkanCommandBuffer *commandBuffer, | ||||||
|  | @ -3391,7 +3437,7 @@ static void VULKAN_INTERNAL_TrackCopiedTexture( | ||||||
| 	VulkanCommandBuffer *commandBuffer, | 	VulkanCommandBuffer *commandBuffer, | ||||||
| 	VulkanTexture *texture | 	VulkanTexture *texture | ||||||
| ) { | ) { | ||||||
| 	TRACK_RESOURCE( | 	ADD_TO_ARRAY_UNIQUE( | ||||||
| 		texture, | 		texture, | ||||||
| 		VulkanTexture*, | 		VulkanTexture*, | ||||||
| 		copiedTextures, | 		copiedTextures, | ||||||
|  | @ -3406,7 +3452,7 @@ static void VULKAN_INTERNAL_TrackCopiedBuffer( | ||||||
| 	VulkanCommandBuffer *commandBuffer, | 	VulkanCommandBuffer *commandBuffer, | ||||||
| 	VulkanBuffer *buffer | 	VulkanBuffer *buffer | ||||||
| ) { | ) { | ||||||
| 	TRACK_RESOURCE( | 	ADD_TO_ARRAY_UNIQUE( | ||||||
| 		buffer, | 		buffer, | ||||||
| 		VulkanBuffer*, | 		VulkanBuffer*, | ||||||
| 		copiedGpuBuffers, | 		copiedGpuBuffers, | ||||||
|  | @ -4145,7 +4191,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | ||||||
| 	uint8_t requireHostVisible, | 	uint8_t requireHostVisible, | ||||||
| 	uint8_t requireHostLocal, | 	uint8_t requireHostLocal, | ||||||
| 	uint8_t preferDeviceLocal, | 	uint8_t preferDeviceLocal, | ||||||
| 	uint8_t dedicatedAllocation | 	uint8_t dedicatedAllocation, | ||||||
|  | 	uint8_t preserveContentsOnDefrag | ||||||
| ) { | ) { | ||||||
| 	VulkanBuffer* buffer; | 	VulkanBuffer* buffer; | ||||||
| 	VkResult vulkanResult; | 	VkResult vulkanResult; | ||||||
|  | @ -4160,6 +4207,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | ||||||
| 	buffer->requireHostVisible = requireHostVisible; | 	buffer->requireHostVisible = requireHostVisible; | ||||||
| 	buffer->requireHostLocal = requireHostLocal; | 	buffer->requireHostLocal = requireHostLocal; | ||||||
| 	buffer->preferDeviceLocal = preferDeviceLocal; | 	buffer->preferDeviceLocal = preferDeviceLocal; | ||||||
|  | 	buffer->preserveContentsOnDefrag = preserveContentsOnDefrag; | ||||||
|  | 	buffer->markedForDestroy = 0; | ||||||
| 
 | 
 | ||||||
| 	bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | 	bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | ||||||
| 	bufferCreateInfo.pNext = NULL; | 	bufferCreateInfo.pNext = NULL; | ||||||
|  | @ -4277,6 +4326,7 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject( | ||||||
| 		1, | 		1, | ||||||
| 		0, | 		0, | ||||||
| 		1, | 		1, | ||||||
|  | 		1, | ||||||
| 		1 | 		1 | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | @ -4321,12 +4371,17 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject( | ||||||
| 	return uniformBufferObject; | 	return uniformBufferObject; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Buffer indirection so we can cleanly defrag GpuBuffers */ | /* Indirection so we can cleanly defrag buffers */ | ||||||
| static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer( | static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	uint32_t sizeInBytes, | 	uint32_t sizeInBytes, | ||||||
| 	VulkanResourceAccessType resourceAccessType, | 	VulkanResourceAccessType resourceAccessType, | ||||||
| 	VkBufferUsageFlags usageFlags | 	VkBufferUsageFlags usageFlags, | ||||||
|  | 	uint8_t requireHostVisible, | ||||||
|  | 	uint8_t requireHostLocal, | ||||||
|  | 	uint8_t preferDeviceLocal, | ||||||
|  | 	uint8_t dedicatedAllocation, | ||||||
|  | 	uint8_t preserveContentsOnDefrag | ||||||
| ) { | ) { | ||||||
| 	VulkanBufferContainer* bufferContainer; | 	VulkanBufferContainer* bufferContainer; | ||||||
| 	VulkanBuffer* buffer; | 	VulkanBuffer* buffer; | ||||||
|  | @ -4339,10 +4394,11 @@ static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer( | ||||||
| 		sizeInBytes, | 		sizeInBytes, | ||||||
| 		resourceAccessType, | 		resourceAccessType, | ||||||
| 		usageFlags, | 		usageFlags, | ||||||
| 		0, | 		requireHostVisible, | ||||||
| 		0, | 		requireHostLocal, | ||||||
| 		1, | 		preferDeviceLocal, | ||||||
| 		0 | 		dedicatedAllocation, | ||||||
|  | 		preserveContentsOnDefrag | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	if (buffer == NULL) | 	if (buffer == NULL) | ||||||
|  | @ -5413,6 +5469,7 @@ static VulkanTexture* VULKAN_INTERNAL_CreateTexture( | ||||||
| 
 | 
 | ||||||
| 	texture->isCube = 0; | 	texture->isCube = 0; | ||||||
| 	texture->is3D = 0; | 	texture->is3D = 0; | ||||||
|  | 	texture->markedForDestroy = 0; | ||||||
| 
 | 
 | ||||||
| 	if (isCube) | 	if (isCube) | ||||||
| 	{ | 	{ | ||||||
|  | @ -6812,20 +6869,26 @@ static Refresh_GpuBuffer* VULKAN_CreateGpuBuffer( | ||||||
| 		(VulkanRenderer*) driverData, | 		(VulkanRenderer*) driverData, | ||||||
| 		sizeInBytes, | 		sizeInBytes, | ||||||
| 		resourceAccessType, | 		resourceAccessType, | ||||||
| 		vulkanUsageFlags | 		vulkanUsageFlags, | ||||||
|  | 		0, | ||||||
|  | 		0, | ||||||
|  | 		1, | ||||||
|  | 		0, | ||||||
|  | 		1 | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer( | static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	uint32_t sizeInBytes, | 	uint32_t sizeInBytes | ||||||
| 	void **pDataPtr |  | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VkBufferUsageFlags vulkanUsageFlags = | 	VkBufferUsageFlags vulkanUsageFlags = | ||||||
| 		VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; | 		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, | 		renderer, | ||||||
| 		sizeInBytes, | 		sizeInBytes, | ||||||
| 		RESOURCE_ACCESS_NONE, | 		RESOURCE_ACCESS_NONE, | ||||||
|  | @ -6833,12 +6896,18 @@ static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer( | ||||||
| 		1, | 		1, | ||||||
| 		1, | 		1, | ||||||
| 		0, | 		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 */ | /* Setters */ | ||||||
|  | @ -7169,6 +7238,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanTexture *vulkanTexture | 	VulkanTexture *vulkanTexture | ||||||
| ) { | ) { | ||||||
|  | 	if (vulkanTexture->markedForDestroy) { return; } | ||||||
|  | 
 | ||||||
| 	SDL_LockMutex(renderer->disposeLock); | 	SDL_LockMutex(renderer->disposeLock); | ||||||
| 
 | 
 | ||||||
| 	EXPAND_ARRAY_IF_NEEDED( | 	EXPAND_ARRAY_IF_NEEDED( | ||||||
|  | @ -7184,6 +7255,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture( | ||||||
| 	] = vulkanTexture; | 	] = vulkanTexture; | ||||||
| 	renderer->texturesToDestroyCount += 1; | 	renderer->texturesToDestroyCount += 1; | ||||||
| 
 | 
 | ||||||
|  | 	vulkanTexture->markedForDestroy = 1; | ||||||
|  | 
 | ||||||
| 	SDL_UnlockMutex(renderer->disposeLock); | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -7232,6 +7305,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanBuffer *vulkanBuffer | 	VulkanBuffer *vulkanBuffer | ||||||
| ) { | ) { | ||||||
|  | 	if (vulkanBuffer->markedForDestroy) { return; } | ||||||
|  | 
 | ||||||
| 	SDL_LockMutex(renderer->disposeLock); | 	SDL_LockMutex(renderer->disposeLock); | ||||||
| 
 | 
 | ||||||
| 	EXPAND_ARRAY_IF_NEEDED( | 	EXPAND_ARRAY_IF_NEEDED( | ||||||
|  | @ -7247,6 +7322,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer( | ||||||
| 	] = vulkanBuffer; | 	] = vulkanBuffer; | ||||||
| 	renderer->buffersToDestroyCount += 1; | 	renderer->buffersToDestroyCount += 1; | ||||||
| 
 | 
 | ||||||
|  | 	vulkanBuffer->markedForDestroy = 1; | ||||||
|  | 
 | ||||||
| 	SDL_UnlockMutex(renderer->disposeLock); | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -7262,7 +7339,7 @@ static void VULKAN_QueueDestroyGpuBuffer( | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer); | 	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_free(vulkanBufferContainer); | ||||||
| 
 | 
 | ||||||
| 	SDL_UnlockMutex(renderer->disposeLock); | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
|  | @ -7273,11 +7350,20 @@ static void VULKAN_QueueDestroyCpuBuffer( | ||||||
| 	Refresh_CpuBuffer *buffer | 	Refresh_CpuBuffer *buffer | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer; | 	VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) buffer; | ||||||
|  | 	uint32_t i; | ||||||
| 
 | 
 | ||||||
| 	SDL_LockMutex(renderer->disposeLock); | 	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); | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
| } | } | ||||||
|  | @ -8342,6 +8428,108 @@ static void VULKAN_EndComputePass( | ||||||
| 	vulkanCommandBuffer->currentComputePipeline = NULL; | 	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( | static void VULKAN_BeginCopyPass( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_CommandBuffer *commandBuffer | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | @ -8362,7 +8550,7 @@ static void VULKAN_UploadToTexture( | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | 	VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||||
| 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | ||||||
| 	VkBufferImageCopy imageCopy; | 	VkBufferImageCopy imageCopy; | ||||||
| 
 | 
 | ||||||
|  | @ -8370,7 +8558,7 @@ static void VULKAN_UploadToTexture( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_READ, | 		RESOURCE_ACCESS_TRANSFER_READ, | ||||||
| 		vulkanCpuBuffer | 		bufferContainer->activeBuffer->vulkanBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | @ -8403,14 +8591,14 @@ static void VULKAN_UploadToTexture( | ||||||
| 
 | 
 | ||||||
| 	renderer->vkCmdCopyBufferToImage( | 	renderer->vkCmdCopyBufferToImage( | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		vulkanCpuBuffer->buffer, | 		bufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||||
| 		vulkanTexture->image, | 		vulkanTexture->image, | ||||||
| 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | ||||||
| 		1, | 		1, | ||||||
| 		&imageCopy | 		&imageCopy | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBuffer->vulkanBuffer); | ||||||
| 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||||
| 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||||
| } | } | ||||||
|  | @ -8424,7 +8612,7 @@ static void VULKAN_UploadToBuffer( | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||||
| 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | ||||||
| 	VkBufferCopy bufferCopy; | 	VkBufferCopy bufferCopy; | ||||||
| 
 | 
 | ||||||
|  | @ -8432,7 +8620,7 @@ static void VULKAN_UploadToBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_READ, | 		RESOURCE_ACCESS_TRANSFER_READ, | ||||||
| 		vulkanCpuBuffer | 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
|  | @ -8448,13 +8636,13 @@ static void VULKAN_UploadToBuffer( | ||||||
| 
 | 
 | ||||||
| 	renderer->vkCmdCopyBuffer( | 	renderer->vkCmdCopyBuffer( | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		vulkanCpuBuffer->buffer, | 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||||
| 		vulkanGpuBuffer->buffer, | 		vulkanGpuBuffer->buffer, | ||||||
| 		1, | 		1, | ||||||
| 		&bufferCopy | 		&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); | ||||||
| 	VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | 	VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||||
| } | } | ||||||
|  | @ -8469,14 +8657,14 @@ static void VULKAN_DownloadFromTexture( | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | 	VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture; | ||||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||||
| 	VkBufferImageCopy imageCopy; | 	VkBufferImageCopy imageCopy; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 		vulkanCpuBuffer | 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | @ -8511,14 +8699,16 @@ static void VULKAN_DownloadFromTexture( | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		vulkanTexture->image, | 		vulkanTexture->image, | ||||||
| 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | 		AccessMap[vulkanTexture->resourceAccessType].imageLayout, | ||||||
| 		vulkanCpuBuffer->buffer, | 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||||
| 		1, | 		1, | ||||||
| 		&imageCopy | 		&imageCopy | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer); | 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer); | ||||||
| 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | 	VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||||
| 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | 	VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture); | ||||||
|  | 
 | ||||||
|  | 	cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_DownloadFromBuffer( | static void VULKAN_DownloadFromBuffer( | ||||||
|  | @ -8530,7 +8720,7 @@ static void VULKAN_DownloadFromBuffer( | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer; | 	VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer; | ||||||
| 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | 	VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer; | ||||||
| 	VkBufferCopy bufferCopy; | 	VkBufferCopy bufferCopy; | ||||||
| 
 | 
 | ||||||
|  | @ -8538,7 +8728,7 @@ static void VULKAN_DownloadFromBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 		vulkanCpuBuffer | 		cpuBufferContainer->activeBuffer->vulkanBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_BufferMemoryBarrier( | 	VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
|  | @ -8555,14 +8745,16 @@ static void VULKAN_DownloadFromBuffer( | ||||||
| 	renderer->vkCmdCopyBuffer( | 	renderer->vkCmdCopyBuffer( | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		vulkanGpuBuffer->buffer, | 		vulkanGpuBuffer->buffer, | ||||||
| 		vulkanCpuBuffer->buffer, | 		cpuBufferContainer->activeBuffer->vulkanBuffer->buffer, | ||||||
| 		1, | 		1, | ||||||
| 		&bufferCopy | 		&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); | ||||||
| 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | 	VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer); | ||||||
|  | 
 | ||||||
|  | 	cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_CopyTextureToTexture( | static void VULKAN_CopyTextureToTexture( | ||||||
|  | @ -10118,7 +10310,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 			currentRegion = allocation->usedRegions[i]; | 			currentRegion = allocation->usedRegions[i]; | ||||||
| 			copyResourceAccessType = RESOURCE_ACCESS_NONE; | 			copyResourceAccessType = RESOURCE_ACCESS_NONE; | ||||||
| 
 | 
 | ||||||
| 			if (currentRegion->isBuffer) | 			if (currentRegion->isBuffer && !currentRegion->vulkanBuffer->markedForDestroy) | ||||||
| 			{ | 			{ | ||||||
| 				currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; | 				currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; | ||||||
| 
 | 
 | ||||||
|  | @ -10130,7 +10322,8 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					currentRegion->vulkanBuffer->requireHostVisible, | 					currentRegion->vulkanBuffer->requireHostVisible, | ||||||
| 					currentRegion->vulkanBuffer->requireHostLocal, | 					currentRegion->vulkanBuffer->requireHostLocal, | ||||||
| 					currentRegion->vulkanBuffer->preferDeviceLocal, | 					currentRegion->vulkanBuffer->preferDeviceLocal, | ||||||
| 					0 | 					0, | ||||||
|  | 					currentRegion->vulkanBuffer->preserveContentsOnDefrag | ||||||
| 				); | 				); | ||||||
| 
 | 
 | ||||||
| 				if (newBuffer == NULL) | 				if (newBuffer == NULL) | ||||||
|  | @ -10139,43 +10332,47 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					return 0; | 					return 0; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType; | 				/* Copy buffer contents if necessary */ | ||||||
|  | 				if (currentRegion->vulkanBuffer->preserveContentsOnDefrag) | ||||||
|  | 				{ | ||||||
|  | 					originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType; | ||||||
| 
 | 
 | ||||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
| 					renderer, | 						renderer, | ||||||
| 					commandBuffer->commandBuffer, | 						commandBuffer->commandBuffer, | ||||||
| 					RESOURCE_ACCESS_TRANSFER_READ, | 						RESOURCE_ACCESS_TRANSFER_READ, | ||||||
| 					currentRegion->vulkanBuffer | 						currentRegion->vulkanBuffer | ||||||
| 				); | 					); | ||||||
| 
 | 
 | ||||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
| 					renderer, | 						renderer, | ||||||
| 					commandBuffer->commandBuffer, | 						commandBuffer->commandBuffer, | ||||||
| 					RESOURCE_ACCESS_TRANSFER_WRITE, | 						RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 					newBuffer | 						newBuffer | ||||||
| 				); | 					); | ||||||
| 
 | 
 | ||||||
| 				bufferCopy.srcOffset = 0; | 					bufferCopy.srcOffset = 0; | ||||||
| 				bufferCopy.dstOffset = 0; | 					bufferCopy.dstOffset = 0; | ||||||
| 				bufferCopy.size = currentRegion->resourceSize; | 					bufferCopy.size = currentRegion->resourceSize; | ||||||
| 
 | 
 | ||||||
| 				renderer->vkCmdCopyBuffer( | 					renderer->vkCmdCopyBuffer( | ||||||
| 					commandBuffer->commandBuffer, | 						commandBuffer->commandBuffer, | ||||||
| 					currentRegion->vulkanBuffer->buffer, | 						currentRegion->vulkanBuffer->buffer, | ||||||
| 					newBuffer->buffer, | 						newBuffer->buffer, | ||||||
| 					1, | 						1, | ||||||
| 					&bufferCopy | 						&bufferCopy | ||||||
| 				); | 					); | ||||||
| 
 | 
 | ||||||
| 				VULKAN_INTERNAL_BufferMemoryBarrier( | 					VULKAN_INTERNAL_BufferMemoryBarrier( | ||||||
| 					renderer, | 						renderer, | ||||||
| 					commandBuffer->commandBuffer, | 						commandBuffer->commandBuffer, | ||||||
| 					originalResourceAccessType, | 						originalResourceAccessType, | ||||||
| 					newBuffer | 						newBuffer | ||||||
| 				); | 					); | ||||||
| 
 | 
 | ||||||
| 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer); | 					VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer); | ||||||
| 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | 					VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | ||||||
|  | 				} | ||||||
| 
 | 
 | ||||||
| 				/* re-point original container to new buffer */ | 				/* re-point original container to new buffer */ | ||||||
| 				if (currentRegion->vulkanBuffer->container != NULL) | 				if (currentRegion->vulkanBuffer->container != NULL) | ||||||
|  | @ -10189,7 +10386,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 
 | 
 | ||||||
| 				renderer->needDefrag = 1; | 				renderer->needDefrag = 1; | ||||||
| 			} | 			} | ||||||
| 			else | 			else if (!currentRegion->vulkanTexture->markedForDestroy) | ||||||
| 			{ | 			{ | ||||||
| 				newTexture = VULKAN_INTERNAL_CreateTexture( | 				newTexture = VULKAN_INTERNAL_CreateTexture( | ||||||
| 					renderer, | 					renderer, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue