defrag fixes
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
2ef3c04e8e
commit
c3d2b17c4d
|
@ -703,7 +703,6 @@ struct VulkanBuffer
|
||||||
VkBufferUsageFlags usage;
|
VkBufferUsageFlags usage;
|
||||||
|
|
||||||
uint8_t preferDeviceLocal;
|
uint8_t preferDeviceLocal;
|
||||||
uint8_t isTransferBuffer;
|
|
||||||
|
|
||||||
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
||||||
|
|
||||||
|
@ -3115,7 +3114,7 @@ static uint8_t VULKAN_INTERNAL_FindAllocationToDefragment(
|
||||||
|
|
||||||
for (j = 0; j < allocator->allocationCount; j += 1)
|
for (j = 0; j < allocator->allocationCount; j += 1)
|
||||||
{
|
{
|
||||||
if (allocator->allocations[j]->freeRegionCount > 1)
|
if (allocator->allocations[j]->availableForAllocation == 1 && allocator->allocations[j]->freeRegionCount > 1)
|
||||||
{
|
{
|
||||||
*allocationIndexToDefrag = j;
|
*allocationIndexToDefrag = j;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -4118,7 +4117,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
buffer->resourceAccessType = resourceAccessType;
|
buffer->resourceAccessType = resourceAccessType;
|
||||||
buffer->usage = usage;
|
buffer->usage = usage;
|
||||||
buffer->preferDeviceLocal = preferDeviceLocal;
|
buffer->preferDeviceLocal = preferDeviceLocal;
|
||||||
buffer->isTransferBuffer = isTransferBuffer;
|
|
||||||
|
|
||||||
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
bufferCreateInfo.pNext = NULL;
|
bufferCreateInfo.pNext = NULL;
|
||||||
|
@ -4142,7 +4140,7 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
buffer->buffer,
|
buffer->buffer,
|
||||||
buffer->size,
|
buffer->size,
|
||||||
buffer->preferDeviceLocal,
|
buffer->preferDeviceLocal,
|
||||||
buffer->isTransferBuffer,
|
isTransferBuffer,
|
||||||
&buffer->usedRegion
|
&buffer->usedRegion
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -4157,6 +4155,7 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->usedRegion->vulkanBuffer = buffer; /* lol */
|
buffer->usedRegion->vulkanBuffer = buffer; /* lol */
|
||||||
|
buffer->container = NULL;
|
||||||
|
|
||||||
buffer->resourceAccessType = resourceAccessType;
|
buffer->resourceAccessType = resourceAccessType;
|
||||||
|
|
||||||
|
@ -5319,27 +5318,29 @@ static void VULKAN_DestroyDevice(
|
||||||
{
|
{
|
||||||
allocator = &renderer->memoryAllocator->subAllocators[i];
|
allocator = &renderer->memoryAllocator->subAllocators[i];
|
||||||
|
|
||||||
for (j = 0; j < allocator->allocationCount; j += 1)
|
for (j = allocator->allocationCount - 1; j >= 0; j -= 1)
|
||||||
{
|
{
|
||||||
for (k = 0; k < allocator->allocations[j]->freeRegionCount; k += 1)
|
for (k = allocator->allocations[j]->usedRegionCount - 1; k >= 0; k -= 1)
|
||||||
{
|
{
|
||||||
SDL_free(allocator->allocations[j]->freeRegions[k]);
|
VULKAN_INTERNAL_RemoveMemoryUsedRegion(
|
||||||
|
renderer,
|
||||||
|
allocator->allocations[j]->usedRegions[k]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_free(allocator->allocations[j]->freeRegions);
|
VULKAN_INTERNAL_DeallocateMemory(
|
||||||
|
renderer,
|
||||||
renderer->vkFreeMemory(
|
allocator,
|
||||||
renderer->logicalDevice,
|
j
|
||||||
allocator->allocations[j]->memory,
|
|
||||||
NULL
|
|
||||||
);
|
);
|
||||||
|
|
||||||
SDL_DestroyMutex(allocator->allocations[j]->memoryLock);
|
|
||||||
SDL_free(allocator->allocations[j]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_free(allocator->allocations);
|
if (renderer->memoryAllocator->subAllocators[i].allocations != NULL)
|
||||||
SDL_free(allocator->sortedFreeRegions);
|
{
|
||||||
|
SDL_free(renderer->memoryAllocator->subAllocators[i].allocations);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_free(renderer->memoryAllocator->subAllocators[i].sortedFreeRegions);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_free(renderer->memoryAllocator);
|
SDL_free(renderer->memoryAllocator);
|
||||||
|
@ -7118,7 +7119,7 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer(
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
|
||||||
if (transferBuffer == NULL)
|
if (transferBuffer->buffer == NULL)
|
||||||
{
|
{
|
||||||
Refresh_LogError("Failed to allocate transfer buffer!");
|
Refresh_LogError("Failed to allocate transfer buffer!");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -10047,7 +10048,7 @@ static void VULKAN_INTERNAL_CleanCommandBuffer(
|
||||||
|
|
||||||
for (i = 0; i < commandBuffer->transferBufferCount; i += 1)
|
for (i = 0; i < commandBuffer->transferBufferCount; i += 1)
|
||||||
{
|
{
|
||||||
VULKAN_INTERNAL_DestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer);
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer);
|
||||||
SDL_free(commandBuffer->transferBuffers[i]);
|
SDL_free(commandBuffer->transferBuffers[i]);
|
||||||
commandBuffer->transferBuffers[i] = NULL;
|
commandBuffer->transferBuffers[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -10202,6 +10203,8 @@ static void VULKAN_Submit(
|
||||||
VulkanCommandBuffer *currentCommandBuffer;
|
VulkanCommandBuffer *currentCommandBuffer;
|
||||||
VkPipelineStageFlags waitStages[MAX_PRESENT_COUNT];
|
VkPipelineStageFlags waitStages[MAX_PRESENT_COUNT];
|
||||||
uint32_t swapchainImageIndex;
|
uint32_t swapchainImageIndex;
|
||||||
|
uint8_t commandBufferCleaned = 0;
|
||||||
|
VulkanMemorySubAllocator *allocator;
|
||||||
int32_t i, j;
|
int32_t i, j;
|
||||||
|
|
||||||
SDL_LockMutex(renderer->submitLock);
|
SDL_LockMutex(renderer->submitLock);
|
||||||
|
@ -10322,13 +10325,50 @@ static void VULKAN_Submit(
|
||||||
renderer,
|
renderer,
|
||||||
renderer->submittedCommandBuffers[i]
|
renderer->submittedCommandBuffers[i]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
commandBufferCleaned = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (commandBufferCleaned)
|
||||||
|
{
|
||||||
|
SDL_LockMutex(renderer->allocatorLock);
|
||||||
|
|
||||||
|
for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1)
|
||||||
|
{
|
||||||
|
allocator = &renderer->memoryAllocator->subAllocators[i];
|
||||||
|
|
||||||
|
for (j = allocator->allocationCount - 1; j >= 0; j -= 1)
|
||||||
|
{
|
||||||
|
if (allocator->allocations[j]->usedRegionCount == 0)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_DeallocateMemory(
|
||||||
|
renderer,
|
||||||
|
allocator,
|
||||||
|
j
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->allocatorLock);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check pending destroys */
|
/* Check pending destroys */
|
||||||
|
|
||||||
VULKAN_INTERNAL_PerformPendingDestroys(renderer);
|
VULKAN_INTERNAL_PerformPendingDestroys(renderer);
|
||||||
|
|
||||||
|
/* Defrag! */
|
||||||
|
if (renderer->needDefrag)
|
||||||
|
{
|
||||||
|
renderer->defragTimer += 1;
|
||||||
|
|
||||||
|
if (renderer->defragTimer == 1)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_DefragmentMemory(renderer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->submitLock);
|
SDL_UnlockMutex(renderer->submitLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10343,7 +10383,6 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
VulkanTexture* newTexture;
|
VulkanTexture* newTexture;
|
||||||
VkBufferCopy bufferCopy;
|
VkBufferCopy bufferCopy;
|
||||||
VkImageCopy *imageCopyRegions;
|
VkImageCopy *imageCopyRegions;
|
||||||
VkImageAspectFlags aspectFlags;
|
|
||||||
VulkanCommandBuffer *commandBuffer;
|
VulkanCommandBuffer *commandBuffer;
|
||||||
VkCommandBufferBeginInfo beginInfo;
|
VkCommandBufferBeginInfo beginInfo;
|
||||||
VkPipelineStageFlags waitFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
|
VkPipelineStageFlags waitFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
|
||||||
|
@ -10393,7 +10432,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
RESOURCE_ACCESS_NONE,
|
RESOURCE_ACCESS_NONE,
|
||||||
currentRegion->vulkanBuffer->usage,
|
currentRegion->vulkanBuffer->usage,
|
||||||
currentRegion->vulkanBuffer->preferDeviceLocal,
|
currentRegion->vulkanBuffer->preferDeviceLocal,
|
||||||
currentRegion->vulkanBuffer->isTransferBuffer
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
if (newBuffer == NULL)
|
if (newBuffer == NULL)
|
||||||
|
@ -10441,9 +10480,12 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
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 */
|
||||||
newBuffer->container = currentRegion->vulkanBuffer->container;
|
if (currentRegion->vulkanBuffer->container != NULL)
|
||||||
newBuffer->container->vulkanBuffer = newBuffer;
|
{
|
||||||
currentRegion->vulkanBuffer->container = NULL;
|
newBuffer->container = currentRegion->vulkanBuffer->container;
|
||||||
|
newBuffer->container->vulkanBuffer = newBuffer;
|
||||||
|
currentRegion->vulkanBuffer->container = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, currentRegion->vulkanBuffer);
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, currentRegion->vulkanBuffer);
|
||||||
|
|
||||||
|
@ -10476,7 +10518,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
aspectFlags,
|
currentRegion->vulkanTexture->aspectFlags,
|
||||||
0,
|
0,
|
||||||
currentRegion->vulkanTexture->layerCount,
|
currentRegion->vulkanTexture->layerCount,
|
||||||
0,
|
0,
|
||||||
|
@ -10490,7 +10532,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
aspectFlags,
|
currentRegion->vulkanTexture->aspectFlags,
|
||||||
0,
|
0,
|
||||||
currentRegion->vulkanTexture->layerCount,
|
currentRegion->vulkanTexture->layerCount,
|
||||||
0,
|
0,
|
||||||
|
@ -10507,7 +10549,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
imageCopyRegions[level].srcOffset.x = 0;
|
imageCopyRegions[level].srcOffset.x = 0;
|
||||||
imageCopyRegions[level].srcOffset.y = 0;
|
imageCopyRegions[level].srcOffset.y = 0;
|
||||||
imageCopyRegions[level].srcOffset.z = 0;
|
imageCopyRegions[level].srcOffset.z = 0;
|
||||||
imageCopyRegions[level].srcSubresource.aspectMask = aspectFlags;
|
imageCopyRegions[level].srcSubresource.aspectMask = currentRegion->vulkanTexture->aspectFlags;
|
||||||
imageCopyRegions[level].srcSubresource.baseArrayLayer = 0;
|
imageCopyRegions[level].srcSubresource.baseArrayLayer = 0;
|
||||||
imageCopyRegions[level].srcSubresource.layerCount = currentRegion->vulkanTexture->layerCount;
|
imageCopyRegions[level].srcSubresource.layerCount = currentRegion->vulkanTexture->layerCount;
|
||||||
imageCopyRegions[level].srcSubresource.mipLevel = level;
|
imageCopyRegions[level].srcSubresource.mipLevel = level;
|
||||||
|
@ -10517,7 +10559,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
imageCopyRegions[level].dstOffset.x = 0;
|
imageCopyRegions[level].dstOffset.x = 0;
|
||||||
imageCopyRegions[level].dstOffset.y = 0;
|
imageCopyRegions[level].dstOffset.y = 0;
|
||||||
imageCopyRegions[level].dstOffset.z = 0;
|
imageCopyRegions[level].dstOffset.z = 0;
|
||||||
imageCopyRegions[level].dstSubresource.aspectMask = aspectFlags;
|
imageCopyRegions[level].dstSubresource.aspectMask = currentRegion->vulkanTexture->aspectFlags;
|
||||||
imageCopyRegions[level].dstSubresource.baseArrayLayer = 0;
|
imageCopyRegions[level].dstSubresource.baseArrayLayer = 0;
|
||||||
imageCopyRegions[level].dstSubresource.layerCount = currentRegion->vulkanTexture->layerCount;
|
imageCopyRegions[level].dstSubresource.layerCount = currentRegion->vulkanTexture->layerCount;
|
||||||
imageCopyRegions[level].dstSubresource.mipLevel = level;
|
imageCopyRegions[level].dstSubresource.mipLevel = level;
|
||||||
|
@ -10537,7 +10579,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
originalResourceAccessType,
|
originalResourceAccessType,
|
||||||
aspectFlags,
|
currentRegion->vulkanTexture->aspectFlags,
|
||||||
0,
|
0,
|
||||||
currentRegion->vulkanTexture->layerCount,
|
currentRegion->vulkanTexture->layerCount,
|
||||||
0,
|
0,
|
||||||
|
|
Loading…
Reference in New Issue