forked from MoonsideGames/Refresh
Fix uniform buffers not tracking correctly
parent
a15e26b124
commit
54a8ff122c
|
@ -719,7 +719,7 @@ typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
|||
typedef struct VulkanUniformBuffer
|
||||
{
|
||||
VulkanUniformBufferPool *pool;
|
||||
VulkanBuffer *vulkanBuffer;
|
||||
VulkanBufferContainer *vulkanBufferContainer; /* use container to avoid defrag issues */
|
||||
VkDeviceSize offset;
|
||||
VkDescriptorSet descriptorSet;
|
||||
} VulkanUniformBuffer;
|
||||
|
@ -2398,12 +2398,6 @@ static uint8_t VULKAN_INTERNAL_FindMemoryType(
|
|||
}
|
||||
}
|
||||
|
||||
Refresh_LogWarn(
|
||||
"Failed to find memory type %X, required %X, ignored %X",
|
||||
typeFilter,
|
||||
requiredProperties,
|
||||
ignoredProperties
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2587,7 +2581,6 @@ static uint8_t VULKAN_INTERNAL_AllocateMemory(
|
|||
|
||||
SDL_free(allocation);
|
||||
|
||||
Refresh_LogWarn("vkAllocateMemory: %s", VkErrorMessages(result));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2821,7 +2814,6 @@ static uint8_t VULKAN_INTERNAL_BindResourceMemory(
|
|||
SDL_UnlockMutex(renderer->allocatorLock);
|
||||
|
||||
/* Responsibility of the caller to handle being out of memory */
|
||||
Refresh_LogWarn("Failed to allocate memory!");
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -4221,6 +4213,7 @@ static VulkanUniformBufferPool* VULKAN_INTERNAL_CreateUniformBufferPool(
|
|||
}
|
||||
|
||||
static void VULKAN_INTERNAL_BindUniformBuffer(
|
||||
VulkanRenderer *renderer,
|
||||
VulkanCommandBuffer *commandBuffer,
|
||||
VulkanUniformBuffer *uniformBuffer
|
||||
) {
|
||||
|
@ -4235,6 +4228,47 @@ 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 */
|
||||
static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer(
|
||||
VulkanRenderer *renderer,
|
||||
uint32_t sizeInBytes,
|
||||
VulkanResourceAccessType resourceAccessType,
|
||||
VkBufferUsageFlags usageFlags
|
||||
) {
|
||||
VulkanBufferContainer* bufferContainer;
|
||||
VulkanBuffer* buffer;
|
||||
|
||||
/* always set transfer bits so we can defrag */
|
||||
usageFlags |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
|
||||
buffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
renderer,
|
||||
sizeInBytes,
|
||||
resourceAccessType,
|
||||
usageFlags,
|
||||
1,
|
||||
0
|
||||
);
|
||||
|
||||
if (buffer == NULL)
|
||||
{
|
||||
Refresh_LogError("Failed to create buffer!");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bufferContainer = SDL_malloc(sizeof(VulkanBufferContainer));
|
||||
bufferContainer->vulkanBuffer = buffer;
|
||||
buffer->container = bufferContainer;
|
||||
|
||||
return (VulkanBufferContainer*) bufferContainer;
|
||||
}
|
||||
|
||||
static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
||||
|
@ -4265,25 +4299,22 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
return 0;
|
||||
}
|
||||
|
||||
VulkanUniformBuffer *buffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
buffer->pool = bufferPool;
|
||||
|
||||
buffer->vulkanBuffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->pool = bufferPool;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
UBO_BUFFER_SIZE,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0,
|
||||
0
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
||||
);
|
||||
|
||||
if (buffer->vulkanBuffer == NULL)
|
||||
if (uniformBuffer->vulkanBufferContainer == NULL)
|
||||
{
|
||||
Refresh_LogError("Failed to create buffer for uniform buffer!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
buffer->offset = 0;
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
||||
|
@ -4303,7 +4334,7 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
bufferPool->descriptorPool.descriptorPools[bufferPool->descriptorPool.descriptorPoolCount - 1],
|
||||
descriptorSetLayout,
|
||||
1,
|
||||
&buffer->descriptorSet
|
||||
&uniformBuffer->descriptorSet
|
||||
)) {
|
||||
Refresh_LogError("Failed to allocate uniform descriptor set!");
|
||||
return 0;
|
||||
|
@ -4321,7 +4352,7 @@ static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
|||
);
|
||||
}
|
||||
|
||||
bufferPool->availableBuffers[bufferPool->availableBufferCount] = buffer;
|
||||
bufferPool->availableBuffers[bufferPool->availableBufferCount] = uniformBuffer;
|
||||
bufferPool->availableBufferCount += 1;
|
||||
|
||||
return 1;
|
||||
|
@ -4357,17 +4388,16 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
VulkanUniformBuffer *buffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
|
||||
buffer->vulkanBuffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
VulkanUniformBuffer *uniformBuffer = SDL_malloc(sizeof(VulkanUniformBuffer));
|
||||
uniformBuffer->pool = NULL;
|
||||
uniformBuffer->vulkanBufferContainer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||
renderer,
|
||||
UBO_BUFFER_SIZE,
|
||||
resourceAccessType,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
0,
|
||||
0
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
||||
);
|
||||
buffer->offset = 0;
|
||||
|
||||
uniformBuffer->offset = 0;
|
||||
|
||||
/* Allocate a descriptor set for the uniform buffer */
|
||||
|
||||
|
@ -4376,12 +4406,12 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
renderer->defaultDescriptorPool,
|
||||
descriptorSetLayout,
|
||||
1,
|
||||
&buffer->descriptorSet
|
||||
&uniformBuffer->descriptorSet
|
||||
);
|
||||
|
||||
/* Update the descriptor set for the first and last time! */
|
||||
|
||||
descriptorBufferInfo.buffer = buffer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.range = VK_WHOLE_SIZE;
|
||||
|
||||
|
@ -4391,7 +4421,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
||||
writeDescriptorSet.dstArrayElement = 0;
|
||||
writeDescriptorSet.dstBinding = 0;
|
||||
writeDescriptorSet.dstSet = buffer->descriptorSet;
|
||||
writeDescriptorSet.dstSet = uniformBuffer->descriptorSet;
|
||||
writeDescriptorSet.pBufferInfo = &descriptorBufferInfo;
|
||||
writeDescriptorSet.pImageInfo = NULL;
|
||||
writeDescriptorSet.pTexelBufferView = NULL;
|
||||
|
@ -4404,9 +4434,9 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_CreateDummyUniformBuffer(
|
|||
NULL
|
||||
);
|
||||
|
||||
buffer->pool = NULL; /* No pool because this is a dummy */
|
||||
uniformBuffer->pool = NULL; /* No pool because this is a dummy */
|
||||
|
||||
return buffer;
|
||||
return uniformBuffer;
|
||||
}
|
||||
|
||||
static void VULKAN_INTERNAL_DestroyUniformBufferPool(
|
||||
|
@ -4428,7 +4458,8 @@ 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]->vulkanBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, uniformBufferPool->availableBuffers[i]->vulkanBufferContainer->vulkanBuffer);
|
||||
SDL_free(uniformBufferPool->availableBuffers[i]->vulkanBufferContainer);
|
||||
SDL_free(uniformBufferPool->availableBuffers[i]);
|
||||
}
|
||||
|
||||
|
@ -4466,7 +4497,7 @@ static VulkanUniformBuffer* VULKAN_INTERNAL_AcquireUniformBufferFromPool(
|
|||
|
||||
/* Update the descriptor set with the correct range */
|
||||
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.buffer = uniformBuffer->vulkanBufferContainer->vulkanBuffer->buffer;
|
||||
descriptorBufferInfo.offset = 0;
|
||||
descriptorBufferInfo.range = blockSize;
|
||||
|
||||
|
@ -5106,6 +5137,7 @@ static void VULKAN_INTERNAL_EndCommandBuffer(
|
|||
commandBuffer->computeUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
commandBuffer,
|
||||
commandBuffer->computeUniformBuffer
|
||||
);
|
||||
|
@ -5146,9 +5178,13 @@ static void VULKAN_DestroyDevice(
|
|||
|
||||
SDL_free(renderer->submittedCommandBuffers);
|
||||
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer->vulkanBuffer);
|
||||
VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyComputeUniformBuffer->vulkanBuffer);
|
||||
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);
|
||||
|
@ -7035,8 +7071,6 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
|||
Refresh_BufferUsageFlags usageFlags,
|
||||
uint32_t sizeInBytes
|
||||
) {
|
||||
VulkanBufferContainer* bufferContainer;
|
||||
VulkanBuffer* buffer;
|
||||
VulkanResourceAccessType resourceAccessType;
|
||||
VkBufferUsageFlags vulkanUsageFlags =
|
||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
|
@ -7070,26 +7104,12 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
|||
resourceAccessType = RESOURCE_ACCESS_INDIRECT_BUFFER;
|
||||
}
|
||||
|
||||
buffer = VULKAN_INTERNAL_CreateBuffer(
|
||||
(VulkanRenderer*)driverData,
|
||||
return (Refresh_Buffer*) VULKAN_INTERNAL_CreateBufferContainer(
|
||||
(VulkanRenderer*) driverData,
|
||||
sizeInBytes,
|
||||
resourceAccessType,
|
||||
vulkanUsageFlags,
|
||||
1,
|
||||
0
|
||||
vulkanUsageFlags
|
||||
);
|
||||
|
||||
if (buffer == NULL)
|
||||
{
|
||||
Refresh_LogError("Failed to create buffer!");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bufferContainer = SDL_malloc(sizeof(VulkanBufferContainer));
|
||||
bufferContainer->vulkanBuffer = buffer;
|
||||
buffer->container = bufferContainer;
|
||||
|
||||
return (Refresh_Buffer*) bufferContainer;
|
||||
}
|
||||
|
||||
/* Setters */
|
||||
|
@ -7792,6 +7812,7 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer
|
||||
);
|
||||
|
@ -7805,7 +7826,7 @@ static uint32_t VULKAN_PushVertexShaderUniforms(
|
|||
offset = vulkanCommandBuffer->vertexUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->vertexUniformBuffer->vulkanBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
|
@ -7835,6 +7856,7 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer
|
||||
);
|
||||
|
@ -7848,7 +7870,7 @@ static uint32_t VULKAN_PushFragmentShaderUniforms(
|
|||
offset = vulkanCommandBuffer->fragmentUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->vulkanBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
|
@ -7877,6 +7899,7 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
) {
|
||||
/* We're out of space in this buffer, bind the old one and acquire a new one */
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer
|
||||
);
|
||||
|
@ -7890,7 +7913,7 @@ static uint32_t VULKAN_PushComputeShaderUniforms(
|
|||
offset = vulkanCommandBuffer->computeUniformBuffer->offset;
|
||||
|
||||
VULKAN_INTERNAL_SetBufferData(
|
||||
vulkanCommandBuffer->computeUniformBuffer->vulkanBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->vulkanBufferContainer->vulkanBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes
|
||||
|
@ -8971,6 +8994,7 @@ static void VULKAN_EndRenderPass(
|
|||
vulkanCommandBuffer->vertexUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer
|
||||
);
|
||||
|
@ -8981,6 +9005,7 @@ static void VULKAN_EndRenderPass(
|
|||
vulkanCommandBuffer->fragmentUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer
|
||||
);
|
||||
|
@ -9066,6 +9091,7 @@ static void VULKAN_BindGraphicsPipeline(
|
|||
vulkanCommandBuffer->vertexUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->vertexUniformBuffer
|
||||
);
|
||||
|
@ -9088,6 +9114,7 @@ static void VULKAN_BindGraphicsPipeline(
|
|||
vulkanCommandBuffer->fragmentUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->fragmentUniformBuffer
|
||||
);
|
||||
|
@ -9219,6 +9246,7 @@ static void VULKAN_BindComputePipeline(
|
|||
vulkanCommandBuffer->computeUniformBuffer != NULL
|
||||
) {
|
||||
VULKAN_INTERNAL_BindUniformBuffer(
|
||||
renderer,
|
||||
vulkanCommandBuffer,
|
||||
vulkanCommandBuffer->computeUniformBuffer
|
||||
);
|
||||
|
@ -11705,14 +11733,6 @@ static Refresh_Device* VULKAN_CreateDevice(
|
|||
renderer->physicalDeviceDriverProperties.conformanceVersion.minor,
|
||||
renderer->physicalDeviceDriverProperties.conformanceVersion.patch
|
||||
);
|
||||
Refresh_LogWarn(
|
||||
"\n"
|
||||
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
||||
"! Refresh Vulkan is still in development! !\n"
|
||||
"! The API is unstable and subject to change !\n"
|
||||
"! You have been warned! !\n"
|
||||
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||
);
|
||||
|
||||
if (!VULKAN_INTERNAL_CreateLogicalDevice(
|
||||
renderer
|
||||
|
|
Loading…
Reference in New Issue