forked from MoonsideGames/Refresh
memory thread safety
parent
e82bce10dc
commit
e91a83f357
|
@ -432,6 +432,7 @@ struct VulkanMemoryAllocation
|
||||||
uint32_t freeRegionCount;
|
uint32_t freeRegionCount;
|
||||||
uint32_t freeRegionCapacity;
|
uint32_t freeRegionCapacity;
|
||||||
uint8_t dedicated;
|
uint8_t dedicated;
|
||||||
|
SDL_mutex *memoryLock;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct VulkanMemoryAllocator
|
typedef struct VulkanMemoryAllocator
|
||||||
|
@ -1737,6 +1738,7 @@ static uint8_t VULKAN_INTERNAL_AllocateMemory(
|
||||||
|
|
||||||
allocation = SDL_malloc(sizeof(VulkanMemoryAllocation));
|
allocation = SDL_malloc(sizeof(VulkanMemoryAllocation));
|
||||||
allocation->size = allocationSize;
|
allocation->size = allocationSize;
|
||||||
|
allocation->memoryLock = SDL_CreateMutex();
|
||||||
|
|
||||||
if (dedicated)
|
if (dedicated)
|
||||||
{
|
{
|
||||||
|
@ -2157,6 +2159,7 @@ static void VULKAN_INTERNAL_DestroyTexture(
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_DestroyMutex(texture->allocation->memoryLock);
|
||||||
SDL_free(texture->allocation->freeRegions);
|
SDL_free(texture->allocation->freeRegions);
|
||||||
SDL_free(texture->allocation);
|
SDL_free(texture->allocation);
|
||||||
}
|
}
|
||||||
|
@ -2243,6 +2246,7 @@ static void VULKAN_INTERNAL_DestroyBuffer(
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_DestroyMutex(buffer->subBuffers[i]->allocation->memoryLock);
|
||||||
SDL_free(buffer->subBuffers[i]->allocation->freeRegions);
|
SDL_free(buffer->subBuffers[i]->allocation->freeRegions);
|
||||||
SDL_free(buffer->subBuffers[i]->allocation);
|
SDL_free(buffer->subBuffers[i]->allocation);
|
||||||
}
|
}
|
||||||
|
@ -3324,6 +3328,8 @@ static uint8_t VULKAN_INTERNAL_CreateBuffer(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_LockMutex(buffer->subBuffers[i]->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkBindBufferMemory(
|
vulkanResult = renderer->vkBindBufferMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
buffer->subBuffers[i]->buffer,
|
buffer->subBuffers[i]->buffer,
|
||||||
|
@ -3331,6 +3337,8 @@ static uint8_t VULKAN_INTERNAL_CreateBuffer(
|
||||||
buffer->subBuffers[i]->offset
|
buffer->subBuffers[i]->offset
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(buffer->subBuffers[i]->allocation->memoryLock);
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to bind buffer memory!");
|
REFRESH_LogError("Failed to bind buffer memory!");
|
||||||
|
@ -3618,6 +3626,7 @@ static void VULKAN_DestroyDevice(
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_DestroyMutex(allocator->allocations[j]->memoryLock);
|
||||||
SDL_free(allocator->allocations[j]);
|
SDL_free(allocator->allocations[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5458,6 +5467,8 @@ static uint8_t VULKAN_INTERNAL_CreateTexture(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_LockMutex(texture->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkBindImageMemory(
|
vulkanResult = renderer->vkBindImageMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
texture->image,
|
texture->image,
|
||||||
|
@ -5465,6 +5476,8 @@ static uint8_t VULKAN_INTERNAL_CreateTexture(
|
||||||
texture->offset
|
texture->offset
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(texture->allocation->memoryLock);
|
||||||
|
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
LogVulkanResult("vkBindImageMemory", vulkanResult);
|
LogVulkanResult("vkBindImageMemory", vulkanResult);
|
||||||
|
@ -6001,6 +6014,8 @@ static void VULKAN_SetTextureData2D(
|
||||||
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLengthInBytes);
|
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLengthInBytes);
|
||||||
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkMapMemory(
|
vulkanResult = renderer->vkMapMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
||||||
|
@ -6013,6 +6028,7 @@ static void VULKAN_SetTextureData2D(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6023,6 +6039,8 @@ static void VULKAN_SetTextureData2D(
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer,
|
commandBuffer,
|
||||||
|
@ -6104,6 +6122,8 @@ static void VULKAN_SetTextureData3D(
|
||||||
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
||||||
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkMapMemory(
|
vulkanResult = renderer->vkMapMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
||||||
|
@ -6116,6 +6136,7 @@ static void VULKAN_SetTextureData3D(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6126,6 +6147,8 @@ static void VULKAN_SetTextureData3D(
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer,
|
commandBuffer,
|
||||||
|
@ -6206,6 +6229,8 @@ static void VULKAN_SetTextureDataCube(
|
||||||
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
||||||
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkMapMemory(
|
vulkanResult = renderer->vkMapMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
|
||||||
|
@ -6218,6 +6243,7 @@ static void VULKAN_SetTextureDataCube(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6228,6 +6254,8 @@ static void VULKAN_SetTextureDataCube(
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer,
|
commandBuffer,
|
||||||
|
@ -6311,6 +6339,8 @@ static void VULKAN_SetTextureDataYUV(
|
||||||
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
|
||||||
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
/* Initialize values that are the same for Y, U, and V */
|
/* Initialize values that are the same for Y, U, and V */
|
||||||
|
|
||||||
imageCopy.imageExtent.depth = 1;
|
imageCopy.imageExtent.depth = 1;
|
||||||
|
@ -6338,6 +6368,7 @@ static void VULKAN_SetTextureDataYUV(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6436,6 +6467,8 @@ static void VULKAN_SetTextureDataYUV(
|
||||||
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer,
|
commandBuffer,
|
||||||
|
@ -6684,6 +6717,7 @@ static void VULKAN_SetBufferData(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_LockMutex(SUBBUF->allocation->memoryLock);
|
||||||
|
|
||||||
/* Map the memory and perform the copy */
|
/* Map the memory and perform the copy */
|
||||||
vulkanResult = renderer->vkMapMemory(
|
vulkanResult = renderer->vkMapMemory(
|
||||||
|
@ -6698,6 +6732,7 @@ static void VULKAN_SetBufferData(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(SUBBUF->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6712,6 +6747,8 @@ static void VULKAN_SetBufferData(
|
||||||
SUBBUF->allocation->memory
|
SUBBUF->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(SUBBUF->allocation->memoryLock);
|
||||||
|
|
||||||
#undef CURIDX
|
#undef CURIDX
|
||||||
#undef SUBBUF
|
#undef SUBBUF
|
||||||
}
|
}
|
||||||
|
@ -7207,6 +7244,8 @@ static void VULKAN_GetBufferData(
|
||||||
uint8_t *mapPointer;
|
uint8_t *mapPointer;
|
||||||
VkResult vulkanResult;
|
VkResult vulkanResult;
|
||||||
|
|
||||||
|
SDL_LockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
|
||||||
|
|
||||||
vulkanResult = renderer->vkMapMemory(
|
vulkanResult = renderer->vkMapMemory(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memory,
|
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memory,
|
||||||
|
@ -7219,6 +7258,7 @@ static void VULKAN_GetBufferData(
|
||||||
if (vulkanResult != VK_SUCCESS)
|
if (vulkanResult != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
REFRESH_LogError("Failed to map buffer memory!");
|
REFRESH_LogError("Failed to map buffer memory!");
|
||||||
|
SDL_UnlockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7232,6 +7272,8 @@ static void VULKAN_GetBufferData(
|
||||||
renderer->logicalDevice,
|
renderer->logicalDevice,
|
||||||
vulkanBuffer->subBuffers[0]->allocation->memory
|
vulkanBuffer->subBuffers[0]->allocation->memory
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SDL_UnlockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_CopyTextureData(
|
static void VULKAN_INTERNAL_CopyTextureData(
|
||||||
|
|
Loading…
Reference in New Issue