implement buffer defrag
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
746ad10c7b
commit
19ebe7284d
|
@ -689,7 +689,12 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] =
|
||||||
|
|
||||||
/* Memory structures */
|
/* Memory structures */
|
||||||
|
|
||||||
struct VulkanBuffer /* cast from Refresh_Buffer */
|
typedef struct VulkanBufferContainer /* cast from Refresh_Buffer */
|
||||||
|
{
|
||||||
|
VulkanBuffer *vulkanBuffer;
|
||||||
|
} VulkanBufferContainer;
|
||||||
|
|
||||||
|
struct VulkanBuffer
|
||||||
{
|
{
|
||||||
VkBuffer buffer;
|
VkBuffer buffer;
|
||||||
VkDeviceSize size;
|
VkDeviceSize size;
|
||||||
|
@ -698,6 +703,8 @@ struct VulkanBuffer /* cast from Refresh_Buffer */
|
||||||
VkBufferUsageFlags usage;
|
VkBufferUsageFlags usage;
|
||||||
|
|
||||||
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
||||||
|
|
||||||
|
VulkanBufferContainer *container;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
||||||
|
@ -1752,6 +1759,10 @@ typedef struct VulkanRenderer
|
||||||
uint32_t buffersToDestroyCount;
|
uint32_t buffersToDestroyCount;
|
||||||
uint32_t buffersToDestroyCapacity;
|
uint32_t buffersToDestroyCapacity;
|
||||||
|
|
||||||
|
VulkanBufferContainer **bufferContainersToDestroy;
|
||||||
|
uint32_t bufferContainersToDestroyCount;
|
||||||
|
uint32_t bufferContainersToDestroyCapacity;
|
||||||
|
|
||||||
VulkanSampler **samplersToDestroy;
|
VulkanSampler **samplersToDestroy;
|
||||||
uint32_t samplersToDestroyCount;
|
uint32_t samplersToDestroyCount;
|
||||||
uint32_t samplersToDestroyCapacity;
|
uint32_t samplersToDestroyCapacity;
|
||||||
|
@ -3086,8 +3097,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
VulkanMemoryAllocation *allocation;
|
VulkanMemoryAllocation *allocation;
|
||||||
uint32_t allocationIndexToDefrag;
|
uint32_t allocationIndexToDefrag;
|
||||||
VulkanMemoryUsedRegion *currentRegion;
|
VulkanMemoryUsedRegion *currentRegion;
|
||||||
VulkanMemoryUsedRegion *newRegion;
|
VulkanBuffer* newBuffer;
|
||||||
VkBuffer copyBuffer;
|
|
||||||
VkBufferCopy bufferCopy;
|
VkBufferCopy bufferCopy;
|
||||||
VkImage copyImage;
|
VkImage copyImage;
|
||||||
VkImageCopy *imageCopyRegions;
|
VkImageCopy *imageCopyRegions;
|
||||||
|
@ -3101,7 +3111,6 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
VulkanResourceAccessType copyResourceAccessType = RESOURCE_ACCESS_NONE;
|
VulkanResourceAccessType copyResourceAccessType = RESOURCE_ACCESS_NONE;
|
||||||
VulkanResourceAccessType originalResourceAccessType;
|
VulkanResourceAccessType originalResourceAccessType;
|
||||||
|
|
||||||
SDL_LockMutex(renderer->commandLock);
|
|
||||||
SDL_LockMutex(renderer->allocatorLock);
|
SDL_LockMutex(renderer->allocatorLock);
|
||||||
|
|
||||||
renderer->needDefrag = 0;
|
renderer->needDefrag = 0;
|
||||||
|
@ -3125,6 +3134,10 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
allocation
|
allocation
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* For each used region in the allocation
|
||||||
|
* create a new resource, copy the data
|
||||||
|
* and re-point the resource containers
|
||||||
|
*/
|
||||||
for (i = 0; i < allocation->usedRegionCount; i += 1)
|
for (i = 0; i < allocation->usedRegionCount; i += 1)
|
||||||
{
|
{
|
||||||
currentRegion = allocation->usedRegions[i];
|
currentRegion = allocation->usedRegions[i];
|
||||||
|
@ -3132,40 +3145,20 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
|
|
||||||
if (currentRegion->isBuffer)
|
if (currentRegion->isBuffer)
|
||||||
{
|
{
|
||||||
currentRegion->vulkanBuffer->bufferCreateInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||||
|
|
||||||
copyBuffer = VULKAN_INTERNAL_CreateBuffer(
|
// TODO: modify this stuff to change the buffer pointers around
|
||||||
|
newBuffer = VULKAN_INTERNAL_CreateBuffer(
|
||||||
renderer,
|
renderer,
|
||||||
currentRegion->vulkanBuffer->bufferCreateInfo.size,
|
currentRegion->vulkanBuffer->size,
|
||||||
RESOURCE_ACCESS_NONE,
|
RESOURCE_ACCESS_NONE,
|
||||||
currentRegion->vulkanBuffer->bufferCreateInfo.usage | VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
currentRegion->vulkanBuffer->usage
|
||||||
);
|
);
|
||||||
|
|
||||||
result = renderer->vkCreateBuffer(
|
if (newBuffer == NULL)
|
||||||
renderer->logicalDevice,
|
|
||||||
¤tRegion->vulkanBuffer->bufferCreateInfo,
|
|
||||||
NULL,
|
|
||||||
©Buffer
|
|
||||||
);
|
|
||||||
VULKAN_ERROR_CHECK(result, vkCreateBuffer, 0)
|
|
||||||
|
|
||||||
if (
|
|
||||||
VULKAN_INTERNAL_BindMemoryForBuffer(
|
|
||||||
renderer,
|
|
||||||
copyBuffer,
|
|
||||||
currentRegion->resourceSize,
|
|
||||||
currentRegion->vulkanBuffer->preferDeviceLocal,
|
|
||||||
0,
|
|
||||||
&newRegion
|
|
||||||
) != 1)
|
|
||||||
{
|
{
|
||||||
/* Out of memory, abort */
|
Refresh_LogError("Failed to create defrag buffer!");
|
||||||
renderer->vkDestroyBuffer(
|
return 0;
|
||||||
renderer->logicalDevice,
|
|
||||||
copyBuffer,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType;
|
originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType;
|
||||||
|
@ -3180,7 +3173,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
copyBuffer,
|
newBuffer,
|
||||||
©ResourceAccessType
|
©ResourceAccessType
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -3191,7 +3184,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
renderer->vkCmdCopyBuffer(
|
renderer->vkCmdCopyBuffer(
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
currentRegion->vulkanBuffer->buffer,
|
currentRegion->vulkanBuffer->buffer,
|
||||||
copyBuffer,
|
newBuffer->buffer,
|
||||||
1,
|
1,
|
||||||
&bufferCopy
|
&bufferCopy
|
||||||
);
|
);
|
||||||
|
@ -3199,45 +3192,18 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
originalResourceAccessType,
|
originalResourceAccessType,
|
||||||
copyBuffer,
|
newBuffer,
|
||||||
©ResourceAccessType
|
©ResourceAccessType
|
||||||
);
|
);
|
||||||
|
|
||||||
if (renderer->defragmentedBuffersToDestroyCount >= renderer->defragmentedBuffersToDestroyCapacity)
|
SDL_AtomicIncRef(&newBuffer->referenceCount);
|
||||||
{
|
SDL_AtomicIncRef(¤tRegion->vulkanBuffer->referenceCount);
|
||||||
renderer->defragmentedBuffersToDestroyCapacity *= 2;
|
|
||||||
renderer->defragmentedBuffersToDestroy = SDL_realloc(
|
|
||||||
renderer->defragmentedBuffersToDestroy,
|
|
||||||
sizeof(VkBuffer) * renderer->defragmentedBuffersToDestroyCapacity
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (renderer->usedRegionsToDestroyCount >= renderer->usedRegionsToDestroyCapacity)
|
/* re-point original container to new buffer */
|
||||||
{
|
newBuffer->container = currentRegion->vulkanBuffer->container;
|
||||||
renderer->usedRegionsToDestroyCapacity *= 2;
|
newBuffer->container->vulkanBuffer = newBuffer;
|
||||||
renderer->usedRegionsToDestroy = SDL_realloc(
|
|
||||||
renderer->usedRegionsToDestroy,
|
|
||||||
sizeof(VulkanMemoryUsedRegion*) * renderer->usedRegionsToDestroyCapacity
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->defragmentedBuffersToDestroy[
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, currentRegion->vulkanBuffer);
|
||||||
renderer->defragmentedBuffersToDestroyCount
|
|
||||||
] = currentRegion->vulkanBuffer->buffer;
|
|
||||||
|
|
||||||
renderer->defragmentedBuffersToDestroyCount += 1;
|
|
||||||
|
|
||||||
renderer->usedRegionsToDestroy[
|
|
||||||
renderer->usedRegionsToDestroyCount
|
|
||||||
] = currentRegion;
|
|
||||||
|
|
||||||
renderer->usedRegionsToDestroyCount += 1;
|
|
||||||
|
|
||||||
newRegion->isBuffer = 1;
|
|
||||||
newRegion->vulkanBuffer = currentRegion->vulkanBuffer;
|
|
||||||
newRegion->vulkanBuffer->usedRegion = newRegion; /* lol */
|
|
||||||
newRegion->vulkanBuffer->buffer = copyBuffer;
|
|
||||||
newRegion->vulkanBuffer->resourceAccessType = copyResourceAccessType;
|
|
||||||
|
|
||||||
renderer->needDefrag = 1;
|
renderer->needDefrag = 1;
|
||||||
}
|
}
|
||||||
|
@ -3461,7 +3427,6 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
|
|
||||||
renderer->defragTimer = 0;
|
renderer->defragTimer = 0;
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->commandLock);
|
|
||||||
SDL_UnlockMutex(renderer->allocatorLock);
|
SDL_UnlockMutex(renderer->allocatorLock);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -5825,7 +5790,7 @@ static void VULKAN_DrawPrimitivesIndirect(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanBuffer *vulkanBuffer = ((VulkanBufferContainer*) buffer)->vulkanBuffer;
|
||||||
VkDescriptorSet descriptorSets[4];
|
VkDescriptorSet descriptorSets[4];
|
||||||
uint32_t dynamicOffsets[2];
|
uint32_t dynamicOffsets[2];
|
||||||
|
|
||||||
|
@ -7344,6 +7309,7 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
||||||
Refresh_BufferUsageFlags usageFlags,
|
Refresh_BufferUsageFlags usageFlags,
|
||||||
uint32_t sizeInBytes
|
uint32_t sizeInBytes
|
||||||
) {
|
) {
|
||||||
|
VulkanBufferContainer* bufferContainer;
|
||||||
VulkanBuffer* buffer;
|
VulkanBuffer* buffer;
|
||||||
VulkanResourceAccessType resourceAccessType;
|
VulkanResourceAccessType resourceAccessType;
|
||||||
VkBufferUsageFlags vulkanUsageFlags =
|
VkBufferUsageFlags vulkanUsageFlags =
|
||||||
|
@ -7391,6 +7357,11 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bufferContainer = SDL_malloc(sizeof(VulkanBufferContainer*));
|
||||||
|
bufferContainer->vulkanBuffer = buffer;
|
||||||
|
|
||||||
|
buffer->container = bufferContainer;
|
||||||
|
|
||||||
return (Refresh_Buffer*) buffer;
|
return (Refresh_Buffer*) buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7964,7 +7935,7 @@ static void VULKAN_SetBufferData(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanBuffer* vulkanBuffer = ((VulkanBufferContainer*) buffer)->vulkanBuffer;
|
||||||
VulkanTransferBuffer* transferBuffer;
|
VulkanTransferBuffer* transferBuffer;
|
||||||
uint8_t* transferBufferPointer;
|
uint8_t* transferBufferPointer;
|
||||||
VkBufferCopy bufferCopy;
|
VkBufferCopy bufferCopy;
|
||||||
|
@ -7983,8 +7954,8 @@ static void VULKAN_SetBufferData(
|
||||||
}
|
}
|
||||||
|
|
||||||
transferBufferPointer =
|
transferBufferPointer =
|
||||||
transferBuffer->buffer->allocation->mapPointer +
|
transferBuffer->buffer->usedRegion->allocation->mapPointer +
|
||||||
transferBuffer->buffer->offset +
|
transferBuffer->buffer->usedRegion->resourceOffset +
|
||||||
transferBuffer->offset;
|
transferBuffer->offset;
|
||||||
|
|
||||||
SDL_memcpy(
|
SDL_memcpy(
|
||||||
|
@ -8392,13 +8363,13 @@ static void VULKAN_GetBufferData(
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t dataLengthInBytes
|
uint32_t dataLengthInBytes
|
||||||
) {
|
) {
|
||||||
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanBuffer* vulkanBuffer = ((VulkanBufferContainer*) buffer)->vulkanBuffer;
|
||||||
uint8_t *dataPtr = (uint8_t*) data;
|
uint8_t *dataPtr = (uint8_t*) data;
|
||||||
uint8_t *mapPointer;
|
uint8_t *mapPointer;
|
||||||
|
|
||||||
mapPointer =
|
mapPointer =
|
||||||
vulkanBuffer->allocation->mapPointer +
|
vulkanBuffer->usedRegion->allocation->mapPointer +
|
||||||
vulkanBuffer->offset;
|
vulkanBuffer->usedRegion->resourceOffset;
|
||||||
|
|
||||||
SDL_memcpy(
|
SDL_memcpy(
|
||||||
dataPtr,
|
dataPtr,
|
||||||
|
@ -8416,7 +8387,7 @@ static void VULKAN_CopyTextureToBuffer(
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanTexture *vulkanTexture = (VulkanTexture*) textureSlice->texture;
|
VulkanTexture *vulkanTexture = (VulkanTexture*) textureSlice->texture;
|
||||||
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanBuffer* vulkanBuffer = ((VulkanBufferContainer*) buffer)->vulkanBuffer;
|
||||||
|
|
||||||
VulkanResourceAccessType prevResourceAccess;
|
VulkanResourceAccessType prevResourceAccess;
|
||||||
VkBufferImageCopy imageCopy;
|
VkBufferImageCopy imageCopy;
|
||||||
|
@ -8529,13 +8500,10 @@ static void VULKAN_QueueDestroySampler(
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_QueueDestroyBuffer(
|
static void VULKAN_INTERNAL_QueueDestroyBuffer(
|
||||||
Refresh_Renderer *driverData,
|
VulkanRenderer *renderer,
|
||||||
Refresh_Buffer *buffer
|
VulkanBuffer *vulkanBuffer
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
|
||||||
VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer;
|
|
||||||
|
|
||||||
SDL_LockMutex(renderer->disposeLock);
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
@ -8554,6 +8522,34 @@ static void VULKAN_QueueDestroyBuffer(
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void VULKAN_QueueDestroyBuffer(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_Buffer *buffer
|
||||||
|
) {
|
||||||
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
VulkanBufferContainer *vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
||||||
|
VulkanBuffer *vulkanBuffer = vulkanBufferContainer->vulkanBuffer;
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer);
|
||||||
|
|
||||||
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
renderer->bufferContainersToDestroy,
|
||||||
|
VulkanBufferContainer *,
|
||||||
|
renderer->bufferContainersToDestroyCount + 1,
|
||||||
|
renderer->bufferContainersToDestroyCapacity,
|
||||||
|
renderer->bufferContainersToDestroyCapacity * 2
|
||||||
|
)
|
||||||
|
|
||||||
|
renderer->bufferContainersToDestroy[
|
||||||
|
renderer->bufferContainersToDestroyCount
|
||||||
|
] = vulkanBufferContainer;
|
||||||
|
renderer->bufferContainersToDestroyCount += 1;
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
|
}
|
||||||
|
|
||||||
static void VULKAN_QueueDestroyShaderModule(
|
static void VULKAN_QueueDestroyShaderModule(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_ShaderModule *shaderModule
|
Refresh_ShaderModule *shaderModule
|
||||||
|
@ -9392,7 +9388,7 @@ static void VULKAN_BindVertexBuffers(
|
||||||
|
|
||||||
for (i = 0; i < bindingCount; i += 1)
|
for (i = 0; i < bindingCount; i += 1)
|
||||||
{
|
{
|
||||||
currentVulkanBuffer = (VulkanBuffer*) pBuffers[i];
|
currentVulkanBuffer = ((VulkanBufferContainer*) pBuffers[i])->vulkanBuffer;
|
||||||
buffers[i] = currentVulkanBuffer->buffer;
|
buffers[i] = currentVulkanBuffer->buffer;
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, currentVulkanBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, currentVulkanBuffer);
|
||||||
}
|
}
|
||||||
|
@ -9417,7 +9413,7 @@ static void VULKAN_BindIndexBuffer(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanBuffer* vulkanBuffer = ((VulkanBufferContainer*) buffer)->vulkanBuffer;
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanBuffer);
|
||||||
|
|
||||||
|
@ -9501,7 +9497,7 @@ static void VULKAN_BindComputeBuffers(
|
||||||
|
|
||||||
for (i = 0; i < computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount; i += 1)
|
for (i = 0; i < computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount; i += 1)
|
||||||
{
|
{
|
||||||
currentVulkanBuffer = (VulkanBuffer*) pBuffers[i];
|
currentVulkanBuffer = ((VulkanBufferContainer*) pBuffers[i])->vulkanBuffer;
|
||||||
|
|
||||||
descriptorBufferInfos[i].buffer = currentVulkanBuffer->buffer;
|
descriptorBufferInfos[i].buffer = currentVulkanBuffer->buffer;
|
||||||
descriptorBufferInfos[i].offset = 0;
|
descriptorBufferInfos[i].offset = 0;
|
||||||
|
@ -10217,14 +10213,20 @@ static void VULKAN_INTERNAL_PerformPendingDestroys(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* containers are not vulkan resources, so no need for ref counting */
|
||||||
|
for (i = renderer->bufferContainersToDestroyCount - 1; i >= 0; i -= 1)
|
||||||
|
{
|
||||||
|
SDL_free(renderer->bufferContainersToDestroy[i]);
|
||||||
|
renderer->bufferContainersToDestroyCount -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = renderer->buffersToDestroyCount - 1; i >= 0; i -= 1)
|
for (i = renderer->buffersToDestroyCount - 1; i >= 0; i -= 1)
|
||||||
{
|
{
|
||||||
if (SDL_AtomicGet(&renderer->buffersToDestroy[i]->referenceCount) == 0)
|
if (SDL_AtomicGet(&renderer->buffersToDestroy[i]->referenceCount) == 0)
|
||||||
{
|
{
|
||||||
VULKAN_INTERNAL_DestroyBuffer(
|
VULKAN_INTERNAL_DestroyBuffer(
|
||||||
renderer,
|
renderer,
|
||||||
renderer->buffersToDestroy[i]
|
renderer->buffersToDestroy[i]);
|
||||||
);
|
|
||||||
|
|
||||||
renderer->buffersToDestroy[i] = renderer->buffersToDestroy[renderer->buffersToDestroyCount - 1];
|
renderer->buffersToDestroy[i] = renderer->buffersToDestroy[renderer->buffersToDestroyCount - 1];
|
||||||
renderer->buffersToDestroyCount -= 1;
|
renderer->buffersToDestroyCount -= 1;
|
||||||
|
@ -11009,9 +11011,6 @@ static uint8_t VULKAN_INTERNAL_IsDeviceSuitable(
|
||||||
static void VULKAN_INTERNAL_GetPhysicalDeviceProperties(
|
static void VULKAN_INTERNAL_GetPhysicalDeviceProperties(
|
||||||
VulkanRenderer *renderer
|
VulkanRenderer *renderer
|
||||||
) {
|
) {
|
||||||
VkDeviceSize deviceLocalHeapSize;
|
|
||||||
int32_t i;
|
|
||||||
|
|
||||||
renderer->physicalDeviceDriverProperties.sType =
|
renderer->physicalDeviceDriverProperties.sType =
|
||||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
|
||||||
renderer->physicalDeviceDriverProperties.pNext = NULL;
|
renderer->physicalDeviceDriverProperties.pNext = NULL;
|
||||||
|
@ -11030,21 +11029,6 @@ static void VULKAN_INTERNAL_GetPhysicalDeviceProperties(
|
||||||
renderer->physicalDevice,
|
renderer->physicalDevice,
|
||||||
&renderer->memoryProperties
|
&renderer->memoryProperties
|
||||||
);
|
);
|
||||||
|
|
||||||
deviceLocalHeapSize = 0;
|
|
||||||
for (i = 0; i < renderer->memoryProperties.memoryHeapCount; i += 1)
|
|
||||||
{
|
|
||||||
if ( renderer->memoryProperties.memoryHeaps[i].flags &
|
|
||||||
VK_MEMORY_HEAP_DEVICE_LOCAL_BIT )
|
|
||||||
{
|
|
||||||
if (renderer->memoryProperties.memoryHeaps[i].size > deviceLocalHeapSize)
|
|
||||||
{
|
|
||||||
deviceLocalHeapSize = renderer->memoryProperties.memoryHeaps[i].size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->maxDeviceLocalHeapUsage = deviceLocalHeapSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t VULKAN_INTERNAL_DeterminePhysicalDevice(
|
static uint8_t VULKAN_INTERNAL_DeterminePhysicalDevice(
|
||||||
|
@ -11861,6 +11845,14 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
renderer->buffersToDestroyCapacity
|
renderer->buffersToDestroyCapacity
|
||||||
);
|
);
|
||||||
|
|
||||||
|
renderer->bufferContainersToDestroyCapacity = 16;
|
||||||
|
renderer->bufferContainersToDestroyCount = 0;
|
||||||
|
|
||||||
|
renderer->bufferContainersToDestroy = SDL_malloc(
|
||||||
|
sizeof(VulkanBufferContainer *) *
|
||||||
|
renderer->bufferContainersToDestroyCapacity
|
||||||
|
);
|
||||||
|
|
||||||
renderer->samplersToDestroyCapacity = 16;
|
renderer->samplersToDestroyCapacity = 16;
|
||||||
renderer->samplersToDestroyCount = 0;
|
renderer->samplersToDestroyCount = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue