fixed-size transfer pool
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
45b71bd63d
commit
994f5dc0b9
|
@ -75,6 +75,7 @@ static uint32_t deviceExtensionCount = SDL_arraysize(deviceExtensionNames);
|
||||||
#define MAX_ALLOCATION_SIZE 256000000 /* 256MB */
|
#define MAX_ALLOCATION_SIZE 256000000 /* 256MB */
|
||||||
#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 UBO_BUFFER_SIZE 16000 /* 16KB */
|
#define UBO_BUFFER_SIZE 16000 /* 16KB */
|
||||||
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
||||||
#define WINDOW_DATA "Refresh_VulkanWindowData"
|
#define WINDOW_DATA "Refresh_VulkanWindowData"
|
||||||
|
@ -1516,8 +1517,18 @@ typedef struct VulkanTransferBuffer
|
||||||
{
|
{
|
||||||
VulkanBuffer* buffer;
|
VulkanBuffer* buffer;
|
||||||
VkDeviceSize offset;
|
VkDeviceSize offset;
|
||||||
|
uint8_t fromPool;
|
||||||
} VulkanTransferBuffer;
|
} VulkanTransferBuffer;
|
||||||
|
|
||||||
|
typedef struct VulkanTransferBufferPool
|
||||||
|
{
|
||||||
|
SDL_mutex *lock;
|
||||||
|
|
||||||
|
VulkanTransferBuffer **availableBuffers;
|
||||||
|
uint32_t availableBufferCount;
|
||||||
|
uint32_t availableBufferCapacity;
|
||||||
|
} VulkanTransferBufferPool;
|
||||||
|
|
||||||
typedef struct VulkanCommandPool VulkanCommandPool;
|
typedef struct VulkanCommandPool VulkanCommandPool;
|
||||||
|
|
||||||
typedef struct VulkanCommandBuffer
|
typedef struct VulkanCommandBuffer
|
||||||
|
@ -1723,6 +1734,8 @@ typedef struct VulkanRenderer
|
||||||
uint32_t submittedCommandBufferCount;
|
uint32_t submittedCommandBufferCount;
|
||||||
uint32_t submittedCommandBufferCapacity;
|
uint32_t submittedCommandBufferCapacity;
|
||||||
|
|
||||||
|
VulkanTransferBufferPool transferBufferPool;
|
||||||
|
|
||||||
CommandPoolHashTable commandPoolHashTable;
|
CommandPoolHashTable commandPoolHashTable;
|
||||||
DescriptorSetLayoutHashTable descriptorSetLayoutHashTable;
|
DescriptorSetLayoutHashTable descriptorSetLayoutHashTable;
|
||||||
GraphicsPipelineLayoutHashTable graphicsPipelineLayoutHashTable;
|
GraphicsPipelineLayoutHashTable graphicsPipelineLayoutHashTable;
|
||||||
|
@ -5151,6 +5164,15 @@ static void VULKAN_DestroyDevice(
|
||||||
SDL_free(renderer->dummyFragmentUniformBuffer);
|
SDL_free(renderer->dummyFragmentUniformBuffer);
|
||||||
SDL_free(renderer->dummyComputeUniformBuffer);
|
SDL_free(renderer->dummyComputeUniformBuffer);
|
||||||
|
|
||||||
|
for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->transferBufferPool.availableBuffers[i]->buffer);
|
||||||
|
SDL_free(renderer->transferBufferPool.availableBuffers[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_free(renderer->transferBufferPool.availableBuffers);
|
||||||
|
SDL_DestroyMutex(renderer->transferBufferPool.lock);
|
||||||
|
|
||||||
for (i = 0; i < NUM_COMMAND_POOL_BUCKETS; i += 1)
|
for (i = 0; i < NUM_COMMAND_POOL_BUCKETS; i += 1)
|
||||||
{
|
{
|
||||||
commandPoolHashArray = renderer->commandPoolHashTable.buckets[i];
|
commandPoolHashArray = renderer->commandPoolHashTable.buckets[i];
|
||||||
|
@ -7099,6 +7121,40 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Nothing fits, can we get a transfer buffer from the pool? */
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->transferBufferPool.lock);
|
||||||
|
|
||||||
|
for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1)
|
||||||
|
{
|
||||||
|
transferBuffer = renderer->transferBufferPool.availableBuffers[i];
|
||||||
|
offset = transferBuffer->offset + alignment - (transferBuffer->offset % alignment);
|
||||||
|
|
||||||
|
if (offset + requiredSize <= transferBuffer->buffer->size)
|
||||||
|
{
|
||||||
|
if (commandBuffer->transferBufferCount == commandBuffer->transferBufferCapacity)
|
||||||
|
{
|
||||||
|
commandBuffer->transferBufferCapacity *= 2;
|
||||||
|
commandBuffer->transferBuffers = SDL_realloc(
|
||||||
|
commandBuffer->transferBuffers,
|
||||||
|
commandBuffer->transferBufferCapacity * sizeof(VulkanTransferBuffer*)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
commandBuffer->transferBuffers[commandBuffer->transferBufferCount] = transferBuffer;
|
||||||
|
commandBuffer->transferBufferCount += 1;
|
||||||
|
|
||||||
|
renderer->transferBufferPool.availableBuffers[i] = renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount - 1];
|
||||||
|
renderer->transferBufferPool.availableBufferCount -= 1;
|
||||||
|
SDL_UnlockMutex(renderer->transferBufferPool.lock);
|
||||||
|
|
||||||
|
transferBuffer->offset = offset;
|
||||||
|
return transferBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->transferBufferPool.lock);
|
||||||
|
|
||||||
/* Nothing fits, so let's create a new transfer buffer */
|
/* Nothing fits, so let's create a new transfer buffer */
|
||||||
|
|
||||||
size = TRANSFER_BUFFER_STARTING_SIZE;
|
size = TRANSFER_BUFFER_STARTING_SIZE;
|
||||||
|
@ -7118,10 +7174,12 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer(
|
||||||
1,
|
1,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
transferBuffer->fromPool = 0;
|
||||||
|
|
||||||
if (transferBuffer->buffer == NULL)
|
if (transferBuffer->buffer == NULL)
|
||||||
{
|
{
|
||||||
Refresh_LogError("Failed to allocate transfer buffer!");
|
Refresh_LogError("Failed to allocate transfer buffer!");
|
||||||
|
SDL_free(transferBuffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10040,9 +10098,22 @@ static void VULKAN_INTERNAL_CleanCommandBuffer(
|
||||||
|
|
||||||
for (i = 0; i < commandBuffer->transferBufferCount; i += 1)
|
for (i = 0; i < commandBuffer->transferBufferCount; i += 1)
|
||||||
{
|
{
|
||||||
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer);
|
if (commandBuffer->transferBuffers[i]->fromPool)
|
||||||
SDL_free(commandBuffer->transferBuffers[i]);
|
{
|
||||||
commandBuffer->transferBuffers[i] = NULL;
|
SDL_LockMutex(renderer->transferBufferPool.lock);
|
||||||
|
|
||||||
|
commandBuffer->transferBuffers[i]->offset = 0;
|
||||||
|
renderer->transferBufferPool.availableBuffers[renderer->transferBufferPool.availableBufferCount] = commandBuffer->transferBuffers[i];
|
||||||
|
renderer->transferBufferPool.availableBufferCount += 1;
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->transferBufferPool.lock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer);
|
||||||
|
SDL_free(commandBuffer->transferBuffers[i]);
|
||||||
|
commandBuffer->transferBuffers[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
commandBuffer->transferBufferCount = 0;
|
commandBuffer->transferBufferCount = 0;
|
||||||
|
@ -11392,6 +11463,9 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
/* Variables: Image Format Detection */
|
/* Variables: Image Format Detection */
|
||||||
VkImageFormatProperties imageFormatProperties;
|
VkImageFormatProperties imageFormatProperties;
|
||||||
|
|
||||||
|
/* Variables: Transfer buffer init */
|
||||||
|
VulkanTransferBuffer *transferBuffer;
|
||||||
|
|
||||||
SDL_memset(renderer, '\0', sizeof(VulkanRenderer));
|
SDL_memset(renderer, '\0', sizeof(VulkanRenderer));
|
||||||
renderer->debugMode = debugMode;
|
renderer->debugMode = debugMode;
|
||||||
|
|
||||||
|
@ -11774,6 +11848,40 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
renderer->renderTargetHashArray.count = 0;
|
renderer->renderTargetHashArray.count = 0;
|
||||||
renderer->renderTargetHashArray.capacity = 0;
|
renderer->renderTargetHashArray.capacity = 0;
|
||||||
|
|
||||||
|
/* Initialize transfer buffer pool */
|
||||||
|
|
||||||
|
renderer->transferBufferPool.lock = SDL_CreateMutex();
|
||||||
|
|
||||||
|
renderer->transferBufferPool.availableBufferCapacity = 4;
|
||||||
|
renderer->transferBufferPool.availableBufferCount = 0;
|
||||||
|
renderer->transferBufferPool.availableBuffers = SDL_malloc(
|
||||||
|
renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (i = 0; i < renderer->transferBufferPool.availableBufferCapacity; i += 1)
|
||||||
|
{
|
||||||
|
transferBuffer = SDL_malloc(sizeof(VulkanTransferBuffer));
|
||||||
|
transferBuffer->offset = 0;
|
||||||
|
transferBuffer->fromPool = 1;
|
||||||
|
transferBuffer->buffer = VULKAN_INTERNAL_CreateBuffer(
|
||||||
|
renderer,
|
||||||
|
POOLED_TRANSFER_BUFFER_SIZE,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_READ_WRITE,
|
||||||
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
if (transferBuffer->buffer == NULL)
|
||||||
|
{
|
||||||
|
Refresh_LogError("Failed to allocate transfer buffer!");
|
||||||
|
SDL_free(transferBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->transferBufferPool.availableBuffers[i] = transferBuffer;
|
||||||
|
renderer->transferBufferPool.availableBufferCount += 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Some drivers don't support D16, so we have to fall back to D32. */
|
/* Some drivers don't support D16, so we have to fall back to D32. */
|
||||||
|
|
||||||
vulkanResult = renderer->vkGetPhysicalDeviceImageFormatProperties(
|
vulkanResult = renderer->vkGetPhysicalDeviceImageFormatProperties(
|
||||||
|
|
Loading…
Reference in New Issue