revise buffer data upload ABI
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
0cd9a2e8e9
commit
0c153607f5
|
@ -96,6 +96,12 @@ typedef enum Refresh_StoreOp
|
||||||
REFRESH_STOREOP_DONT_CARE
|
REFRESH_STOREOP_DONT_CARE
|
||||||
} Refresh_StoreOp;
|
} Refresh_StoreOp;
|
||||||
|
|
||||||
|
typedef enum Refresh_SetDataOptions
|
||||||
|
{
|
||||||
|
REFRESH_SETDATAOPTIONS_IMMEDIATE,
|
||||||
|
REFRESH_SETDATAOPTIONS_DEFERRED
|
||||||
|
} Refresh_SetDataOptions;
|
||||||
|
|
||||||
typedef enum Refresh_ClearOptionsBits
|
typedef enum Refresh_ClearOptionsBits
|
||||||
{
|
{
|
||||||
REFRESH_CLEAROPTIONS_COLOR = 0x00000001,
|
REFRESH_CLEAROPTIONS_COLOR = 0x00000001,
|
||||||
|
@ -962,13 +968,16 @@ REFRESHAPI void Refresh_CopyTextureToBuffer(
|
||||||
* offsetInBytes: The starting offset of the buffer to write into.
|
* offsetInBytes: The starting offset of the buffer to write into.
|
||||||
* data: The client data to write into the buffer.
|
* data: The client data to write into the buffer.
|
||||||
* dataLength: The length of data from the client buffer to write.
|
* dataLength: The length of data from the client buffer to write.
|
||||||
|
* setDataOption: Specifies how the buffer data will be copied.
|
||||||
*/
|
*/
|
||||||
REFRESHAPI void Refresh_SetBufferData(
|
REFRESHAPI void Refresh_SetBufferData(
|
||||||
Refresh_Device *device,
|
Refresh_Device *device,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Buffer *buffer,
|
Refresh_Buffer *buffer,
|
||||||
uint32_t offsetInBytes,
|
uint32_t offsetInBytes,
|
||||||
void* data,
|
void* data,
|
||||||
uint32_t dataLength
|
uint32_t dataLength,
|
||||||
|
Refresh_SetDataOptions setDataOption
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Pushes vertex shader params to the device.
|
/* Pushes vertex shader params to the device.
|
||||||
|
|
|
@ -453,18 +453,22 @@ void Refresh_CopyTextureToBuffer(
|
||||||
|
|
||||||
void Refresh_SetBufferData(
|
void Refresh_SetBufferData(
|
||||||
Refresh_Device *device,
|
Refresh_Device *device,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Buffer *buffer,
|
Refresh_Buffer *buffer,
|
||||||
uint32_t offsetInBytes,
|
uint32_t offsetInBytes,
|
||||||
void* data,
|
void* data,
|
||||||
uint32_t dataLength
|
uint32_t dataLength,
|
||||||
|
Refresh_SetDataOptions setDataOption
|
||||||
) {
|
) {
|
||||||
NULL_RETURN(device);
|
NULL_RETURN(device);
|
||||||
device->SetBufferData(
|
device->SetBufferData(
|
||||||
device->driverData,
|
device->driverData,
|
||||||
|
commandBuffer,
|
||||||
buffer,
|
buffer,
|
||||||
offsetInBytes,
|
offsetInBytes,
|
||||||
data,
|
data,
|
||||||
dataLength
|
dataLength,
|
||||||
|
setDataOption
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -306,10 +306,12 @@ struct Refresh_Device
|
||||||
|
|
||||||
void(*SetBufferData)(
|
void(*SetBufferData)(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Buffer *buffer,
|
Refresh_Buffer *buffer,
|
||||||
uint32_t offsetInBytes,
|
uint32_t offsetInBytes,
|
||||||
void* data,
|
void* data,
|
||||||
uint32_t dataLength
|
uint32_t dataLength,
|
||||||
|
Refresh_SetDataOptions setDataOption
|
||||||
);
|
);
|
||||||
|
|
||||||
uint32_t(*PushVertexShaderUniforms)(
|
uint32_t(*PushVertexShaderUniforms)(
|
||||||
|
|
|
@ -71,7 +71,7 @@ static uint32_t deviceExtensionCount = SDL_arraysize(deviceExtensionNames);
|
||||||
|
|
||||||
#define STARTING_ALLOCATION_SIZE 64000000 /* 64MB */
|
#define STARTING_ALLOCATION_SIZE 64000000 /* 64MB */
|
||||||
#define MAX_ALLOCATION_SIZE 256000000 /* 256MB */
|
#define MAX_ALLOCATION_SIZE 256000000 /* 256MB */
|
||||||
#define TEXTURE_STAGING_SIZE 8000000 /* 8MB */
|
#define TRANSFER_BUFFER_STARTING_SIZE 8000000 /* 8MB */
|
||||||
#define UBO_BUFFER_SIZE 16000 /* 16KB */
|
#define UBO_BUFFER_SIZE 16000 /* 16KB */
|
||||||
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
#define DESCRIPTOR_POOL_STARTING_SIZE 128
|
||||||
#define DESCRIPTOR_SET_DEACTIVATE_FRAMES 10
|
#define DESCRIPTOR_SET_DEACTIVATE_FRAMES 10
|
||||||
|
@ -652,12 +652,7 @@ static const VulkanResourceAccessInfo AccessMap[RESOURCE_ACCESS_TYPES_COUNT] =
|
||||||
|
|
||||||
/* Memory structures */
|
/* Memory structures */
|
||||||
|
|
||||||
/*
|
typedef struct VulkanBuffer /* cast from Refresh_Buffer */
|
||||||
* Our VulkanBuffer is actually a series of sub-buffers
|
|
||||||
* so we can properly support updates while a frame is in flight
|
|
||||||
* without needing a sync point
|
|
||||||
*/
|
|
||||||
typedef struct VulkanBuffer /* cast from FNA3D_Buffer */
|
|
||||||
{
|
{
|
||||||
VkBuffer buffer;
|
VkBuffer buffer;
|
||||||
VkDeviceSize size;
|
VkDeviceSize size;
|
||||||
|
@ -665,29 +660,8 @@ typedef struct VulkanBuffer /* cast from FNA3D_Buffer */
|
||||||
VulkanMemoryAllocation *allocation; /* see above */
|
VulkanMemoryAllocation *allocation; /* see above */
|
||||||
VulkanResourceAccessType resourceAccessType;
|
VulkanResourceAccessType resourceAccessType;
|
||||||
VkBufferUsageFlags usage;
|
VkBufferUsageFlags usage;
|
||||||
uint8_t bound;
|
|
||||||
} VulkanBuffer;
|
} VulkanBuffer;
|
||||||
|
|
||||||
/* To properly support updating after drawing the "buffer handle"
|
|
||||||
* we return is actually a container pointing to a buffer.
|
|
||||||
* This lets us change out the internal buffer without affecting
|
|
||||||
* the client or requiring a stall.
|
|
||||||
* The "discarded" buffers are kept around to avoid memory fragmentation
|
|
||||||
* being created by buffers that frequently discard.
|
|
||||||
*/
|
|
||||||
typedef struct VulkanBufferContainer /* cast from Refresh_Buffer */
|
|
||||||
{
|
|
||||||
VulkanBuffer *vulkanBuffer;
|
|
||||||
|
|
||||||
/* These are all the buffers that have been used by this container.
|
|
||||||
* If a buffer is bound and then updated, a new buffer will be added to this list.
|
|
||||||
* These can be reused after they are submitted and command processing is complete.
|
|
||||||
*/
|
|
||||||
VulkanBuffer **buffers;
|
|
||||||
uint32_t bufferCount;
|
|
||||||
uint32_t bufferCapacity;
|
|
||||||
} VulkanBufferContainer;
|
|
||||||
|
|
||||||
typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
typedef struct VulkanUniformBufferPool VulkanUniformBufferPool;
|
||||||
|
|
||||||
typedef struct VulkanUniformBuffer
|
typedef struct VulkanUniformBuffer
|
||||||
|
@ -1207,6 +1181,7 @@ typedef struct VulkanCommandBuffer
|
||||||
uint8_t fixed;
|
uint8_t fixed;
|
||||||
uint8_t submitted;
|
uint8_t submitted;
|
||||||
uint8_t present;
|
uint8_t present;
|
||||||
|
uint8_t renderPassInProgress;
|
||||||
|
|
||||||
VulkanCommandPool *commandPool;
|
VulkanCommandPool *commandPool;
|
||||||
|
|
||||||
|
@ -1396,20 +1371,10 @@ typedef struct VulkanRenderer
|
||||||
VulkanUniformBuffer *dummyFragmentUniformBuffer;
|
VulkanUniformBuffer *dummyFragmentUniformBuffer;
|
||||||
VulkanUniformBuffer *dummyComputeUniformBuffer;
|
VulkanUniformBuffer *dummyComputeUniformBuffer;
|
||||||
|
|
||||||
/* FIXME: rename these */
|
|
||||||
VulkanBuffer** buffersInUse;
|
|
||||||
uint32_t buffersInUseCount;
|
|
||||||
uint32_t buffersInUseCapacity;
|
|
||||||
|
|
||||||
VulkanBuffer** submittedBuffers;
|
|
||||||
uint32_t submittedBufferCount;
|
|
||||||
uint32_t submittedBufferCapacity;
|
|
||||||
|
|
||||||
VkDeviceSize minUBOAlignment;
|
VkDeviceSize minUBOAlignment;
|
||||||
|
|
||||||
SDL_mutex *allocatorLock;
|
SDL_mutex *allocatorLock;
|
||||||
SDL_mutex *disposeLock;
|
SDL_mutex *disposeLock;
|
||||||
SDL_mutex *boundBufferLock;
|
|
||||||
SDL_mutex *submitLock;
|
SDL_mutex *submitLock;
|
||||||
|
|
||||||
/* Deferred destroy storage */
|
/* Deferred destroy storage */
|
||||||
|
@ -2480,12 +2445,6 @@ static void VULKAN_INTERNAL_DestroyBuffer(
|
||||||
VulkanRenderer* renderer,
|
VulkanRenderer* renderer,
|
||||||
VulkanBuffer* buffer
|
VulkanBuffer* buffer
|
||||||
) {
|
) {
|
||||||
if (buffer->bound)
|
|
||||||
{
|
|
||||||
Refresh_LogError("Tried to destroy a bound buffer!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer->allocation->dedicated)
|
if (buffer->allocation->dedicated)
|
||||||
{
|
{
|
||||||
renderer->vkFreeMemory(
|
renderer->vkFreeMemory(
|
||||||
|
@ -3118,7 +3077,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
buffer = SDL_malloc(sizeof(VulkanBuffer));
|
buffer = SDL_malloc(sizeof(VulkanBuffer));
|
||||||
|
|
||||||
buffer->size = size;
|
buffer->size = size;
|
||||||
buffer->bound = 0;
|
|
||||||
buffer->resourceAccessType = resourceAccessType;
|
buffer->resourceAccessType = resourceAccessType;
|
||||||
buffer->usage = usage;
|
buffer->usage = usage;
|
||||||
|
|
||||||
|
@ -3184,8 +3142,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer(
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->resourceAccessType = resourceAccessType;
|
buffer->resourceAccessType = resourceAccessType;
|
||||||
buffer->bound = 0;
|
|
||||||
|
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
@ -3266,7 +3222,6 @@ static void VULKAN_INTERNAL_RotateBoundUniformBuffers(
|
||||||
|
|
||||||
for (i = 0; i < uniformBufferPool->submittedBufferCount; i += 1)
|
for (i = 0; i < uniformBufferPool->submittedBufferCount; i += 1)
|
||||||
{
|
{
|
||||||
uniformBufferPool->submittedBuffers[i]->vulkanBuffer->bound = 0;
|
|
||||||
uniformBufferPool->availableBuffers[uniformBufferPool->availableBufferCount] = uniformBufferPool->submittedBuffers[i];
|
uniformBufferPool->availableBuffers[uniformBufferPool->availableBufferCount] = uniformBufferPool->submittedBuffers[i];
|
||||||
uniformBufferPool->availableBufferCount += 1;
|
uniformBufferPool->availableBufferCount += 1;
|
||||||
}
|
}
|
||||||
|
@ -3304,8 +3259,6 @@ static void VULKAN_INTERNAL_BindUniformBuffer(VulkanUniformBuffer *uniformBuffer
|
||||||
|
|
||||||
pool->boundBuffers[pool->boundBufferCount] = uniformBuffer;
|
pool->boundBuffers[pool->boundBufferCount] = uniformBuffer;
|
||||||
pool->boundBufferCount += 1;
|
pool->boundBufferCount += 1;
|
||||||
|
|
||||||
uniformBuffer->vulkanBuffer->bound = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
static uint8_t VULKAN_INTERNAL_CreateUniformBuffer(
|
||||||
|
@ -3962,41 +3915,6 @@ static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer)
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
/* Mark sub buffers of previously submitted buffers as unbound */
|
|
||||||
for (i = 0; i < renderer->submittedBufferCount; i += 1)
|
|
||||||
{
|
|
||||||
if (renderer->submittedBuffers[i] != NULL)
|
|
||||||
{
|
|
||||||
renderer->submittedBuffers[i]->bound = 0;
|
|
||||||
renderer->submittedBuffers[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->submittedBufferCount = 0;
|
|
||||||
|
|
||||||
/* Mark currently bound buffers as submitted buffers */
|
|
||||||
if (renderer->buffersInUseCount > renderer->submittedBufferCapacity)
|
|
||||||
{
|
|
||||||
renderer->submittedBuffers = SDL_realloc(
|
|
||||||
renderer->submittedBuffers,
|
|
||||||
sizeof(VulkanBuffer*) * renderer->buffersInUseCount
|
|
||||||
);
|
|
||||||
|
|
||||||
renderer->submittedBufferCapacity = renderer->buffersInUseCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < renderer->buffersInUseCount; i += 1)
|
|
||||||
{
|
|
||||||
if (renderer->buffersInUse[i] != NULL)
|
|
||||||
{
|
|
||||||
renderer->submittedBuffers[i] = renderer->buffersInUse[i];
|
|
||||||
renderer->buffersInUse[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->submittedBufferCount = renderer->buffersInUseCount;
|
|
||||||
renderer->buffersInUseCount = 0;
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->vertexUniformBufferPool);
|
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->vertexUniformBufferPool);
|
||||||
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->fragmentUniformBufferPool);
|
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->fragmentUniformBufferPool);
|
||||||
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->computeUniformBufferPool);
|
VULKAN_INTERNAL_RotateBoundUniformBuffers(renderer->computeUniformBufferPool);
|
||||||
|
@ -4755,11 +4673,8 @@ static void VULKAN_DestroyDevice(
|
||||||
|
|
||||||
SDL_DestroyMutex(renderer->allocatorLock);
|
SDL_DestroyMutex(renderer->allocatorLock);
|
||||||
SDL_DestroyMutex(renderer->disposeLock);
|
SDL_DestroyMutex(renderer->disposeLock);
|
||||||
SDL_DestroyMutex(renderer->boundBufferLock);
|
|
||||||
SDL_DestroyMutex(renderer->submitLock);
|
SDL_DestroyMutex(renderer->submitLock);
|
||||||
|
|
||||||
SDL_free(renderer->buffersInUse);
|
|
||||||
|
|
||||||
if (!renderer->usesExternalDevice)
|
if (!renderer->usesExternalDevice)
|
||||||
{
|
{
|
||||||
renderer->vkDestroyDevice(renderer->logicalDevice, NULL);
|
renderer->vkDestroyDevice(renderer->logicalDevice, NULL);
|
||||||
|
@ -6298,8 +6213,7 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
||||||
Refresh_BufferUsageFlags usageFlags,
|
Refresh_BufferUsageFlags usageFlags,
|
||||||
uint32_t sizeInBytes
|
uint32_t sizeInBytes
|
||||||
) {
|
) {
|
||||||
VulkanBufferContainer* bufferContainer = SDL_malloc(sizeof(VulkanBufferContainer));
|
VulkanBuffer* buffer = SDL_malloc(sizeof(VulkanBuffer));
|
||||||
VulkanBuffer* buffer;
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -6332,14 +6246,7 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bufferContainer->vulkanBuffer = buffer;
|
return (Refresh_Buffer*) buffer;
|
||||||
|
|
||||||
bufferContainer->bufferCapacity = 1;
|
|
||||||
bufferContainer->bufferCount = 1;
|
|
||||||
bufferContainer->buffers = SDL_malloc(sizeof(VulkanBuffer*));
|
|
||||||
bufferContainer->buffers[0] = buffer;
|
|
||||||
|
|
||||||
return (Refresh_Buffer*) bufferContainer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setters */
|
/* Setters */
|
||||||
|
@ -6347,13 +6254,15 @@ static Refresh_Buffer* VULKAN_CreateBuffer(
|
||||||
static void VULKAN_INTERNAL_MaybeExpandTransferBuffer(
|
static void VULKAN_INTERNAL_MaybeExpandTransferBuffer(
|
||||||
VulkanRenderer *renderer,
|
VulkanRenderer *renderer,
|
||||||
VulkanCommandBuffer *commandBuffer,
|
VulkanCommandBuffer *commandBuffer,
|
||||||
VkDeviceSize textureSize
|
VkDeviceSize requiredSize
|
||||||
) {
|
) {
|
||||||
VkDeviceSize size = TEXTURE_STAGING_SIZE;
|
VkDeviceSize size;
|
||||||
|
|
||||||
if (commandBuffer->transferBufferCount == 0)
|
if (commandBuffer->transferBufferCount == 0)
|
||||||
{
|
{
|
||||||
while (size < textureSize)
|
size = TRANSFER_BUFFER_STARTING_SIZE;
|
||||||
|
|
||||||
|
while (size < requiredSize)
|
||||||
{
|
{
|
||||||
size *= 2;
|
size *= 2;
|
||||||
}
|
}
|
||||||
|
@ -6381,12 +6290,12 @@ static void VULKAN_INTERNAL_MaybeExpandTransferBuffer(
|
||||||
VkDeviceSize currentSize = commandBuffer->transferBuffers[commandBuffer->transferBufferCount - 1]->buffer->size;
|
VkDeviceSize currentSize = commandBuffer->transferBuffers[commandBuffer->transferBufferCount - 1]->buffer->size;
|
||||||
VkDeviceSize nextStagingSize = currentSize * 2;
|
VkDeviceSize nextStagingSize = currentSize * 2;
|
||||||
|
|
||||||
if (commandBuffer->transferBuffers[commandBuffer->transferBufferCount - 1]->offset + textureSize <= currentSize)
|
if (commandBuffer->transferBuffers[commandBuffer->transferBufferCount - 1]->offset + requiredSize <= currentSize)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (nextStagingSize < textureSize)
|
while (nextStagingSize < requiredSize)
|
||||||
{
|
{
|
||||||
nextStagingSize *= 2;
|
nextStagingSize *= 2;
|
||||||
}
|
}
|
||||||
|
@ -6842,56 +6751,77 @@ static void VULKAN_INTERNAL_SetBufferData(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: this should probably have a DataOptions enum */
|
|
||||||
static void VULKAN_SetBufferData(
|
static void VULKAN_SetBufferData(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
Refresh_Buffer *buffer,
|
Refresh_Buffer *buffer,
|
||||||
uint32_t offsetInBytes,
|
uint32_t offsetInBytes,
|
||||||
void* data,
|
void* data,
|
||||||
uint32_t dataLength
|
uint32_t dataLength,
|
||||||
|
Refresh_SetDataOptions setDataOption
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanBufferContainer* vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
VulkanCommandBuffer* vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBuffer* vulkanBuffer = vulkanBufferContainer->vulkanBuffer;
|
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
||||||
uint32_t i;
|
VulkanTransferBuffer* transferBuffer;
|
||||||
|
uint8_t* transferBufferPointer;
|
||||||
|
VkBufferCopy bufferCopy;
|
||||||
|
|
||||||
if (vulkanBuffer->bound)
|
if (setDataOption == REFRESH_SETDATAOPTIONS_DEFERRED)
|
||||||
{
|
{
|
||||||
for (i = 0; i < vulkanBufferContainer->bufferCount; i += 1)
|
if (vulkanCommandBuffer->renderPassInProgress)
|
||||||
{
|
{
|
||||||
if (!vulkanBufferContainer->buffers[i]->bound)
|
Refresh_LogError("Cannot perform deferred buffer updates mid-render pass!");
|
||||||
{
|
return;
|
||||||
vulkanBufferContainer->vulkanBuffer = vulkanBufferContainer->buffers[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == vulkanBufferContainer->bufferCount)
|
VULKAN_INTERNAL_MaybeExpandTransferBuffer(
|
||||||
{
|
|
||||||
vulkanBufferContainer->vulkanBuffer = VULKAN_INTERNAL_CreateBuffer(
|
|
||||||
renderer,
|
renderer,
|
||||||
vulkanBufferContainer->vulkanBuffer->size,
|
vulkanCommandBuffer,
|
||||||
vulkanBufferContainer->vulkanBuffer->resourceAccessType,
|
dataLength
|
||||||
vulkanBufferContainer->vulkanBuffer->usage
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (vulkanBufferContainer->bufferCount >= vulkanBufferContainer->bufferCapacity)
|
transferBuffer = vulkanCommandBuffer->transferBuffers[vulkanCommandBuffer->transferBufferCount - 1];
|
||||||
|
|
||||||
|
transferBufferPointer =
|
||||||
|
transferBuffer->buffer->allocation->mapPointer +
|
||||||
|
transferBuffer->buffer->offset +
|
||||||
|
transferBuffer->offset;
|
||||||
|
|
||||||
|
SDL_memcpy(
|
||||||
|
transferBufferPointer,
|
||||||
|
data,
|
||||||
|
dataLength
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_READ,
|
||||||
|
transferBuffer->buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
VULKAN_INTERNAL_BufferMemoryBarrier(
|
||||||
|
renderer,
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
RESOURCE_ACCESS_TRANSFER_WRITE,
|
||||||
|
vulkanBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
bufferCopy.srcOffset = transferBuffer->offset;
|
||||||
|
bufferCopy.dstOffset = offsetInBytes;
|
||||||
|
bufferCopy.size = (VkDeviceSize) dataLength;
|
||||||
|
|
||||||
|
renderer->vkCmdCopyBuffer(
|
||||||
|
vulkanCommandBuffer->commandBuffer,
|
||||||
|
transferBuffer->buffer->buffer,
|
||||||
|
vulkanBuffer->buffer,
|
||||||
|
1,
|
||||||
|
&bufferCopy
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (setDataOption == REFRESH_SETDATAOPTIONS_IMMEDIATE)
|
||||||
{
|
{
|
||||||
vulkanBufferContainer->bufferCapacity += 1;
|
|
||||||
vulkanBufferContainer->buffers = SDL_realloc(
|
|
||||||
vulkanBufferContainer->buffers,
|
|
||||||
vulkanBufferContainer->bufferCapacity * sizeof(VulkanBuffer*)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
vulkanBufferContainer->buffers[vulkanBufferContainer->bufferCount] = vulkanBufferContainer->vulkanBuffer;
|
|
||||||
vulkanBufferContainer->bufferCount += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vulkanBuffer = vulkanBufferContainer->vulkanBuffer;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
VULKAN_INTERNAL_SetBufferData(
|
VULKAN_INTERNAL_SetBufferData(
|
||||||
vulkanBuffer,
|
vulkanBuffer,
|
||||||
offsetInBytes,
|
offsetInBytes,
|
||||||
|
@ -6899,6 +6829,11 @@ static void VULKAN_SetBufferData(
|
||||||
dataLength
|
dataLength
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Refresh_LogError("Unrecognized Refresh_SetDataOptions value!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: this should return uint64_t */
|
/* FIXME: this should return uint64_t */
|
||||||
static uint32_t VULKAN_PushVertexShaderUniforms(
|
static uint32_t VULKAN_PushVertexShaderUniforms(
|
||||||
|
@ -7455,8 +7390,7 @@ static void VULKAN_GetBufferData(
|
||||||
uint32_t dataLengthInBytes
|
uint32_t dataLengthInBytes
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanBufferContainer* vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
||||||
VulkanBuffer* vulkanBuffer = vulkanBufferContainer->vulkanBuffer;
|
|
||||||
uint8_t *dataPtr = (uint8_t*) data;
|
uint8_t *dataPtr = (uint8_t*) data;
|
||||||
uint8_t *mapPointer;
|
uint8_t *mapPointer;
|
||||||
|
|
||||||
|
@ -7480,8 +7414,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;
|
||||||
VulkanBufferContainer *vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
||||||
VulkanBuffer* vulkanBuffer = vulkanBufferContainer->vulkanBuffer;
|
|
||||||
|
|
||||||
VulkanResourceAccessType prevResourceAccess;
|
VulkanResourceAccessType prevResourceAccess;
|
||||||
VkBufferImageCopy imageCopy;
|
VkBufferImageCopy imageCopy;
|
||||||
|
@ -7596,13 +7529,10 @@ static void VULKAN_QueueDestroyBuffer(
|
||||||
Refresh_Buffer *buffer
|
Refresh_Buffer *buffer
|
||||||
) {
|
) {
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanBufferContainer *vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
VulkanBuffer *vulkanBuffer = (VulkanBuffer*) buffer;
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
SDL_LockMutex(renderer->disposeLock);
|
SDL_LockMutex(renderer->disposeLock);
|
||||||
|
|
||||||
for (i = 0; i < vulkanBufferContainer->bufferCount; i += 1)
|
|
||||||
{
|
|
||||||
EXPAND_ARRAY_IF_NEEDED(
|
EXPAND_ARRAY_IF_NEEDED(
|
||||||
renderer->buffersToDestroy,
|
renderer->buffersToDestroy,
|
||||||
VulkanBuffer*,
|
VulkanBuffer*,
|
||||||
|
@ -7613,12 +7543,10 @@ static void VULKAN_QueueDestroyBuffer(
|
||||||
|
|
||||||
renderer->buffersToDestroy[
|
renderer->buffersToDestroy[
|
||||||
renderer->buffersToDestroyCount
|
renderer->buffersToDestroyCount
|
||||||
] = vulkanBufferContainer->buffers[i];
|
] = vulkanBuffer;
|
||||||
renderer->buffersToDestroyCount += 1;
|
renderer->buffersToDestroyCount += 1;
|
||||||
}
|
|
||||||
|
|
||||||
SDL_free(vulkanBufferContainer->buffers);
|
SDL_free(vulkanBuffer);
|
||||||
SDL_free(vulkanBufferContainer);
|
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->disposeLock);
|
SDL_UnlockMutex(renderer->disposeLock);
|
||||||
}
|
}
|
||||||
|
@ -7867,6 +7795,7 @@ static void VULKAN_BeginRenderPass(
|
||||||
);
|
);
|
||||||
|
|
||||||
vulkanCommandBuffer->currentFramebuffer = vulkanFramebuffer;
|
vulkanCommandBuffer->currentFramebuffer = vulkanFramebuffer;
|
||||||
|
vulkanCommandBuffer->renderPassInProgress = 1;
|
||||||
|
|
||||||
SDL_stack_free(clearValues);
|
SDL_stack_free(clearValues);
|
||||||
}
|
}
|
||||||
|
@ -7953,6 +7882,7 @@ static void VULKAN_EndRenderPass(
|
||||||
|
|
||||||
vulkanCommandBuffer->currentGraphicsPipeline = NULL;
|
vulkanCommandBuffer->currentGraphicsPipeline = NULL;
|
||||||
vulkanCommandBuffer->currentFramebuffer = NULL;
|
vulkanCommandBuffer->currentFramebuffer = NULL;
|
||||||
|
vulkanCommandBuffer->renderPassInProgress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_BindGraphicsPipeline(
|
static void VULKAN_BindGraphicsPipeline(
|
||||||
|
@ -8022,32 +7952,6 @@ static void VULKAN_BindGraphicsPipeline(
|
||||||
vulkanCommandBuffer->currentGraphicsPipeline = pipeline;
|
vulkanCommandBuffer->currentGraphicsPipeline = pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_INTERNAL_MarkAsBound(
|
|
||||||
VulkanRenderer* renderer,
|
|
||||||
VulkanBuffer* buffer
|
|
||||||
) {
|
|
||||||
/* Don't rebind a bound buffer */
|
|
||||||
if (buffer->bound) return;
|
|
||||||
|
|
||||||
buffer->bound = 1;
|
|
||||||
|
|
||||||
SDL_LockMutex(renderer->boundBufferLock);
|
|
||||||
|
|
||||||
if (renderer->buffersInUseCount == renderer->buffersInUseCapacity)
|
|
||||||
{
|
|
||||||
renderer->buffersInUseCapacity *= 2;
|
|
||||||
renderer->buffersInUse = SDL_realloc(
|
|
||||||
renderer->buffersInUse,
|
|
||||||
sizeof(VulkanBuffer*) * renderer->buffersInUseCapacity
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->buffersInUse[renderer->buffersInUseCount] = buffer;
|
|
||||||
renderer->buffersInUseCount += 1;
|
|
||||||
|
|
||||||
SDL_UnlockMutex(renderer->boundBufferLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void VULKAN_BindVertexBuffers(
|
static void VULKAN_BindVertexBuffers(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_CommandBuffer *commandBuffer,
|
Refresh_CommandBuffer *commandBuffer,
|
||||||
|
@ -8058,16 +7962,14 @@ static void VULKAN_BindVertexBuffers(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
|
VulkanBuffer *currentVulkanBuffer;
|
||||||
VkBuffer *buffers = SDL_stack_alloc(VkBuffer, bindingCount);
|
VkBuffer *buffers = SDL_stack_alloc(VkBuffer, bindingCount);
|
||||||
VulkanBufferContainer* currentBufferContainer;
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < bindingCount; i += 1)
|
for (i = 0; i < bindingCount; i += 1)
|
||||||
{
|
{
|
||||||
currentBufferContainer = (VulkanBufferContainer*) pBuffers[i];
|
currentVulkanBuffer = (VulkanBuffer*) pBuffers[i];
|
||||||
buffers[i] = currentBufferContainer->vulkanBuffer->buffer;
|
buffers[i] = currentVulkanBuffer->buffer;
|
||||||
VULKAN_INTERNAL_MarkAsBound(renderer, currentBufferContainer->vulkanBuffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->vkCmdBindVertexBuffers(
|
renderer->vkCmdBindVertexBuffers(
|
||||||
|
@ -8090,13 +7992,11 @@ static void VULKAN_BindIndexBuffer(
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanBufferContainer* vulkanBufferContainer = (VulkanBufferContainer*) buffer;
|
VulkanBuffer* vulkanBuffer = (VulkanBuffer*) buffer;
|
||||||
|
|
||||||
VULKAN_INTERNAL_MarkAsBound(renderer, vulkanBufferContainer->vulkanBuffer);
|
|
||||||
|
|
||||||
renderer->vkCmdBindIndexBuffer(
|
renderer->vkCmdBindIndexBuffer(
|
||||||
vulkanCommandBuffer->commandBuffer,
|
vulkanCommandBuffer->commandBuffer,
|
||||||
vulkanBufferContainer->vulkanBuffer->buffer,
|
vulkanBuffer->buffer,
|
||||||
offset,
|
offset,
|
||||||
RefreshToVK_IndexType[indexElementSize]
|
RefreshToVK_IndexType[indexElementSize]
|
||||||
);
|
);
|
||||||
|
@ -8156,7 +8056,7 @@ static void VULKAN_BindComputeBuffers(
|
||||||
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer;
|
||||||
VulkanComputePipeline *computePipeline = vulkanCommandBuffer->currentComputePipeline;
|
VulkanComputePipeline *computePipeline = vulkanCommandBuffer->currentComputePipeline;
|
||||||
|
|
||||||
VulkanBufferContainer *currentBufferContainer;
|
VulkanBuffer *currentVulkanBuffer;
|
||||||
BufferDescriptorSetData bufferDescriptorSetData;
|
BufferDescriptorSetData bufferDescriptorSetData;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
|
@ -8167,14 +8067,13 @@ static void VULKAN_BindComputeBuffers(
|
||||||
|
|
||||||
for (i = 0; i < computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount; i += 1)
|
for (i = 0; i < computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount; i += 1)
|
||||||
{
|
{
|
||||||
currentBufferContainer = (VulkanBufferContainer*) pBuffers[i];
|
currentVulkanBuffer = (VulkanBuffer*) pBuffers[i];
|
||||||
|
|
||||||
bufferDescriptorSetData.descriptorBufferInfo[i].buffer = currentBufferContainer->vulkanBuffer->buffer;
|
bufferDescriptorSetData.descriptorBufferInfo[i].buffer = currentVulkanBuffer->buffer;
|
||||||
bufferDescriptorSetData.descriptorBufferInfo[i].offset = 0;
|
bufferDescriptorSetData.descriptorBufferInfo[i].offset = 0;
|
||||||
bufferDescriptorSetData.descriptorBufferInfo[i].range = currentBufferContainer->vulkanBuffer->size;
|
bufferDescriptorSetData.descriptorBufferInfo[i].range = currentVulkanBuffer->size;
|
||||||
|
|
||||||
VULKAN_INTERNAL_MarkAsBound(renderer, currentBufferContainer->vulkanBuffer);
|
vulkanCommandBuffer->boundComputeBuffers[i] = currentVulkanBuffer;
|
||||||
vulkanCommandBuffer->boundComputeBuffers[i] = currentBufferContainer->vulkanBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vulkanCommandBuffer->boundComputeBufferCount = computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount;
|
vulkanCommandBuffer->boundComputeBufferCount = computePipeline->pipelineLayout->bufferDescriptorSetCache->bindingCount;
|
||||||
|
@ -8395,6 +8294,7 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer(
|
||||||
commandBuffer->fixed = fixed;
|
commandBuffer->fixed = fixed;
|
||||||
commandBuffer->submitted = 0;
|
commandBuffer->submitted = 0;
|
||||||
commandBuffer->present = 0;
|
commandBuffer->present = 0;
|
||||||
|
commandBuffer->renderPassInProgress = 0;
|
||||||
|
|
||||||
VULKAN_INTERNAL_BeginCommandBuffer(renderer, commandBuffer);
|
VULKAN_INTERNAL_BeginCommandBuffer(renderer, commandBuffer);
|
||||||
|
|
||||||
|
@ -9557,7 +9457,6 @@ static Refresh_Device* VULKAN_INTERNAL_CreateDevice(
|
||||||
|
|
||||||
renderer->allocatorLock = SDL_CreateMutex();
|
renderer->allocatorLock = SDL_CreateMutex();
|
||||||
renderer->disposeLock = SDL_CreateMutex();
|
renderer->disposeLock = SDL_CreateMutex();
|
||||||
renderer->boundBufferLock = SDL_CreateMutex();
|
|
||||||
renderer->submitLock = SDL_CreateMutex();
|
renderer->submitLock = SDL_CreateMutex();
|
||||||
|
|
||||||
/* Create fence lists */
|
/* Create fence lists */
|
||||||
|
@ -9840,20 +9739,6 @@ static Refresh_Device* VULKAN_INTERNAL_CreateDevice(
|
||||||
UNIFORM_BUFFER_COMPUTE
|
UNIFORM_BUFFER_COMPUTE
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Initialize buffer space */
|
|
||||||
|
|
||||||
renderer->buffersInUseCapacity = 32;
|
|
||||||
renderer->buffersInUseCount = 0;
|
|
||||||
renderer->buffersInUse = (VulkanBuffer**)SDL_malloc(
|
|
||||||
sizeof(VulkanBuffer*) * renderer->buffersInUseCapacity
|
|
||||||
);
|
|
||||||
|
|
||||||
renderer->submittedBufferCapacity = 32;
|
|
||||||
renderer->submittedBufferCount = 0;
|
|
||||||
renderer->submittedBuffers = (VulkanBuffer**)SDL_malloc(
|
|
||||||
sizeof(VulkanBuffer*) * renderer->submittedBufferCapacity
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Initialize caches */
|
/* Initialize caches */
|
||||||
|
|
||||||
for (i = 0; i < NUM_COMMAND_POOL_BUCKETS; i += 1)
|
for (i = 0; i < NUM_COMMAND_POOL_BUCKETS; i += 1)
|
||||||
|
|
|
@ -86,6 +86,7 @@ VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdBlitImage, (VkCommandBuffer commandBuf
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearAttachments, (VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment *pAttachments, uint32_t rectCount, const VkClearRect *pRects))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearAttachments, (VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment *pAttachments, uint32_t rectCount, const VkClearRect *pRects))
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearColorImage, (VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount, const VkImageSubresourceRange *pRanges))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearColorImage, (VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount, const VkImageSubresourceRange *pRanges))
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearDepthStencilImage, (VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange *pRanges))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearDepthStencilImage, (VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange *pRanges))
|
||||||
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBuffer, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions))
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions))
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions))
|
||||||
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ))
|
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ))
|
||||||
|
|
Loading…
Reference in New Issue