implement SetData and GetData
parent
0c095fa56d
commit
6674076423
|
@ -695,11 +695,32 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] =
|
||||||
|
|
||||||
/* Memory structures */
|
/* Memory structures */
|
||||||
|
|
||||||
typedef struct VulkanBufferContainer /* cast from Refresh_Buffer */
|
/* We use pointer indirection so that defrag can occur without objects
|
||||||
|
* needing to be aware of the backing buffers changing.
|
||||||
|
*/
|
||||||
|
typedef struct VulkanBufferContainer
|
||||||
{
|
{
|
||||||
VulkanBuffer *vulkanBuffer;
|
VulkanBuffer *vulkanBuffer;
|
||||||
} VulkanBufferContainer;
|
} VulkanBufferContainer;
|
||||||
|
|
||||||
|
/* CpuBuffers consist of multiple backing buffer containers so that data transfers
|
||||||
|
* can occur safely without the client having to explicitly manage transfer timing.
|
||||||
|
*/
|
||||||
|
typedef struct VulkanCpuBufferContainer /* cast from Refresh_CpuBuffer */
|
||||||
|
{
|
||||||
|
uint32_t sizeInBytes;
|
||||||
|
VulkanBufferContainer *activeBuffer;
|
||||||
|
|
||||||
|
/* These are all the buffers that have been used by this container.
|
||||||
|
* If a buffer is bound and then updated with Discard, a new buffer
|
||||||
|
* will be added to this list.
|
||||||
|
* These can be reused after they are submitted and command processing is complete.
|
||||||
|
*/
|
||||||
|
uint32_t bufferCapacity;
|
||||||
|
uint32_t bufferCount;
|
||||||
|
VulkanBufferContainer **backingBuffers;
|
||||||
|
} VulkanCpuBufferContainer;
|
||||||
|
|
||||||
struct VulkanBuffer
|
struct VulkanBuffer
|
||||||
{
|
{
|
||||||
VkBuffer buffer;
|
VkBuffer buffer;
|
||||||
|
@ -711,10 +732,13 @@ struct VulkanBuffer
|
||||||
uint8_t requireHostVisible;
|
uint8_t requireHostVisible;
|
||||||
uint8_t preferDeviceLocal;
|
uint8_t preferDeviceLocal;
|
||||||
uint8_t requireHostLocal;
|
uint8_t requireHostLocal;
|
||||||
|
uint8_t preserveContentsOnDefrag;
|
||||||
|
|
||||||
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
SDL_atomic_t referenceCount; /* Tracks command buffer usage */
|
||||||
|
|
||||||
VulkanBufferContainer *container;
|
VulkanBufferContainer *container;
|
||||||
|
|
||||||
|
uint8_t markedForDestroy; /* so that defrag doesn't double-free */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum VulkanUniformBufferType
|
typedef enum VulkanUniformBufferType
|
||||||
|
@ -802,6 +826,8 @@ struct VulkanTexture
|
||||||
SDL_atomic_t referenceCount;
|
SDL_atomic_t referenceCount;
|
||||||
|
|
||||||
VulkanTextureContainer *container;
|
VulkanTextureContainer *container;
|
||||||
|
|
||||||
|
uint8_t markedForDestroy; /* so that defrag doesn't double-free */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct VulkanRenderTarget
|
typedef struct VulkanRenderTarget
|
||||||
|
@ -3248,6 +3274,28 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
|
|
||||||
/* Resource tracking */
|
/* Resource tracking */
|
||||||
|
|
||||||
|
#define ADD_TO_ARRAY_UNIQUE(resource, type, array, count, capacity) \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
for (i = 0; i < commandBuffer->count; i += 1) \
|
||||||
|
{ \
|
||||||
|
if (commandBuffer->array[i] == resource) \
|
||||||
|
{ \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
if (commandBuffer->count == commandBuffer->capacity) \
|
||||||
|
{ \
|
||||||
|
commandBuffer->capacity += 1; \
|
||||||
|
commandBuffer->array = SDL_realloc( \
|
||||||
|
commandBuffer->array, \
|
||||||
|
commandBuffer->capacity * sizeof(type) \
|
||||||
|
); \
|
||||||
|
} \
|
||||||
|
commandBuffer->array[commandBuffer->count] = resource; \
|
||||||
|
commandBuffer->count += 1;
|
||||||
|
|
||||||
#define TRACK_RESOURCE(resource, type, array, count, capacity) \
|
#define TRACK_RESOURCE(resource, type, array, count, capacity) \
|
||||||
uint32_t i; \
|
uint32_t i; \
|
||||||
\
|
\
|
||||||
|
@ -3269,10 +3317,8 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
} \
|
} \
|
||||||
commandBuffer->array[commandBuffer->count] = resource; \
|
commandBuffer->array[commandBuffer->count] = resource; \
|
||||||
commandBuffer->count += 1; \
|
commandBuffer->count += 1; \
|
||||||
\
|
|
||||||
SDL_AtomicIncRef(&resource->referenceCount);
|
SDL_AtomicIncRef(&resource->referenceCount);
|
||||||
|
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_TrackBuffer(
|
static void VULKAN_INTERNAL_TrackBuffer(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
VulkanCommandBuffer *commandBuffer,
|
VulkanCommandBuffer *commandBuffer,
|
||||||
|
@ -3391,7 +3437,7 @@ static void VULKAN_INTERNAL_TrackCopiedTexture(
|
||||||
VulkanCommandBuffer *commandBuffer,
|
VulkanCommandBuffer *commandBuffer,
|
||||||
VulkanTexture *texture
|
VulkanTexture *texture
|
||||||
) {
|
) {
|
||||||
TRACK_RESOURCE(
|
ADD_TO_ARRAY_UNIQUE(
|
||||||
texture,
|
texture,
|
||||||
VulkanTexture*,
|
VulkanTexture*,
|
||||||
copiedTextures,
|
copiedTextures,
|
||||||
|
@ -3406,7 +3452,7 @@ static void VULKAN_INTERNAL_TrackCopiedBuffer(
|
||||||
VulkanCommandBuffer *commandBuffer,
|
VulkanCommandBuffer *commandBuffer,
|
||||||
VulkanBuffer *buffer
|
VulkanBuffer *buffer
|
||||||
) {
|
) {
|
||||||
TRACK_RESOURCE(
|
ADD_TO_ARRAY_UNIQUE(
|
||||||
buffer,
|
buffer,
|
||||||
VulkanBuffer*,
|
VulkanBuffer*,
|
||||||
copiedGpuBuffers,
|
copiedGpuBuffers,
|
||||||
|
@ -4145,7 +4191,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
uint8_t requireHostVisible,
|
uint8_t requireHostVisible,
|
||||||
uint8_t requireHostLocal,
|
uint8_t requireHostLocal,
|
||||||
uint8_t preferDeviceLocal,
|
uint8_t preferDeviceLocal,
|
||||||
uint8_t dedicatedAllocation
|
uint8_t dedicatedAllocation,
|
||||||
|
uint8_t preserveContentsOnDefrag
|
||||||
) {
|
) {
|
||||||
VulkanBuffer* buffer;
|
VulkanBuffer* buffer;
|
||||||
VkResult vulkanResult;
|
VkResult vulkanResult;
|
||||||
|
@ -4160,6 +4207,8 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
buffer->requireHostVisible = requireHostVisible;
|
buffer->requireHostVisible = requireHostVisible;
|
||||||
buffer->requireHostLocal = requireHostLocal;
|
buffer->requireHostLocal = requireHostLocal;
|
||||||
buffer->preferDeviceLocal = preferDeviceLocal;
|
buffer->preferDeviceLocal = preferDeviceLocal;
|
||||||
|
buffer->preserveContentsOnDefrag = preserveContentsOnDefrag;
|
||||||
|
buffer->markedForDestroy = 0;
|
||||||
|
|
||||||
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
bufferCreateInfo.pNext = NULL;
|
bufferCreateInfo.pNext = NULL;
|
||||||
|
@ -4277,6 +4326,7 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject(
|
||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
|
1,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -4321,12 +4371,17 @@ static VulkanUniformBufferObject* VULKAN_INTERNAL_CreateUniformBufferObject(
|
||||||
return uniformBufferObject;
|
return uniformBufferObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Buffer indirection so we can cleanly defrag GpuBuffers */
|
/* Indirection so we can cleanly defrag buffers */
|
||||||
static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer(
|
static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
uint32_t sizeInBytes,
|
uint32_t sizeInBytes,
|
||||||
VulkanResourceAccessType resourceAccessType,
|
VulkanResourceAccessType resourceAccessType,
|
||||||
VkBufferUsageFlags usageFlags
|
VkBufferUsageFlags usageFlags,
|
||||||
|
uint8_t requireHostVisible,
|
||||||
|
uint8_t requireHostLocal,
|
||||||
|
uint8_t preferDeviceLocal,
|
||||||
|
uint8_t dedicatedAllocation,
|
||||||
|
uint8_t preserveContentsOnDefrag
|
||||||
) {
|
) {
|
||||||
VulkanBufferContainer* bufferContainer;
|
VulkanBufferContainer* bufferContainer;
|
||||||
VulkanBuffer* buffer;
|
VulkanBuffer* buffer;
|
||||||
|
@ -4339,10 +4394,11 @@ static VulkanBufferContainer* VULKAN_INTERNAL_CreateBufferContainer(
|
||||||
sizeInBytes,
|
sizeInBytes,
|
||||||
resourceAccessType,
|
resourceAccessType,
|
||||||
usageFlags,
|
usageFlags,
|
||||||
0,
|
requireHostVisible,
|
||||||
0,
|
requireHostLocal,
|
||||||
1,
|
preferDeviceLocal,
|
||||||
0
|
dedicatedAllocation,
|
||||||
|
preserveContentsOnDefrag
|
||||||
);
|
);
|
||||||
|
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
|
@ -5413,6 +5469,7 @@ static VulkanTexture* VULKAN_INTERNAL_CreateTexture(
|
||||||
|
|
||||||
texture->isCube = 0;
|
texture->isCube = 0;
|
||||||
texture->is3D = 0;
|
texture->is3D = 0;
|
||||||
|
texture->markedForDestroy = 0;
|
||||||
|
|
||||||
if (isCube)
|
if (isCube)
|
||||||
{
|
{
|
||||||
|
@ -6812,20 +6869,26 @@ static Refresh_GpuBuffer* VULKAN_CreateGpuBuffer(
|
||||||
(VulkanRenderer*) driverData,
|
(VulkanRenderer*) driverData,
|
||||||
sizeInBytes,
|
sizeInBytes,
|
||||||
resourceAccessType,
|
resourceAccessType,
|
||||||
vulkanUsageFlags
|
vulkanUsageFlags,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer(
|
static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
uint32_t sizeInBytes,
|
uint32_t sizeInBytes
|
||||||
void **pDataPtr
|
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VkBufferUsageFlags vulkanUsageFlags =
|
VkBufferUsageFlags vulkanUsageFlags =
|
||||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||||
|
VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) SDL_malloc(sizeof(VulkanCpuBufferContainer));
|
||||||
|
|
||||||
VulkanBuffer *vulkanBuffer = VULKAN_INTERNAL_CreateBuffer(
|
bufferContainer->sizeInBytes = sizeInBytes;
|
||||||
|
bufferContainer->activeBuffer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||||
renderer,
|
renderer,
|
||||||
sizeInBytes,
|
sizeInBytes,
|
||||||
RESOURCE_ACCESS_NONE,
|
RESOURCE_ACCESS_NONE,
|
||||||
|
@ -6833,12 +6896,18 @@ static Refresh_CpuBuffer* VULKAN_CreateCpuBuffer(
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
1
|
0,
|
||||||
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
*pDataPtr = vulkanBuffer->usedRegion->allocation->mapPointer;
|
bufferContainer->bufferCapacity = 1;
|
||||||
|
bufferContainer->bufferCount = 1;
|
||||||
|
bufferContainer->backingBuffers = SDL_malloc(
|
||||||
|
bufferContainer->bufferCapacity * sizeof(VulkanBufferContainer*)
|
||||||
|
);
|
||||||
|
bufferContainer->backingBuffers[0] = bufferContainer->activeBuffer;
|
||||||
|
|
||||||
return (Refresh_CpuBuffer*) vulkanBuffer;
|
return (Refresh_CpuBuffer*) bufferContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setters */
|
/* Setters */
|
||||||
|
@ -7169,6 +7238,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
VulkanTexture *vulkanTexture
|
VulkanTexture *vulkanTexture
|
||||||
) {
|
) {
|
||||||
|
if (vulkanTexture->markedForDestroy) { return; }
|
||||||
|
|
||||||
SDL_LockMutex(renderer->disposeLock);
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
@ -7184,6 +7255,8 @@ static void VULKAN_INTERNAL_QueueDestroyTexture(
|
||||||
] = vulkanTexture;
|
] = vulkanTexture;
|
||||||
renderer->texturesToDestroyCount += 1;
|
renderer->texturesToDestroyCount += 1;
|
||||||
|
|
||||||
|
vulkanTexture->markedForDestroy = 1;
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7232,6 +7305,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
VulkanBuffer *vulkanBuffer
|
VulkanBuffer *vulkanBuffer
|
||||||
) {
|
) {
|
||||||
|
if (vulkanBuffer->markedForDestroy) { return; }
|
||||||
|
|
||||||
SDL_LockMutex(renderer->disposeLock);
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
@ -7247,6 +7322,8 @@ static void VULKAN_INTERNAL_QueueDestroyBuffer(
|
||||||
] = vulkanBuffer;
|
] = vulkanBuffer;
|
||||||
renderer->buffersToDestroyCount += 1;
|
renderer->buffersToDestroyCount += 1;
|
||||||
|
|
||||||
|
vulkanBuffer->markedForDestroy = 1;
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7262,7 +7339,7 @@ static void VULKAN_QueueDestroyGpuBuffer(
|
||||||
|
|
||||||
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer);
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer);
|
||||||
|
|
||||||
/* Containers are just client handles, so we can destroy immediately */
|
/* Containers are just client handles, so we can free immediately */
|
||||||
SDL_free(vulkanBufferContainer);
|
SDL_free(vulkanBufferContainer);
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
|
@ -7273,11 +7350,20 @@ static void VULKAN_QueueDestroyCpuBuffer(
|
||||||
Refresh_CpuBuffer *buffer
|
Refresh_CpuBuffer *buffer
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer;
|
VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) buffer;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
SDL_LockMutex(renderer->disposeLock);
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, vulkanBuffer);
|
for (i = 0; i < bufferContainer->bufferCount; i += 1)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_QueueDestroyBuffer(renderer, bufferContainer->backingBuffers[i]->vulkanBuffer);
|
||||||
|
SDL_free(bufferContainer->backingBuffers[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Containers are just client handles, so we can free immediately */
|
||||||
|
SDL_free(bufferContainer->backingBuffers);
|
||||||
|
SDL_free(bufferContainer);
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
@ -8342,6 +8428,108 @@ static void VULKAN_EndComputePass(
|
||||||
vulkanCommandBuffer->currentComputePipeline = NULL;
|
vulkanCommandBuffer->currentComputePipeline = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void VULKAN_INTERNAL_DiscardActiveCpuBuffer(
|
||||||
|
VulkanRenderer *renderer,
|
||||||
|
VulkanCpuBufferContainer *cpuBufferContainer
|
||||||
|
) {
|
||||||
|
VulkanBufferContainer *cpuBuffer;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 0;
|
||||||
|
|
||||||
|
/* If a previously-discarded buffer is available, we can use that. */
|
||||||
|
for (i = 0; i < cpuBufferContainer->bufferCount; i += 1)
|
||||||
|
{
|
||||||
|
cpuBuffer = cpuBufferContainer->backingBuffers[i];
|
||||||
|
if (SDL_AtomicGet(&cpuBuffer->vulkanBuffer->referenceCount) == 0)
|
||||||
|
{
|
||||||
|
cpuBufferContainer->activeBuffer = cpuBuffer;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No buffer is available, generate a new one. */
|
||||||
|
cpuBufferContainer->activeBuffer = VULKAN_INTERNAL_CreateBufferContainer(
|
||||||
|
renderer,
|
||||||
|
cpuBufferContainer->sizeInBytes,
|
||||||
|
RESOURCE_ACCESS_NONE,
|
||||||
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
|
cpuBufferContainer->backingBuffers,
|
||||||
|
VulkanBufferContainer*,
|
||||||
|
cpuBufferContainer->bufferCount + 1,
|
||||||
|
cpuBufferContainer->bufferCapacity,
|
||||||
|
cpuBufferContainer->bufferCapacity * 2
|
||||||
|
);
|
||||||
|
|
||||||
|
cpuBufferContainer->backingBuffers[
|
||||||
|
cpuBufferContainer->bufferCount
|
||||||
|
] = cpuBufferContainer->activeBuffer;
|
||||||
|
cpuBufferContainer->bufferCount += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void VULKAN_SetData(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
void* data,
|
||||||
|
Refresh_CpuBuffer *cpuBuffer,
|
||||||
|
Refresh_BufferCopy *copyParams,
|
||||||
|
Refresh_SetDataOptions option
|
||||||
|
) {
|
||||||
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
|
VulkanBuffer *vulkanBuffer = cpuBufferContainer->activeBuffer->vulkanBuffer;
|
||||||
|
|
||||||
|
if (option == REFRESH_SETDATAOPTIONS_DISCARD && SDL_AtomicGet(&vulkanBuffer->referenceCount) > 0)
|
||||||
|
{
|
||||||
|
VULKAN_INTERNAL_DiscardActiveCpuBuffer(
|
||||||
|
renderer,
|
||||||
|
cpuBufferContainer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *bufferPointer =
|
||||||
|
vulkanBuffer->usedRegion->allocation->mapPointer +
|
||||||
|
vulkanBuffer->usedRegion->resourceOffset +
|
||||||
|
copyParams->dstOffset;
|
||||||
|
|
||||||
|
SDL_memcpy(
|
||||||
|
bufferPointer,
|
||||||
|
((uint8_t*) data) + copyParams->srcOffset,
|
||||||
|
copyParams->size
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void VULKAN_GetData(
|
||||||
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_CpuBuffer *cpuBuffer,
|
||||||
|
void* data,
|
||||||
|
Refresh_BufferCopy *copyParams
|
||||||
|
) {
|
||||||
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
|
VulkanBuffer *vulkanBuffer = cpuBufferContainer->activeBuffer->vulkanBuffer;
|
||||||
|
|
||||||
|
uint8_t *bufferPointer =
|
||||||
|
vulkanBuffer->usedRegion->allocation->mapPointer +
|
||||||
|
vulkanBuffer->usedRegion->resourceOffset +
|
||||||
|
copyParams->srcOffset;
|
||||||
|
|
||||||
|
SDL_memcpy(
|
||||||
|
((uint8_t*) data) + copyParams->dstOffset,
|
||||||
|
bufferPointer,
|
||||||
|
copyParams->size
|
||||||
|
);
|
||||||
|
|
||||||
|
vulkanBuffer->preserveContentsOnDefrag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void VULKAN_BeginCopyPass(
|
static void VULKAN_BeginCopyPass(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer
|
Refresh_CommandBuffer *commandBuffer
|
||||||
|
@ -8362,7 +8550,7 @@ static void VULKAN_UploadToTexture(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer;
|
VulkanCpuBufferContainer *bufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture;
|
VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture;
|
||||||
VkBufferImageCopy imageCopy;
|
VkBufferImageCopy imageCopy;
|
||||||
|
|
||||||
|
@ -8370,7 +8558,7 @@ static void VULKAN_UploadToTexture(
|
||||||
renderer,
|
renderer,
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
vulkanCpuBuffer
|
bufferContainer->activeBuffer->vulkanBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
|
@ -8403,14 +8591,14 @@ static void VULKAN_UploadToTexture(
|
||||||
|
|
||||||
renderer->vkCmdCopyBufferToImage(
|
renderer->vkCmdCopyBufferToImage(
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
vulkanCpuBuffer->buffer,
|
bufferContainer->activeBuffer->vulkanBuffer->buffer,
|
||||||
vulkanTexture->image,
|
vulkanTexture->image,
|
||||||
AccessMap[vulkanTexture->resourceAccessType].imageLayout,
|
AccessMap[vulkanTexture->resourceAccessType].imageLayout,
|
||||||
1,
|
1,
|
||||||
&imageCopy
|
&imageCopy
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, bufferContainer->activeBuffer->vulkanBuffer);
|
||||||
VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
||||||
VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
||||||
}
|
}
|
||||||
|
@ -8424,7 +8612,7 @@ static void VULKAN_UploadToBuffer(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer;
|
VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer;
|
VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer;
|
||||||
VkBufferCopy bufferCopy;
|
VkBufferCopy bufferCopy;
|
||||||
|
|
||||||
|
@ -8432,7 +8620,7 @@ static void VULKAN_UploadToBuffer(
|
||||||
renderer,
|
renderer,
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
vulkanCpuBuffer
|
cpuBufferContainer->activeBuffer->vulkanBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
@ -8448,13 +8636,13 @@ static void VULKAN_UploadToBuffer(
|
||||||
|
|
||||||
renderer->vkCmdCopyBuffer(
|
renderer->vkCmdCopyBuffer(
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
vulkanCpuBuffer->buffer,
|
cpuBufferContainer->activeBuffer->vulkanBuffer->buffer,
|
||||||
vulkanGpuBuffer->buffer,
|
vulkanGpuBuffer->buffer,
|
||||||
1,
|
1,
|
||||||
&bufferCopy
|
&bufferCopy
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer);
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
||||||
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
VULKAN_INTERNAL_TrackCopiedBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
||||||
}
|
}
|
||||||
|
@ -8469,14 +8657,14 @@ static void VULKAN_DownloadFromTexture(
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture;
|
VulkanTexture *vulkanTexture = ((VulkanTextureContainer*) textureSlice->texture)->vulkanTexture;
|
||||||
VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer;
|
VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
VkBufferImageCopy imageCopy;
|
VkBufferImageCopy imageCopy;
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
vulkanCpuBuffer
|
cpuBufferContainer->activeBuffer->vulkanBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_ImageMemoryBarrier(
|
VULKAN_INTERNAL_ImageMemoryBarrier(
|
||||||
|
@ -8511,14 +8699,16 @@ static void VULKAN_DownloadFromTexture(
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
vulkanTexture->image,
|
vulkanTexture->image,
|
||||||
AccessMap[vulkanTexture->resourceAccessType].imageLayout,
|
AccessMap[vulkanTexture->resourceAccessType].imageLayout,
|
||||||
vulkanCpuBuffer->buffer,
|
cpuBufferContainer->activeBuffer->vulkanBuffer->buffer,
|
||||||
1,
|
1,
|
||||||
&imageCopy
|
&imageCopy
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer);
|
||||||
VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
||||||
VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
VULKAN_INTERNAL_TrackCopiedTexture(renderer, vulkanCommandBuffer, vulkanTexture);
|
||||||
|
|
||||||
|
cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_DownloadFromBuffer(
|
static void VULKAN_DownloadFromBuffer(
|
||||||
|
@ -8530,7 +8720,7 @@ static void VULKAN_DownloadFromBuffer(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer *vulkanCpuBuffer = (VulkanBuffer*) cpuBuffer;
|
VulkanCpuBufferContainer *cpuBufferContainer = (VulkanCpuBufferContainer*) cpuBuffer;
|
||||||
VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer;
|
VulkanBuffer *vulkanGpuBuffer = ((VulkanBufferContainer*) gpuBuffer)->vulkanBuffer;
|
||||||
VkBufferCopy bufferCopy;
|
VkBufferCopy bufferCopy;
|
||||||
|
|
||||||
|
@ -8538,7 +8728,7 @@ static void VULKAN_DownloadFromBuffer(
|
||||||
renderer,
|
renderer,
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
vulkanCpuBuffer
|
cpuBufferContainer->activeBuffer->vulkanBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
@ -8555,14 +8745,16 @@ static void VULKAN_DownloadFromBuffer(
|
||||||
renderer->vkCmdCopyBuffer(
|
renderer->vkCmdCopyBuffer(
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
vulkanGpuBuffer->buffer,
|
vulkanGpuBuffer->buffer,
|
||||||
vulkanCpuBuffer->buffer,
|
cpuBufferContainer->activeBuffer->vulkanBuffer->buffer,
|
||||||
1,
|
1,
|
||||||
&bufferCopy
|
&bufferCopy
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanCpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, cpuBufferContainer->activeBuffer->vulkanBuffer);
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, vulkanCommandBuffer, vulkanGpuBuffer);
|
||||||
|
|
||||||
|
cpuBufferContainer->activeBuffer->vulkanBuffer->preserveContentsOnDefrag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_CopyTextureToTexture(
|
static void VULKAN_CopyTextureToTexture(
|
||||||
|
@ -10118,7 +10310,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
currentRegion = allocation->usedRegions[i];
|
currentRegion = allocation->usedRegions[i];
|
||||||
copyResourceAccessType = RESOURCE_ACCESS_NONE;
|
copyResourceAccessType = RESOURCE_ACCESS_NONE;
|
||||||
|
|
||||||
if (currentRegion->isBuffer)
|
if (currentRegion->isBuffer && !currentRegion->vulkanBuffer->markedForDestroy)
|
||||||
{
|
{
|
||||||
currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
currentRegion->vulkanBuffer->usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||||
|
|
||||||
|
@ -10130,7 +10322,8 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
currentRegion->vulkanBuffer->requireHostVisible,
|
currentRegion->vulkanBuffer->requireHostVisible,
|
||||||
currentRegion->vulkanBuffer->requireHostLocal,
|
currentRegion->vulkanBuffer->requireHostLocal,
|
||||||
currentRegion->vulkanBuffer->preferDeviceLocal,
|
currentRegion->vulkanBuffer->preferDeviceLocal,
|
||||||
0
|
0,
|
||||||
|
currentRegion->vulkanBuffer->preserveContentsOnDefrag
|
||||||
);
|
);
|
||||||
|
|
||||||
if (newBuffer == NULL)
|
if (newBuffer == NULL)
|
||||||
|
@ -10139,43 +10332,47 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType;
|
/* Copy buffer contents if necessary */
|
||||||
|
if (currentRegion->vulkanBuffer->preserveContentsOnDefrag)
|
||||||
|
{
|
||||||
|
originalResourceAccessType = currentRegion->vulkanBuffer->resourceAccessType;
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_READ,
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
currentRegion->vulkanBuffer
|
currentRegion->vulkanBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
RESOURCE_ACCESS_TRANSFER_WRITE,
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
newBuffer
|
newBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
bufferCopy.srcOffset = 0;
|
bufferCopy.srcOffset = 0;
|
||||||
bufferCopy.dstOffset = 0;
|
bufferCopy.dstOffset = 0;
|
||||||
bufferCopy.size = currentRegion->resourceSize;
|
bufferCopy.size = currentRegion->resourceSize;
|
||||||
|
|
||||||
renderer->vkCmdCopyBuffer(
|
renderer->vkCmdCopyBuffer(
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
currentRegion->vulkanBuffer->buffer,
|
currentRegion->vulkanBuffer->buffer,
|
||||||
newBuffer->buffer,
|
newBuffer->buffer,
|
||||||
1,
|
1,
|
||||||
&bufferCopy
|
&bufferCopy
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_BufferMemoryBarrier(
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
renderer,
|
renderer,
|
||||||
commandBuffer->commandBuffer,
|
commandBuffer->commandBuffer,
|
||||||
originalResourceAccessType,
|
originalResourceAccessType,
|
||||||
newBuffer
|
newBuffer
|
||||||
);
|
);
|
||||||
|
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, currentRegion->vulkanBuffer);
|
||||||
VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer);
|
VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* re-point original container to new buffer */
|
/* re-point original container to new buffer */
|
||||||
if (currentRegion->vulkanBuffer->container != NULL)
|
if (currentRegion->vulkanBuffer->container != NULL)
|
||||||
|
@ -10189,7 +10386,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory(
|
||||||
|
|
||||||
renderer->needDefrag = 1;
|
renderer->needDefrag = 1;
|
||||||
}
|
}
|
||||||
else
|
else if (!currentRegion->vulkanTexture->markedForDestroy)
|
||||||
{
|
{
|
||||||
newTexture = VULKAN_INTERNAL_CreateTexture(
|
newTexture = VULKAN_INTERNAL_CreateTexture(
|
||||||
renderer,
|
renderer,
|
||||||
|
|
Loading…
Reference in New Issue