vertex and index buffers

submit_rewrite
cosmonaut 2020-12-21 12:37:54 -08:00
parent 778a8d89bd
commit feb4b5e16b
4 changed files with 76 additions and 12 deletions

View File

@ -939,7 +939,7 @@ REFRESHAPI void REFRESH_SetTextureDataYUV(
* offsetInBytes: The starting offset of the buffer to write into.
* data: The client data to write into the buffer.
* elementCount: The number of elements from the client buffer to write.
* elementSizeInBytes: The size of each element in the client buffer.
* vertexStride: The size of each element in the client buffer (including padding).
*/
REFRESHAPI void REFRESH_SetVertexBufferData(
REFRESH_Device *device,
@ -947,7 +947,7 @@ REFRESHAPI void REFRESH_SetVertexBufferData(
uint32_t offsetInBytes,
void* data,
uint32_t elementCount,
uint32_t elementSizeInBytes
uint32_t vertexStride
);
/* Sets a region of the index buffer with client data.

View File

@ -508,7 +508,7 @@ void REFRESH_SetVertexBufferData(
uint32_t offsetInBytes,
void* data,
uint32_t elementCount,
uint32_t elementSizeInBytes
uint32_t vertexStride
) {
NULL_RETURN(device);
device->SetVertexBufferData(
@ -517,7 +517,7 @@ void REFRESH_SetVertexBufferData(
offsetInBytes,
data,
elementCount,
elementSizeInBytes
vertexStride
);
}

View File

@ -349,7 +349,7 @@ struct REFRESH_Device
uint32_t offsetInBytes,
void* data,
uint32_t elementCount,
uint32_t elementSizeInBytes
uint32_t vertexStride
);
void(*SetIndexBufferData)(

View File

@ -604,8 +604,8 @@ struct VulkanBuffer /* cast from FNA3D_Buffer */
{
VkDeviceSize size;
VulkanSubBuffer **subBuffers;
int32_t subBufferCount;
int32_t currentSubBufferIndex;
uint32_t subBufferCount;
uint32_t currentSubBufferIndex;
VulkanResourceAccessType resourceAccessType;
VkBufferUsageFlags usage;
uint8_t bound;
@ -1150,7 +1150,7 @@ static uint8_t VULKAN_INTERNAL_FindAvailableMemory(
VkDeviceSize requiredSize, allocationSize;
VkDeviceSize alignedOffset;
uint32_t newRegionSize, newRegionOffset;
VkDeviceSize newRegionSize, newRegionOffset;
uint8_t allocationResult;
if (buffer != VK_NULL_HANDLE && image != VK_NULL_HANDLE)
@ -3682,15 +3682,72 @@ static void VULKAN_SetTextureDataYUV(
));
}
static void VULKAN_INTERNAL_SetBufferData(
REFRESH_Renderer* driverData,
REFRESH_Buffer* buffer,
uint32_t offsetInBytes,
void* data,
uint32_t dataLength
) {
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
VulkanBuffer* vulkanBuffer = (VulkanBuffer*)buffer;
uint8_t* mapPointer;
VkResult vulkanResult;
#define SUBBUF vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]
/* Buffer already bound, time to die */
if (vulkanBuffer->subBuffers[vulkanBuffer->currentSubBufferIndex]->bound)
{
REFRESH_LogError("Buffer already bound. It is an error to write data to a buffer after binding before calling Present.");
return;
}
/* 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!");
return;
}
SDL_memcpy(
mapPointer + offsetInBytes,
data,
dataLength
);
renderer->vkUnmapMemory(
renderer->logicalDevice,
SUBBUF->allocation->memory
);
#undef SUBBUF
}
static void VULKAN_SetVertexBufferData(
REFRESH_Renderer *driverData,
REFRESH_Buffer *buffer,
uint32_t offsetInBytes,
void* data,
uint32_t elementCount,
uint32_t elementSizeInBytes
uint32_t vertexStride
) {
SDL_assert(0);
VULKAN_INTERNAL_SetBufferData(
driverData,
buffer,
offsetInBytes,
data,
elementCount * vertexStride
);
}
static void VULKAN_SetIndexBufferData(
@ -3700,7 +3757,13 @@ static void VULKAN_SetIndexBufferData(
void* data,
uint32_t dataLength
) {
SDL_assert(0);
VULKAN_INTERNAL_SetBufferData(
driverData,
buffer,
offsetInBytes,
data,
dataLength
);
}
static void VULKAN_PushVertexShaderParams(
@ -4049,8 +4112,9 @@ static void VULKAN_BindVertexBuffers(
VkBuffer *buffers = SDL_stack_alloc(VkBuffer, bindingCount);
VulkanBuffer* currentBuffer;
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
uint32_t i;
for (int i = 0; i < bindingCount; i += 1)
for (i = 0; i < bindingCount; i += 1)
{
currentBuffer = (VulkanBuffer*) pBuffers[i];
buffers[i] = currentBuffer->subBuffers[currentBuffer->currentSubBufferIndex]->buffer;