Vulkan: persisent map buffers

pull/1/head
cosmonaut 2021-01-13 18:02:45 -08:00
parent b12b785dbe
commit bf91de783f
2 changed files with 45 additions and 110 deletions

View File

@ -921,7 +921,7 @@ void Refresh_GetTextureHandles(
Refresh_TextureHandles *handles
) {
NULL_RETURN(device);
return device->GetTextureHandles(
device->GetTextureHandles(
device->driverData,
texture,
handles

View File

@ -432,6 +432,7 @@ struct VulkanMemoryAllocation
uint32_t freeRegionCount;
uint32_t freeRegionCapacity;
uint8_t dedicated;
uint8_t *mapPointer;
SDL_mutex *memoryLock;
};
@ -1797,6 +1798,28 @@ static uint8_t VULKAN_INTERNAL_AllocateMemory(
return 0;
}
if (buffer != NULL)
{
result = renderer->vkMapMemory(
renderer->logicalDevice,
allocation->memory,
0,
allocation->size,
0,
(void**) &allocation->mapPointer
);
if (result != VK_SUCCESS)
{
LogVulkanResult("vkMapMemory", result);
return 0;
}
}
else
{
allocation->mapPointer = NULL;
}
VULKAN_INTERNAL_NewMemoryFreeRegion(
allocation,
0,
@ -6030,41 +6053,24 @@ static void VULKAN_SetTextureData(
VkCommandBuffer commandBuffer = renderer->transferCommandBuffers[renderer->frameIndex];
VkBufferImageCopy imageCopy;
VkResult vulkanResult;
uint8_t *mapPointer;
uint8_t *stagingBufferPointer;
SDL_LockMutex(renderer->stagingLock);
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLengthInBytes);
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
stagingBufferPointer =
renderer->textureStagingBuffer->subBuffers[0]->allocation->mapPointer +
renderer->textureStagingBuffer->subBuffers[0]->offset +
renderer->textureStagingBufferOffset;
vulkanResult = renderer->vkMapMemory(
renderer->logicalDevice,
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
renderer->textureStagingBuffer->subBuffers[0]->offset + renderer->textureStagingBufferOffset,
renderer->textureStagingBuffer->subBuffers[0]->size,
0,
(void**) &mapPointer
SDL_memcpy(
stagingBufferPointer,
data,
dataLengthInBytes
);
if (vulkanResult != VK_SUCCESS)
{
Refresh_LogError("Failed to map buffer memory!");
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
SDL_UnlockMutex(renderer->stagingLock);
return;
}
SDL_memcpy(mapPointer, data, dataLengthInBytes);
renderer->vkUnmapMemory(
renderer->logicalDevice,
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
);
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
VULKAN_INTERNAL_ImageMemoryBarrier(
renderer,
commandBuffer,
@ -6144,15 +6150,17 @@ static void VULKAN_SetTextureDataYUV(
int32_t yDataLength = BytesPerImage(yWidth, yHeight, REFRESH_COLORFORMAT_R8);
int32_t uvDataLength = BytesPerImage(uvWidth, uvHeight, REFRESH_COLORFORMAT_R8);
VkBufferImageCopy imageCopy;
uint8_t *mapPointer;
VkResult vulkanResult;
uint8_t * stagingBufferPointer;
SDL_LockMutex(renderer->stagingLock);
VULKAN_INTERNAL_MaybeExpandStagingBuffer(renderer, dataLength);
VULKAN_INTERNAL_MaybeBeginTransferCommandBuffer(renderer);
SDL_LockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
stagingBufferPointer =
renderer->textureStagingBuffer->subBuffers[0]->allocation->mapPointer +
renderer->textureStagingBuffer->subBuffers[0]->offset +
renderer->textureStagingBufferOffset;
/* Initialize values that are the same for Y, U, and V */
@ -6169,25 +6177,8 @@ static void VULKAN_SetTextureDataYUV(
tex = (VulkanTexture*) y;
vulkanResult = renderer->vkMapMemory(
renderer->logicalDevice,
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory,
renderer->textureStagingBuffer->subBuffers[0]->offset + renderer->textureStagingBufferOffset,
renderer->textureStagingBuffer->subBuffers[0]->size,
0,
(void**) &mapPointer
);
if (vulkanResult != VK_SUCCESS)
{
Refresh_LogError("Failed to map buffer memory!");
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
SDL_UnlockMutex(renderer->stagingLock);
return;
}
SDL_memcpy(
mapPointer,
stagingBufferPointer,
dataPtr,
yDataLength
);
@ -6236,7 +6227,7 @@ static void VULKAN_SetTextureDataYUV(
tex = (VulkanTexture*) u;
SDL_memcpy(
mapPointer + yDataLength,
stagingBufferPointer + yDataLength,
dataPtr + yDataLength,
uvDataLength
);
@ -6271,18 +6262,11 @@ static void VULKAN_SetTextureDataYUV(
tex = (VulkanTexture*) v;
SDL_memcpy(
mapPointer + yDataLength + uvDataLength,
stagingBufferPointer + yDataLength + uvDataLength,
dataPtr + yDataLength + uvDataLength,
uvDataLength
);
renderer->vkUnmapMemory(
renderer->logicalDevice,
renderer->textureStagingBuffer->subBuffers[0]->allocation->memory
);
SDL_UnlockMutex(renderer->textureStagingBuffer->subBuffers[0]->allocation->memoryLock);
VULKAN_INTERNAL_ImageMemoryBarrier(
renderer,
commandBuffer,
@ -6483,7 +6467,6 @@ static void VULKAN_SetBufferData(
) {
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
VulkanBuffer* vulkanBuffer = (VulkanBuffer*)buffer;
uint8_t* mapPointer;
VkResult vulkanResult;
uint32_t i;
@ -6508,38 +6491,12 @@ static void VULKAN_SetBufferData(
return;
}
SDL_LockMutex(SUBBUF->allocation->memoryLock);
/* Map the memory and perform the copy */
vulkanResult = renderer->vkMapMemory(
renderer->logicalDevice,
SUBBUF->allocation->memory,
SUBBUF->offset,
SUBBUF->size,
0,
(void**)&mapPointer
);
if (vulkanResult != VK_SUCCESS)
{
Refresh_LogError("Failed to map buffer memory!");
SDL_UnlockMutex(SUBBUF->allocation->memoryLock);
return;
}
SDL_memcpy(
mapPointer + offsetInBytes,
SUBBUF->allocation->mapPointer + SUBBUF->offset + offsetInBytes,
data,
dataLength
);
renderer->vkUnmapMemory(
renderer->logicalDevice,
SUBBUF->allocation->memory
);
SDL_UnlockMutex(SUBBUF->allocation->memoryLock);
#undef CURIDX
#undef SUBBUF
}
@ -7033,38 +6990,16 @@ static void VULKAN_GetBufferData(
VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer;
uint8_t *dataPtr = (uint8_t*) data;
uint8_t *mapPointer;
VkResult vulkanResult;
SDL_LockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
vulkanResult = renderer->vkMapMemory(
renderer->logicalDevice,
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memory,
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->offset,
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->size,
0,
(void**) &mapPointer
);
if (vulkanResult != VK_SUCCESS)
{
Refresh_LogError("Failed to map buffer memory!");
SDL_UnlockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
return;
}
mapPointer =
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->mapPointer +
vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->offset;
SDL_memcpy(
dataPtr,
mapPointer,
dataLengthInBytes
);
renderer->vkUnmapMemory(
renderer->logicalDevice,
vulkanBuffer->subBuffers[0]->allocation->memory
);
SDL_UnlockMutex(vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->allocation->memoryLock);
}
static void VULKAN_CopyTextureToBuffer(