Compare commits
3 Commits
db1455ceb0
...
53c439ef04
Author | SHA1 | Date |
---|---|---|
|
53c439ef04 | |
|
ae98ae2345 | |
|
425694ede5 |
|
@ -79,8 +79,7 @@ typedef struct VulkanExtensions
|
|||
#define ALLOCATION_INCREMENT 16000000 /* 16MB */
|
||||
#define TRANSFER_BUFFER_STARTING_SIZE 8000000 /* 8MB */
|
||||
#define POOLED_TRANSFER_BUFFER_SIZE 16000000 /* 16MB */
|
||||
#define UBO_BUFFER_SIZE 16000000 /* 16MB */
|
||||
#define UBO_SECTION_SIZE 4000 /* 4KB */
|
||||
#define UBO_BUFFER_SIZE 16000 /* 16KB */
|
||||
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
||||
#define DEFRAG_TIME 200
|
||||
#define WINDOW_DATA "Refresh_VulkanWindowData"
|
||||
|
@ -720,8 +719,8 @@ typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
|||
typedef struct VulkanUniformBuffer
|
||||
{
|
||||
VulkanUniformBufferPool *pool;
|
||||
VkDeviceSize poolOffset; /* memory offset relative to the pool buffer */
|
||||
VkDeviceSize offset; /* based on uniform pushes */
|
||||
VulkanBufferContainer *vulkanBufferContainer; /* use container to avoid defrag issues */
|
||||
VkDeviceSize offset;
|
||||
VkDescriptorSet descriptorSet;
|
||||
} VulkanUniformBuffer;
|
||||
|
||||
|
@ -747,13 +746,10 @@ typedef struct VulkanUniformDescriptorPool
|
|||
uint32_t availableDescriptorSetCount;
|
||||
} VulkanUniformDescriptorPool;
|
||||
|
||||
/* This is actually just one buffer that we carve slices out of. */
|
||||
struct VulkanUniformBufferPool
|
||||
{
|
||||
VulkanUniformBufferType type;
|
||||
VulkanUniformDescriptorPool descriptorPool;
|
||||
VulkanBuffer *buffer;
|
||||
VkDeviceSize nextAvailableOffset;
|
||||
SDL_mutex *lock;
|
||||
|
||||
VulkanUniformBuffer **availableBuffers;
|
||||
|
@ -1786,8 +1782,6 @@ typedef struct VulkanRenderer
|
|||
VkDescriptorSetLayout vertexUniformDescriptorSetLayout;
|
||||
VkDescriptorSetLayout fragmentUniformDescriptorSetLayout;
|
||||
VkDescriptorSetLayout computeUniformDescriptorSetLayout;
|
||||
|
||||
VulkanBuffer *dummyBuffer;
|
||||
VulkanUniformBuffer *dummyVertexUniformBuffer;
|
||||
VulkanUniformBuffer *dummyFragmentUniformBuffer;
|
||||
VulkanUniformBuffer *dummyComputeUniformBuffer;
|
||||
|
@ -4209,36 +4203,6 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool(
|
|||
VulkanUniformBufferType uniformBufferType
|
||||
) {
|
||||
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->lock = SDL_CreateMutex();
|
||||
|
@ -4272,6 +4236,12 @@ static void VULKAN_INTERNAL_BindUniformBuffer(
|
|||
|
||||
commandBuffer->boundUniformBuffers[commandBuffer->boundUniformBufferCount] = uniformBuffer;
|
||||
commandBuffer->boundUniformBufferCount += 1;
|
||||
|
||||
VULKAN_INTERNAL_TrackBuffer(
|
||||
renderer,
|
||||
commandBuffer,
|
||||
uniformBuffer->vulkanBufferContainer->vulkanBuffer
|
||||
);
|
||||
}
|
||||
|
||||
/* Buffer indirection so we can cleanly defrag */
|
||||
|
@ -4340,18 +4310,22 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->pool = bufferPool;
|
||||
uniformBuffer->poolOffset = bufferPool->nextAvailableOffset;
|
||||
uniformBuffer->offset = 0;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
UBO_BUFFER_SIZE,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0
|
||||
);
|
||||
|
||||
bufferPool->nextAvailableOffset += UBO_SECTION_SIZE;
|
||||
|
||||
if (bufferPool->nextAvailableOffset >= UBO_BUFFER_SIZE)
|
||||
if (uniformBuffer->vulkanBufferContainer == NULL)
|
||||
{
|
||||
Refresh_LogError("Uniform buffer overflow!");
|
||||
SDL_free(uniformBuffer);
|
||||
Refresh_LogError("Failed to create buffer for uniform buffer!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
||||
if (bufferPool->descriptorPool.availableDescriptorSetCount == 0)
|
||||
|
@ -4361,7 +4335,6 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
&bufferPool->descriptorPool
|
||||
)) {
|
||||
Refresh_LogError("Failed to add uniform descriptor pool!");
|
||||
SDL_free(uniformBuffer);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -4426,7 +4399,15 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
}
|
||||
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->poolOffset = 0;
|
||||
uniformBuffer->pool = NULL;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
1,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
1
|
||||
);
|
||||
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
@ -4441,7 +4422,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
|
||||
/* Update the descriptor set for the first and last time! */
|
||||
|
||||
descriptorBufferInfo.buffer = renderer->dummyBuffer->buffer;
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.range = VK_WHOLE_SIZE;
|
||||
|
||||
|
@ -4488,11 +4469,11 @@ static void VULKAN_INTERNAL_DestroyUniformBufferPool(
|
|||
/* This is always destroyed after submissions, so all buffers are available */
|
||||
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]);
|
||||
}
|
||||
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->buffer);
|
||||
|
||||
SDL_DestroyMutex(uniformBufferPool->lock);
|
||||
SDL_free(uniformBufferPool->availableBuffers);
|
||||
SDL_free(uniformBufferPool);
|
||||
|
@ -4527,8 +4508,8 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_AcquireUniformBufferFromPool(
|
|||
|
||||
/* Update the descriptor set with the correct range */
|
||||
|
||||
descriptorBufferInfo.buffer = uniformBuffer->pool->buffer->buffer;
|
||||
descriptorBufferInfo.offset = uniformBuffer->poolOffset;
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.range = blockSize;
|
||||
|
||||
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
|
@ -5208,7 +5189,13 @@ static void VULKAN_DestroyDevice(
|
|||
|
||||
SDL_free(renderer->submittedCommandBuffers);
|
||||
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBufferContainer->vulkanBuffer);
|
||||
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->dummyFragmentUniformBuffer);
|
||||
|
@ -7941,7 +7928,7 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->vertexUniformBuffer->offset +
|
||||
graphicsPipeline->vertexUniformBlockSize >=
|
||||
UBO_SECTION_SIZE
|
||||
UBO_BUFFER_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -7959,8 +7946,8 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
offset = vulkanCommandBuffer->vertexUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->vertexUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->poolOffset + vulkanCommandBuffer->vertexUniformBuffer->offset,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -7985,7 +7972,7 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->offset +
|
||||
graphicsPipeline->fragmentUniformBlockSize >=
|
||||
UBO_SECTION_SIZE
|
||||
UBO_BUFFER_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -8003,8 +7990,8 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
offset = vulkanCommandBuffer->fragmentUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->poolOffset + vulkanCommandBuffer->fragmentUniformBuffer->offset,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -8028,7 +8015,7 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
if (
|
||||
vulkanCommandBuffer->computeUniformBuffer->offset +
|
||||
computePipeline->uniformBlockSize >=
|
||||
UBO_SECTION_SIZE
|
||||
UBO_BUFFER_SIZE
|
||||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
|
@ -8046,8 +8033,8 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
offset = vulkanCommandBuffer->computeUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->computeUniformBuffer->pool->buffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->poolOffset + vulkanCommandBuffer->computeUniformBuffer->offset,
|
||||
vulkanCommandBuffer->computeUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
);
|
||||
|
@ -12084,15 +12071,6 @@ static Refresh_Device* VULKAN_CreateDevice(
|
|||
|
||||
/* 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,
|
||||
UNIFORM_BUFFER_VERTEX
|
||||
|
|
Loading…
Reference in New Issue