forked from MoonsideGames/Refresh
shader uniforms
parent
d2d2dee5f4
commit
ae44d3ef23
|
@ -491,6 +491,7 @@ typedef struct REFRESH_ShaderStageState
|
||||||
{
|
{
|
||||||
REFRESH_ShaderModule *shaderModule;
|
REFRESH_ShaderModule *shaderModule;
|
||||||
const char* entryPointName;
|
const char* entryPointName;
|
||||||
|
uint64_t uniformBufferSize;
|
||||||
} REFRESH_ShaderStageState;
|
} REFRESH_ShaderStageState;
|
||||||
|
|
||||||
typedef struct REFRESH_TopologyState
|
typedef struct REFRESH_TopologyState
|
||||||
|
@ -964,32 +965,32 @@ REFRESHAPI void REFRESH_SetIndexBufferData(
|
||||||
|
|
||||||
/* Pushes vertex shader params for subsequent draw calls.
|
/* Pushes vertex shader params for subsequent draw calls.
|
||||||
*
|
*
|
||||||
* pipeline: The graphics pipeline to push shader data to.
|
* NOTE:
|
||||||
|
* A pipeline must be bound.
|
||||||
|
* Will use the block size of the currently bound vertex shader.
|
||||||
|
*
|
||||||
* data: The client data to write into the buffer.
|
* data: The client data to write into the buffer.
|
||||||
* elementCount: The number of elements from the client buffer to write.
|
* elementCount: The number of elements from the client buffer to write.
|
||||||
* elementSizeInBytes: The size of each element in the client buffer.
|
|
||||||
*/
|
*/
|
||||||
REFRESHAPI void REFRESH_PushVertexShaderParams(
|
REFRESHAPI void REFRESH_PushVertexShaderParams(
|
||||||
REFRESH_Device *device,
|
REFRESH_Device *device,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Pushes fragment shader params for subsequent draw calls.
|
/* Pushes fragment shader params for subsequent draw calls.
|
||||||
*
|
*
|
||||||
* pipeline: The graphics pipeline to push shader data to.
|
* NOTE:
|
||||||
|
* A pipeline must be bound.
|
||||||
|
* Will use the block size of the currently bound fragment shader.
|
||||||
|
*
|
||||||
* data: The client data to write into the buffer.
|
* data: The client data to write into the buffer.
|
||||||
* elementCount: The number of elements from the client buffer to write.
|
* elementCount: The number of elements from the client buffer to write.
|
||||||
* elementSizeInBytes: The size of each element in the client buffer.
|
|
||||||
*/
|
*/
|
||||||
REFRESHAPI void REFRESH_PushFragmentShaderParams(
|
REFRESHAPI void REFRESH_PushFragmentShaderParams(
|
||||||
REFRESH_Device *device,
|
REFRESH_Device *device,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Sets textures/samplers for use with the currently bound vertex shader.
|
/* Sets textures/samplers for use with the currently bound vertex shader.
|
||||||
|
|
|
@ -528,35 +528,27 @@ void REFRESH_SetIndexBufferData(
|
||||||
|
|
||||||
void REFRESH_PushVertexShaderParams(
|
void REFRESH_PushVertexShaderParams(
|
||||||
REFRESH_Device *device,
|
REFRESH_Device *device,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
) {
|
) {
|
||||||
NULL_RETURN(device);
|
NULL_RETURN(device);
|
||||||
device->PushVertexShaderParams(
|
device->PushVertexShaderParams(
|
||||||
device->driverData,
|
device->driverData,
|
||||||
pipeline,
|
|
||||||
data,
|
data,
|
||||||
elementCount,
|
elementCount
|
||||||
elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void REFRESH_PushFragmentShaderParams(
|
void REFRESH_PushFragmentShaderParams(
|
||||||
REFRESH_Device *device,
|
REFRESH_Device *device,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
) {
|
) {
|
||||||
NULL_RETURN(device);
|
NULL_RETURN(device);
|
||||||
device->PushFragmentShaderParams(
|
device->PushFragmentShaderParams(
|
||||||
device->driverData,
|
device->driverData,
|
||||||
pipeline,
|
|
||||||
data,
|
data,
|
||||||
elementCount,
|
elementCount
|
||||||
elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -356,18 +356,14 @@ struct REFRESH_Device
|
||||||
|
|
||||||
void(*PushVertexShaderParams)(
|
void(*PushVertexShaderParams)(
|
||||||
REFRESH_Renderer *driverData,
|
REFRESH_Renderer *driverData,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
|
|
||||||
void(*PushFragmentShaderParams)(
|
void(*PushFragmentShaderParams)(
|
||||||
REFRESH_Renderer *driverData,
|
REFRESH_Renderer *driverData,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
);
|
);
|
||||||
|
|
||||||
void(*SetVertexSamplers)(
|
void(*SetVertexSamplers)(
|
||||||
|
|
|
@ -75,6 +75,7 @@ static uint32_t deviceExtensionCount = SDL_arraysize(deviceExtensionNames);
|
||||||
#define UBO_BUFFER_SIZE 8000000 /* 8MB */
|
#define UBO_BUFFER_SIZE 8000000 /* 8MB */
|
||||||
#define UBO_ACTUAL_SIZE (UBO_BUFFER_SIZE * 2)
|
#define UBO_ACTUAL_SIZE (UBO_BUFFER_SIZE * 2)
|
||||||
#define SAMPLER_POOL_SIZE 100
|
#define SAMPLER_POOL_SIZE 100
|
||||||
|
#define UBO_POOL_SIZE 1000
|
||||||
#define SUB_BUFFER_COUNT 2
|
#define SUB_BUFFER_COUNT 2
|
||||||
|
|
||||||
#define IDENTITY_SWIZZLE \
|
#define IDENTITY_SWIZZLE \
|
||||||
|
@ -641,6 +642,11 @@ typedef struct VulkanGraphicsPipeline
|
||||||
uint32_t fragmentSamplerBindingCount;
|
uint32_t fragmentSamplerBindingCount;
|
||||||
VkDescriptorSet vertexSamplerDescriptorSet; /* updated by SetVertexSamplers */
|
VkDescriptorSet vertexSamplerDescriptorSet; /* updated by SetVertexSamplers */
|
||||||
VkDescriptorSet fragmentSamplerDescriptorSet; /* updated by SetFragmentSamplers */
|
VkDescriptorSet fragmentSamplerDescriptorSet; /* updated by SetFragmentSamplers */
|
||||||
|
|
||||||
|
VkDescriptorSet vertexUBODescriptorSet; /* permanently set in Create function */
|
||||||
|
VkDescriptorSet fragmentUBODescriptorSet; /* permanently set in Create function */
|
||||||
|
VkDeviceSize vertexUBOBlockSize; /* permanently set in Create function */
|
||||||
|
VkDeviceSize fragmentUBOBlockSize; /* permantenly set in Create function */
|
||||||
} VulkanGraphicsPipeline;
|
} VulkanGraphicsPipeline;
|
||||||
|
|
||||||
typedef struct VulkanTexture
|
typedef struct VulkanTexture
|
||||||
|
@ -765,8 +771,6 @@ typedef struct VulkanRenderer
|
||||||
|
|
||||||
VkDescriptorSetLayout vertexParamLayout;
|
VkDescriptorSetLayout vertexParamLayout;
|
||||||
VkDescriptorSetLayout fragmentParamLayout;
|
VkDescriptorSetLayout fragmentParamLayout;
|
||||||
VkDescriptorSet vertexUBODescriptorSet;
|
|
||||||
VkDescriptorSet fragmentUBODescriptorSet;
|
|
||||||
|
|
||||||
VulkanBuffer *textureStagingBuffer;
|
VulkanBuffer *textureStagingBuffer;
|
||||||
|
|
||||||
|
@ -783,12 +787,10 @@ typedef struct VulkanRenderer
|
||||||
uint32_t minUBOAlignment;
|
uint32_t minUBOAlignment;
|
||||||
|
|
||||||
uint32_t vertexUBOOffset;
|
uint32_t vertexUBOOffset;
|
||||||
uint32_t vertexUBOBlockSize;
|
VkDeviceSize vertexUBOBlockIncrement;
|
||||||
uint32_t vertexUBOBlockIncrement;
|
|
||||||
|
|
||||||
uint32_t fragmentUBOOffset;
|
uint32_t fragmentUBOOffset;
|
||||||
uint32_t fragmentUBOBlockSize;
|
VkDeviceSize fragmentUBOBlockIncrement;
|
||||||
uint32_t fragmentUBOBlockIncrement;
|
|
||||||
|
|
||||||
uint32_t frameIndex;
|
uint32_t frameIndex;
|
||||||
|
|
||||||
|
@ -888,13 +890,6 @@ static inline VkDeviceSize VULKAN_INTERNAL_NextHighestAlignment(
|
||||||
return align * ((n + align - 1) / align);
|
return align * ((n + align - 1) / align);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t VULKAN_INTERNAL_NextHighestAlignment32(
|
|
||||||
uint32_t n,
|
|
||||||
uint32_t align
|
|
||||||
) {
|
|
||||||
return align * ((n + align - 1) / align);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VulkanMemoryFreeRegion* VULKAN_INTERNAL_NewMemoryFreeRegion(
|
static VulkanMemoryFreeRegion* VULKAN_INTERNAL_NewMemoryFreeRegion(
|
||||||
VulkanMemoryAllocation *allocation,
|
VulkanMemoryAllocation *allocation,
|
||||||
VkDeviceSize offset,
|
VkDeviceSize offset,
|
||||||
|
@ -2272,8 +2267,8 @@ static void VULKAN_DrawInstancedPrimitives(
|
||||||
|
|
||||||
descriptorSets[0] = renderer->currentGraphicsPipeline->vertexSamplerDescriptorSet;
|
descriptorSets[0] = renderer->currentGraphicsPipeline->vertexSamplerDescriptorSet;
|
||||||
descriptorSets[1] = renderer->currentGraphicsPipeline->fragmentSamplerDescriptorSet;
|
descriptorSets[1] = renderer->currentGraphicsPipeline->fragmentSamplerDescriptorSet;
|
||||||
descriptorSets[2] = renderer->vertexUBODescriptorSet;
|
descriptorSets[2] = renderer->currentGraphicsPipeline->vertexUBODescriptorSet;
|
||||||
descriptorSets[3] = renderer->fragmentUBODescriptorSet;
|
descriptorSets[3] = renderer->currentGraphicsPipeline->fragmentUBODescriptorSet;
|
||||||
|
|
||||||
dynamicOffsets[0] = renderer->vertexUBOOffset;
|
dynamicOffsets[0] = renderer->vertexUBOOffset;
|
||||||
dynamicOffsets[1] = renderer->fragmentUBOOffset;
|
dynamicOffsets[1] = renderer->fragmentUBOOffset;
|
||||||
|
@ -2336,8 +2331,8 @@ static void VULKAN_DrawPrimitives(
|
||||||
|
|
||||||
descriptorSets[0] = renderer->currentGraphicsPipeline->vertexSamplerDescriptorSet;
|
descriptorSets[0] = renderer->currentGraphicsPipeline->vertexSamplerDescriptorSet;
|
||||||
descriptorSets[1] = renderer->currentGraphicsPipeline->fragmentSamplerDescriptorSet;
|
descriptorSets[1] = renderer->currentGraphicsPipeline->fragmentSamplerDescriptorSet;
|
||||||
descriptorSets[2] = renderer->vertexUBODescriptorSet;
|
descriptorSets[2] = renderer->currentGraphicsPipeline->vertexUBODescriptorSet;
|
||||||
descriptorSets[3] = renderer->fragmentUBODescriptorSet;
|
descriptorSets[3] = renderer->currentGraphicsPipeline->fragmentUBODescriptorSet;
|
||||||
|
|
||||||
dynamicOffsets[0] = renderer->vertexUBOOffset;
|
dynamicOffsets[0] = renderer->vertexUBOOffset;
|
||||||
dynamicOffsets[1] = renderer->fragmentUBOOffset;
|
dynamicOffsets[1] = renderer->fragmentUBOOffset;
|
||||||
|
@ -2659,6 +2654,13 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
pipelineCreateInfo->pipelineLayoutCreateInfo.fragmentSamplerBindingCount
|
pipelineCreateInfo->pipelineLayoutCreateInfo.fragmentSamplerBindingCount
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VkDescriptorSetAllocateInfo vertexUBODescriptorAllocateInfo;
|
||||||
|
VkDescriptorSetAllocateInfo fragmentUBODescriptorAllocateInfo;
|
||||||
|
|
||||||
|
VkWriteDescriptorSet uboWriteDescriptorSets[2];
|
||||||
|
VkDescriptorBufferInfo vertexUniformBufferInfo;
|
||||||
|
VkDescriptorBufferInfo fragmentUniformBufferInfo;
|
||||||
|
|
||||||
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
VulkanRenderer *renderer = (VulkanRenderer*) driverData;
|
||||||
|
|
||||||
/* Shader stages */
|
/* Shader stages */
|
||||||
|
@ -2671,6 +2673,12 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
shaderStageCreateInfos[0].pName = pipelineCreateInfo->vertexShaderState.entryPointName;
|
shaderStageCreateInfos[0].pName = pipelineCreateInfo->vertexShaderState.entryPointName;
|
||||||
shaderStageCreateInfos[0].pSpecializationInfo = NULL;
|
shaderStageCreateInfos[0].pSpecializationInfo = NULL;
|
||||||
|
|
||||||
|
graphicsPipeline->vertexUBOBlockSize =
|
||||||
|
VULKAN_INTERNAL_NextHighestAlignment(
|
||||||
|
pipelineCreateInfo->vertexShaderState.uniformBufferSize,
|
||||||
|
renderer->minUBOAlignment
|
||||||
|
);
|
||||||
|
|
||||||
shaderStageCreateInfos[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
shaderStageCreateInfos[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
shaderStageCreateInfos[1].pNext = NULL;
|
shaderStageCreateInfos[1].pNext = NULL;
|
||||||
shaderStageCreateInfos[1].flags = 0;
|
shaderStageCreateInfos[1].flags = 0;
|
||||||
|
@ -2679,6 +2687,12 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
shaderStageCreateInfos[1].pName = pipelineCreateInfo->fragmentShaderState.entryPointName;
|
shaderStageCreateInfos[1].pName = pipelineCreateInfo->fragmentShaderState.entryPointName;
|
||||||
shaderStageCreateInfos[1].pSpecializationInfo = NULL;
|
shaderStageCreateInfos[1].pSpecializationInfo = NULL;
|
||||||
|
|
||||||
|
graphicsPipeline->fragmentUBOBlockSize =
|
||||||
|
VULKAN_INTERNAL_NextHighestAlignment(
|
||||||
|
pipelineCreateInfo->fragmentShaderState.uniformBufferSize,
|
||||||
|
renderer->minUBOAlignment
|
||||||
|
);
|
||||||
|
|
||||||
/* Vertex input */
|
/* Vertex input */
|
||||||
|
|
||||||
for (i = 0; i < pipelineCreateInfo->vertexInputState.vertexBindingCount; i += 1)
|
for (i = 0; i < pipelineCreateInfo->vertexInputState.vertexBindingCount; i += 1)
|
||||||
|
@ -2902,6 +2916,10 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
/* Pipeline Layout */
|
/* Pipeline Layout */
|
||||||
/* TODO: should we hash these? */
|
/* TODO: should we hash these? */
|
||||||
|
|
||||||
|
setLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||||
|
setLayoutCreateInfo.pNext = NULL;
|
||||||
|
setLayoutCreateInfo.flags = 0;
|
||||||
|
|
||||||
/* Vertex sampler layout */
|
/* Vertex sampler layout */
|
||||||
if (pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount == 0)
|
if (pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount == 0)
|
||||||
{
|
{
|
||||||
|
@ -2919,9 +2937,6 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
vertexSamplerLayoutBindings[i].pImmutableSamplers = NULL;
|
vertexSamplerLayoutBindings[i].pImmutableSamplers = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
setLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
||||||
setLayoutCreateInfo.pNext = NULL;
|
|
||||||
setLayoutCreateInfo.flags = 0;
|
|
||||||
setLayoutCreateInfo.bindingCount = pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount;
|
setLayoutCreateInfo.bindingCount = pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount;
|
||||||
setLayoutCreateInfo.pBindings = vertexSamplerLayoutBindings;
|
setLayoutCreateInfo.pBindings = vertexSamplerLayoutBindings;
|
||||||
|
|
||||||
|
@ -3071,6 +3086,7 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
SDL_stack_free(vertexSamplerLayoutBindings);
|
SDL_stack_free(vertexSamplerLayoutBindings);
|
||||||
SDL_stack_free(fragmentSamplerLayoutBindings);
|
SDL_stack_free(fragmentSamplerLayoutBindings);
|
||||||
|
|
||||||
|
/* Create sampler descriptor pool */
|
||||||
if (!VULKAN_INTERNAL_CreateSamplerDescriptorPool(
|
if (!VULKAN_INTERNAL_CreateSamplerDescriptorPool(
|
||||||
renderer,
|
renderer,
|
||||||
&pipelineCreateInfo->pipelineLayoutCreateInfo,
|
&pipelineCreateInfo->pipelineLayoutCreateInfo,
|
||||||
|
@ -3087,6 +3103,70 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
||||||
renderer->descriptorPools[renderer->descriptorPoolCount + 1] =
|
renderer->descriptorPools[renderer->descriptorPoolCount + 1] =
|
||||||
graphicsPipeline->descriptorPool;
|
graphicsPipeline->descriptorPool;
|
||||||
|
|
||||||
|
/* Allocate uniform buffer descriptors */
|
||||||
|
|
||||||
|
vertexUBODescriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
vertexUBODescriptorAllocateInfo.pNext = NULL;
|
||||||
|
vertexUBODescriptorAllocateInfo.descriptorPool = renderer->defaultDescriptorPool;
|
||||||
|
vertexUBODescriptorAllocateInfo.descriptorSetCount = 1;
|
||||||
|
vertexUBODescriptorAllocateInfo.pSetLayouts = &renderer->vertexParamLayout;
|
||||||
|
|
||||||
|
renderer->vkAllocateDescriptorSets(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
&vertexUBODescriptorAllocateInfo,
|
||||||
|
&graphicsPipeline->vertexUBODescriptorSet
|
||||||
|
);
|
||||||
|
|
||||||
|
fragmentUBODescriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
fragmentUBODescriptorAllocateInfo.pNext = NULL;
|
||||||
|
fragmentUBODescriptorAllocateInfo.descriptorPool = renderer->defaultDescriptorPool;
|
||||||
|
fragmentUBODescriptorAllocateInfo.descriptorSetCount = 1;
|
||||||
|
fragmentUBODescriptorAllocateInfo.pSetLayouts = &renderer->fragmentParamLayout;
|
||||||
|
|
||||||
|
renderer->vkAllocateDescriptorSets(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
&fragmentUBODescriptorAllocateInfo,
|
||||||
|
&graphicsPipeline->fragmentUBODescriptorSet
|
||||||
|
);
|
||||||
|
|
||||||
|
vertexUniformBufferInfo.buffer = renderer->vertexUBO->subBuffers[0]->buffer;
|
||||||
|
vertexUniformBufferInfo.offset = 0;
|
||||||
|
vertexUniformBufferInfo.range = graphicsPipeline->vertexUBOBlockSize;
|
||||||
|
|
||||||
|
fragmentUniformBufferInfo.buffer = renderer->fragmentUBO->subBuffers[0]->buffer;
|
||||||
|
fragmentUniformBufferInfo.offset = 0;
|
||||||
|
fragmentUniformBufferInfo.range = graphicsPipeline->fragmentUBOBlockSize;
|
||||||
|
|
||||||
|
uboWriteDescriptorSets[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
uboWriteDescriptorSets[0].pNext = NULL;
|
||||||
|
uboWriteDescriptorSets[0].descriptorCount = 1;
|
||||||
|
uboWriteDescriptorSets[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
||||||
|
uboWriteDescriptorSets[0].dstArrayElement = 0;
|
||||||
|
uboWriteDescriptorSets[0].dstBinding = 0;
|
||||||
|
uboWriteDescriptorSets[0].dstSet = graphicsPipeline->vertexUBODescriptorSet;
|
||||||
|
uboWriteDescriptorSets[0].pBufferInfo = &vertexUniformBufferInfo;
|
||||||
|
uboWriteDescriptorSets[0].pImageInfo = NULL;
|
||||||
|
uboWriteDescriptorSets[0].pTexelBufferView = NULL;
|
||||||
|
|
||||||
|
uboWriteDescriptorSets[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
uboWriteDescriptorSets[1].pNext = NULL;
|
||||||
|
uboWriteDescriptorSets[1].descriptorCount = 1;
|
||||||
|
uboWriteDescriptorSets[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
||||||
|
uboWriteDescriptorSets[1].dstArrayElement = 0;
|
||||||
|
uboWriteDescriptorSets[1].dstBinding = 0;
|
||||||
|
uboWriteDescriptorSets[1].dstSet = graphicsPipeline->fragmentUBODescriptorSet;
|
||||||
|
uboWriteDescriptorSets[1].pBufferInfo = &fragmentUniformBufferInfo;
|
||||||
|
uboWriteDescriptorSets[1].pImageInfo = NULL;
|
||||||
|
uboWriteDescriptorSets[1].pTexelBufferView = NULL;
|
||||||
|
|
||||||
|
renderer->vkUpdateDescriptorSets(
|
||||||
|
renderer->logicalDevice,
|
||||||
|
2,
|
||||||
|
uboWriteDescriptorSets,
|
||||||
|
0,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
return (REFRESH_GraphicsPipeline*) graphicsPipeline;
|
return (REFRESH_GraphicsPipeline*) graphicsPipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4355,23 +4435,19 @@ static void VULKAN_SetIndexBufferData(
|
||||||
|
|
||||||
static void VULKAN_PushVertexShaderParams(
|
static void VULKAN_PushVertexShaderParams(
|
||||||
REFRESH_Renderer *driverData,
|
REFRESH_Renderer *driverData,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
|
||||||
VulkanGraphicsPipeline* vulkanPipeline = (VulkanGraphicsPipeline*)pipeline;
|
|
||||||
|
|
||||||
renderer->vertexUBOOffset += renderer->vertexUBOBlockIncrement;
|
renderer->vertexUBOOffset += renderer->vertexUBOBlockIncrement;
|
||||||
renderer->vertexUBOBlockSize = VULKAN_INTERNAL_NextHighestAlignment32(
|
renderer->vertexUBOBlockIncrement = renderer->currentGraphicsPipeline->vertexUBOBlockSize;
|
||||||
renderer->vertexUBOOffset,
|
|
||||||
renderer->minUBOAlignment
|
|
||||||
);
|
|
||||||
renderer->vertexUBOBlockIncrement = renderer->vertexUBOBlockSize;
|
|
||||||
|
|
||||||
if (renderer->vertexUBOOffset + renderer->vertexUBOBlockSize >= UBO_BUFFER_SIZE * renderer->frameIndex)
|
if (
|
||||||
{
|
renderer->vertexUBOOffset +
|
||||||
|
renderer->currentGraphicsPipeline->vertexUBOBlockSize >=
|
||||||
|
UBO_BUFFER_SIZE * renderer->frameIndex
|
||||||
|
) {
|
||||||
REFRESH_LogError("Vertex UBO overflow!");
|
REFRESH_LogError("Vertex UBO overflow!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4381,29 +4457,25 @@ static void VULKAN_PushVertexShaderParams(
|
||||||
(REFRESH_Buffer*) renderer->vertexUBO,
|
(REFRESH_Buffer*) renderer->vertexUBO,
|
||||||
renderer->vertexUBOOffset,
|
renderer->vertexUBOOffset,
|
||||||
data,
|
data,
|
||||||
elementCount * elementSizeInBytes
|
elementCount * renderer->currentGraphicsPipeline->fragmentUBOBlockSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_PushFragmentShaderParams(
|
static void VULKAN_PushFragmentShaderParams(
|
||||||
REFRESH_Renderer *driverData,
|
REFRESH_Renderer *driverData,
|
||||||
REFRESH_GraphicsPipeline *pipeline,
|
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t elementCount,
|
uint32_t elementCount
|
||||||
uint32_t elementSizeInBytes
|
|
||||||
) {
|
) {
|
||||||
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
|
VulkanRenderer* renderer = (VulkanRenderer*)driverData;
|
||||||
VulkanGraphicsPipeline* vulkanPipeline = (VulkanGraphicsPipeline*)pipeline;
|
|
||||||
|
|
||||||
renderer->fragmentUBOOffset += renderer->fragmentUBOBlockIncrement;
|
renderer->fragmentUBOOffset += renderer->fragmentUBOBlockIncrement;
|
||||||
renderer->fragmentUBOBlockSize = VULKAN_INTERNAL_NextHighestAlignment32(
|
renderer->fragmentUBOBlockIncrement = renderer->currentGraphicsPipeline->fragmentUBOBlockSize;
|
||||||
renderer->fragmentUBOOffset,
|
|
||||||
renderer->minUBOAlignment
|
|
||||||
);
|
|
||||||
renderer->fragmentUBOBlockIncrement = renderer->fragmentUBOBlockSize;
|
|
||||||
|
|
||||||
if (renderer->fragmentUBOOffset + renderer->fragmentUBOBlockSize >= UBO_BUFFER_SIZE * renderer->frameIndex)
|
if (
|
||||||
{
|
renderer->fragmentUBOOffset +
|
||||||
|
renderer->currentGraphicsPipeline->fragmentUBOBlockSize >=
|
||||||
|
UBO_BUFFER_SIZE * (renderer->frameIndex + 1)
|
||||||
|
) {
|
||||||
REFRESH_LogError("Fragment UBO overflow!");
|
REFRESH_LogError("Fragment UBO overflow!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4413,7 +4485,7 @@ static void VULKAN_PushFragmentShaderParams(
|
||||||
(REFRESH_Buffer*) renderer->fragmentUBO,
|
(REFRESH_Buffer*) renderer->fragmentUBO,
|
||||||
renderer->fragmentUBOOffset,
|
renderer->fragmentUBOOffset,
|
||||||
data,
|
data,
|
||||||
elementCount * elementSizeInBytes
|
elementCount * renderer->currentGraphicsPipeline->fragmentUBOBlockSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5837,8 +5909,6 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
||||||
VkDescriptorPoolSize poolSizes[2];
|
VkDescriptorPoolSize poolSizes[2];
|
||||||
VkDescriptorSetAllocateInfo emptyVertexSamplerDescriptorAllocateInfo;
|
VkDescriptorSetAllocateInfo emptyVertexSamplerDescriptorAllocateInfo;
|
||||||
VkDescriptorSetAllocateInfo emptyFragmentSamplerDescriptorAllocateInfo;
|
VkDescriptorSetAllocateInfo emptyFragmentSamplerDescriptorAllocateInfo;
|
||||||
VkDescriptorSetAllocateInfo vertexUBODescriptorAllocateInfo;
|
|
||||||
VkDescriptorSetAllocateInfo fragmentUBODescriptorAllocateInfo;
|
|
||||||
|
|
||||||
result = (REFRESH_Device*) SDL_malloc(sizeof(REFRESH_Device));
|
result = (REFRESH_Device*) SDL_malloc(sizeof(REFRESH_Device));
|
||||||
ASSIGN_DRIVER(VULKAN)
|
ASSIGN_DRIVER(VULKAN)
|
||||||
|
@ -6099,6 +6169,42 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
||||||
renderer->memoryAllocator->subAllocators[i].sortedFreeRegionCapacity = 4;
|
renderer->memoryAllocator->subAllocators[i].sortedFreeRegionCapacity = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* UBO Data */
|
||||||
|
|
||||||
|
renderer->vertexUBO = (VulkanBuffer*) SDL_malloc(sizeof(VulkanBuffer));
|
||||||
|
|
||||||
|
if (!VULKAN_INTERNAL_CreateBuffer(
|
||||||
|
renderer,
|
||||||
|
UBO_ACTUAL_SIZE,
|
||||||
|
RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER,
|
||||||
|
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||||
|
SUB_BUFFER_COUNT,
|
||||||
|
renderer->vertexUBO
|
||||||
|
)) {
|
||||||
|
REFRESH_LogError("Failed to create vertex UBO!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->fragmentUBO = (VulkanBuffer*) SDL_malloc(sizeof(VulkanBuffer));
|
||||||
|
|
||||||
|
if (!VULKAN_INTERNAL_CreateBuffer(
|
||||||
|
renderer,
|
||||||
|
UBO_ACTUAL_SIZE,
|
||||||
|
RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER,
|
||||||
|
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||||
|
SUB_BUFFER_COUNT,
|
||||||
|
renderer->fragmentUBO
|
||||||
|
)) {
|
||||||
|
REFRESH_LogError("Failed to create fragment UBO!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer->minUBOAlignment = renderer->physicalDeviceProperties.properties.limits.minUniformBufferOffsetAlignment;
|
||||||
|
renderer->vertexUBOOffset = 0;
|
||||||
|
renderer->vertexUBOBlockIncrement = 0;
|
||||||
|
renderer->fragmentUBOOffset = 0;
|
||||||
|
renderer->fragmentUBOBlockIncrement = 0;
|
||||||
|
|
||||||
/* Set up UBO layouts */
|
/* Set up UBO layouts */
|
||||||
|
|
||||||
emptyVertexSamplerLayoutBinding.binding = 0;
|
emptyVertexSamplerLayoutBinding.binding = 0;
|
||||||
|
@ -6188,16 +6294,18 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
||||||
|
|
||||||
/* Default Descriptors */
|
/* Default Descriptors */
|
||||||
|
|
||||||
|
/* default empty sampler descriptor sets */
|
||||||
poolSizes[0].descriptorCount = 2;
|
poolSizes[0].descriptorCount = 2;
|
||||||
poolSizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
poolSizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||||
|
|
||||||
poolSizes[1].descriptorCount = 2;
|
/* UBO descriptor sets */
|
||||||
|
poolSizes[1].descriptorCount = UBO_POOL_SIZE;
|
||||||
poolSizes[1].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
poolSizes[1].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
||||||
|
|
||||||
defaultDescriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
defaultDescriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
defaultDescriptorPoolInfo.pNext = NULL;
|
defaultDescriptorPoolInfo.pNext = NULL;
|
||||||
defaultDescriptorPoolInfo.flags = 0;
|
defaultDescriptorPoolInfo.flags = 0;
|
||||||
defaultDescriptorPoolInfo.maxSets = 4;
|
defaultDescriptorPoolInfo.maxSets = UBO_POOL_SIZE + 2;
|
||||||
defaultDescriptorPoolInfo.poolSizeCount = 2;
|
defaultDescriptorPoolInfo.poolSizeCount = 2;
|
||||||
defaultDescriptorPoolInfo.pPoolSizes = poolSizes;
|
defaultDescriptorPoolInfo.pPoolSizes = poolSizes;
|
||||||
|
|
||||||
|
@ -6232,60 +6340,6 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
||||||
&renderer->emptyFragmentSamplerDescriptorSet
|
&renderer->emptyFragmentSamplerDescriptorSet
|
||||||
);
|
);
|
||||||
|
|
||||||
vertexUBODescriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
||||||
vertexUBODescriptorAllocateInfo.pNext = NULL;
|
|
||||||
vertexUBODescriptorAllocateInfo.descriptorPool = renderer->defaultDescriptorPool;
|
|
||||||
vertexUBODescriptorAllocateInfo.descriptorSetCount = 1;
|
|
||||||
vertexUBODescriptorAllocateInfo.pSetLayouts = &renderer->vertexParamLayout;
|
|
||||||
|
|
||||||
renderer->vkAllocateDescriptorSets(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
&vertexUBODescriptorAllocateInfo,
|
|
||||||
&renderer->vertexUBODescriptorSet
|
|
||||||
);
|
|
||||||
|
|
||||||
fragmentUBODescriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
||||||
fragmentUBODescriptorAllocateInfo.pNext = NULL;
|
|
||||||
fragmentUBODescriptorAllocateInfo.descriptorPool = renderer->defaultDescriptorPool;
|
|
||||||
fragmentUBODescriptorAllocateInfo.descriptorSetCount = 1;
|
|
||||||
fragmentUBODescriptorAllocateInfo.pSetLayouts = &renderer->fragmentParamLayout;
|
|
||||||
|
|
||||||
renderer->vkAllocateDescriptorSets(
|
|
||||||
renderer->logicalDevice,
|
|
||||||
&fragmentUBODescriptorAllocateInfo,
|
|
||||||
&renderer->fragmentUBODescriptorSet
|
|
||||||
);
|
|
||||||
|
|
||||||
/* UBO Data */
|
|
||||||
|
|
||||||
renderer->vertexUBO = (VulkanBuffer*) SDL_malloc(sizeof(VulkanBuffer));
|
|
||||||
|
|
||||||
if (!VULKAN_INTERNAL_CreateBuffer(
|
|
||||||
renderer,
|
|
||||||
UBO_ACTUAL_SIZE,
|
|
||||||
RESOURCE_ACCESS_VERTEX_SHADER_READ_UNIFORM_BUFFER,
|
|
||||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
|
||||||
SUB_BUFFER_COUNT,
|
|
||||||
renderer->vertexUBO
|
|
||||||
)) {
|
|
||||||
REFRESH_LogError("Failed to create vertex UBO!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer->fragmentUBO = (VulkanBuffer*) SDL_malloc(sizeof(VulkanBuffer));
|
|
||||||
|
|
||||||
if (!VULKAN_INTERNAL_CreateBuffer(
|
|
||||||
renderer,
|
|
||||||
UBO_ACTUAL_SIZE,
|
|
||||||
RESOURCE_ACCESS_FRAGMENT_SHADER_READ_UNIFORM_BUFFER,
|
|
||||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
|
||||||
SUB_BUFFER_COUNT,
|
|
||||||
renderer->fragmentUBO
|
|
||||||
)) {
|
|
||||||
REFRESH_LogError("Failed to create fragment UBO!");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize buffer space */
|
/* Initialize buffer space */
|
||||||
|
|
||||||
renderer->buffersInUseCapacity = 32;
|
renderer->buffersInUseCapacity = 32;
|
||||||
|
|
Loading…
Reference in New Issue