forked from MoonsideGames/Refresh
set sampler functions
parent
d193327760
commit
bedc1f7196
|
@ -976,32 +976,36 @@ REFRESHAPI void REFRESH_PushShaderParamData(
|
|||
|
||||
/* Sets textures/samplers for use with the currently bound vertex shader.
|
||||
*
|
||||
* startIndex: The index at which to begin replacing sampler references.
|
||||
* NOTE:
|
||||
* The length of the passed arrays must be equal to the number
|
||||
* of sampler bindings specified by the shader.
|
||||
*
|
||||
* pipeline: The graphics pipeline to push shader data to.
|
||||
* textures: A pointer to an array of textures.
|
||||
* samplers: A pointer to an array of samplers.
|
||||
* count: The length of the above arrays.
|
||||
*/
|
||||
REFRESHAPI void REFRESH_SetVertexSamplers(
|
||||
REFRESH_Device *device,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
);
|
||||
|
||||
/* Sets textures/samplers for use with the currently bound fragment shader.
|
||||
*
|
||||
* startIndex: The index at which to begin replacing sampler references.
|
||||
* NOTE:
|
||||
* The length of the passed arrays must be equal to the number
|
||||
* of sampler bindings specified by the shader.
|
||||
*
|
||||
* pipeline: The graphics pipeline to push shader data to.
|
||||
* textures: A pointer to an array of textures.
|
||||
* samplers: A pointer to an array of samplers.
|
||||
* count: The length of the above arrays.
|
||||
*/
|
||||
REFRESHAPI void REFRESH_SetFragmentSamplers(
|
||||
REFRESH_Device *device,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
);
|
||||
|
||||
/* Getters */
|
||||
|
|
|
@ -551,35 +551,31 @@ void REFRESH_PushShaderParamData(
|
|||
|
||||
void REFRESH_SetVertexSamplers(
|
||||
REFRESH_Device *device,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
) {
|
||||
NULL_RETURN(device);
|
||||
device->SetVertexSamplers(
|
||||
device->driverData,
|
||||
startIndex,
|
||||
pipeline,
|
||||
pTextures,
|
||||
pSamplers,
|
||||
count
|
||||
pSamplers
|
||||
);
|
||||
}
|
||||
|
||||
void REFRESH_SetFragmentSamplers(
|
||||
REFRESH_Device *device,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
) {
|
||||
NULL_RETURN(device);
|
||||
device->SetFragmentSamplers(
|
||||
device->driverData,
|
||||
startIndex,
|
||||
pipeline,
|
||||
pTextures,
|
||||
pSamplers,
|
||||
count
|
||||
pSamplers
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -365,18 +365,16 @@ struct REFRESH_Device
|
|||
|
||||
void(*SetVertexSamplers)(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
);
|
||||
|
||||
void(*SetFragmentSamplers)(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
);
|
||||
|
||||
/* Getters */
|
||||
|
|
|
@ -670,6 +670,13 @@ typedef struct VulkanRenderer
|
|||
VkCommandBuffer currentCommandBuffer;
|
||||
uint32_t numActiveCommands;
|
||||
|
||||
/*
|
||||
* TODO: we can get rid of this reference when we
|
||||
* come up with a clever descriptor set reuse system
|
||||
*/
|
||||
VkDescriptorPool *descriptorPools;
|
||||
uint32_t descriptorPoolCount;
|
||||
|
||||
VkDescriptorSetLayout vertexParamLayout;
|
||||
VkDescriptorSetLayout fragmentParamLayout;
|
||||
|
||||
|
@ -738,6 +745,10 @@ typedef struct VulkanGraphicsPipeline
|
|||
{
|
||||
VkPipeline pipeline;
|
||||
VkDescriptorPool descriptorPool;
|
||||
VkDescriptorSetLayout vertexSamplerLayout;
|
||||
uint32_t vertexSamplerBindingCount;
|
||||
VkDescriptorSetLayout fragmentSamplerLayout;
|
||||
uint32_t fragmentSamplerBindingCount;
|
||||
} VulkanGraphicsPipeline;
|
||||
|
||||
/* Forward declarations */
|
||||
|
@ -2346,6 +2357,11 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
|||
&pipelineLayout
|
||||
);
|
||||
|
||||
graphicsPipeline->vertexSamplerLayout = setLayouts[0];
|
||||
graphicsPipeline->fragmentSamplerLayout = setLayouts[1];
|
||||
graphicsPipeline->vertexSamplerBindingCount = pipelineCreateInfo->pipelineLayoutCreateInfo.vertexSamplerBindingCount;
|
||||
graphicsPipeline->fragmentSamplerBindingCount = pipelineCreateInfo->pipelineLayoutCreateInfo.fragmentSamplerBindingCount;
|
||||
|
||||
/* Pipeline */
|
||||
|
||||
vkPipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||
|
@ -2409,6 +2425,13 @@ static REFRESH_GraphicsPipeline* VULKAN_CreateGraphicsPipeline(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
renderer->descriptorPools = SDL_realloc(
|
||||
renderer->descriptorPools,
|
||||
renderer->descriptorPoolCount + 1
|
||||
);
|
||||
renderer->descriptorPools[renderer->descriptorPoolCount + 1] =
|
||||
graphicsPipeline->descriptorPool;
|
||||
|
||||
return (REFRESH_GraphicsPipeline*) graphicsPipeline;
|
||||
}
|
||||
|
||||
|
@ -3598,22 +3621,132 @@ static void VULKAN_PushShaderParamData(
|
|||
|
||||
static void VULKAN_SetVertexSamplers(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
) {
|
||||
SDL_assert(0);
|
||||
/* TODO: we can defer and batch these */
|
||||
|
||||
VkDescriptorSetAllocateInfo descriptorSetAllocateInfo;
|
||||
VkDescriptorSet descriptorSet;
|
||||
VkWriteDescriptorSet *writeDescriptorSets;
|
||||
VkDescriptorImageInfo *descriptorImageInfos;
|
||||
VulkanTexture *currentTexture;
|
||||
VkSampler currentSampler;
|
||||
uint32_t i;
|
||||
|
||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||
VulkanGraphicsPipeline *graphicsPipeline = (VulkanGraphicsPipeline*) pipeline;
|
||||
|
||||
writeDescriptorSets = SDL_stack_alloc(VkWriteDescriptorSet, graphicsPipeline->vertexSamplerBindingCount);
|
||||
descriptorImageInfos = SDL_stack_alloc(VkDescriptorImageInfo, graphicsPipeline->vertexSamplerBindingCount);
|
||||
|
||||
descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
descriptorSetAllocateInfo.pNext = NULL;
|
||||
descriptorSetAllocateInfo.descriptorSetCount = 1;
|
||||
descriptorSetAllocateInfo.descriptorPool = graphicsPipeline->descriptorPool;
|
||||
descriptorSetAllocateInfo.pSetLayouts = &graphicsPipeline->vertexSamplerLayout;
|
||||
|
||||
renderer->vkAllocateDescriptorSets(
|
||||
renderer->logicalDevice,
|
||||
&descriptorSetAllocateInfo,
|
||||
&descriptorSet
|
||||
);
|
||||
|
||||
for (i = 0; i < graphicsPipeline->vertexSamplerBindingCount; i += 1)
|
||||
{
|
||||
currentTexture = (VulkanTexture*) pTextures[i];
|
||||
currentSampler = (VkSampler) pSamplers[i];
|
||||
|
||||
descriptorImageInfos[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
descriptorImageInfos[i].imageView = currentTexture->view;
|
||||
descriptorImageInfos[i].sampler = currentSampler;
|
||||
|
||||
writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
writeDescriptorSets[i].pNext = NULL;
|
||||
writeDescriptorSets[i].dstSet = descriptorSet;
|
||||
writeDescriptorSets[i].dstBinding = i;
|
||||
writeDescriptorSets[i].dstArrayElement = 0;
|
||||
writeDescriptorSets[i].descriptorCount = 1;
|
||||
writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
writeDescriptorSets[i].pImageInfo = &descriptorImageInfos[i];
|
||||
}
|
||||
|
||||
renderer->vkUpdateDescriptorSets(
|
||||
renderer->logicalDevice,
|
||||
graphicsPipeline->vertexSamplerBindingCount,
|
||||
writeDescriptorSets,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
|
||||
SDL_stack_free(writeDescriptorSets);
|
||||
SDL_stack_free(descriptorImageInfos);
|
||||
}
|
||||
|
||||
static void VULKAN_SetFragmentSamplers(
|
||||
REFRESH_Renderer *driverData,
|
||||
uint32_t startIndex,
|
||||
REFRESH_Texture *pTextures,
|
||||
REFRESH_Sampler *pSamplers,
|
||||
uint32_t count
|
||||
REFRESH_GraphicsPipeline *pipeline,
|
||||
REFRESH_Texture **pTextures,
|
||||
REFRESH_Sampler **pSamplers
|
||||
) {
|
||||
SDL_assert(0);
|
||||
/* TODO: we can defer and batch these */
|
||||
|
||||
VkDescriptorSetAllocateInfo descriptorSetAllocateInfo;
|
||||
VkDescriptorSet descriptorSet;
|
||||
VkWriteDescriptorSet *writeDescriptorSets;
|
||||
VkDescriptorImageInfo *descriptorImageInfos;
|
||||
VulkanTexture *currentTexture;
|
||||
VkSampler currentSampler;
|
||||
uint32_t i;
|
||||
|
||||
VulkanRenderer* renderer = (VulkanRenderer*) driverData;
|
||||
VulkanGraphicsPipeline *graphicsPipeline = (VulkanGraphicsPipeline*) pipeline;
|
||||
|
||||
writeDescriptorSets = SDL_stack_alloc(VkWriteDescriptorSet, graphicsPipeline->fragmentSamplerBindingCount);
|
||||
descriptorImageInfos = SDL_stack_alloc(VkDescriptorImageInfo, graphicsPipeline->fragmentSamplerBindingCount);
|
||||
|
||||
descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
descriptorSetAllocateInfo.pNext = NULL;
|
||||
descriptorSetAllocateInfo.descriptorSetCount = 1;
|
||||
descriptorSetAllocateInfo.descriptorPool = graphicsPipeline->descriptorPool;
|
||||
descriptorSetAllocateInfo.pSetLayouts = &graphicsPipeline->fragmentSamplerLayout;
|
||||
|
||||
renderer->vkAllocateDescriptorSets(
|
||||
renderer->logicalDevice,
|
||||
&descriptorSetAllocateInfo,
|
||||
&descriptorSet
|
||||
);
|
||||
|
||||
for (i = 0; i < graphicsPipeline->fragmentSamplerBindingCount; i += 1)
|
||||
{
|
||||
currentTexture = (VulkanTexture*) pTextures[i];
|
||||
currentSampler = (VkSampler) pSamplers[i];
|
||||
|
||||
descriptorImageInfos[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
descriptorImageInfos[i].imageView = currentTexture->view;
|
||||
descriptorImageInfos[i].sampler = currentSampler;
|
||||
|
||||
writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
writeDescriptorSets[i].pNext = NULL;
|
||||
writeDescriptorSets[i].dstSet = descriptorSet;
|
||||
writeDescriptorSets[i].dstBinding = i;
|
||||
writeDescriptorSets[i].dstArrayElement = 0;
|
||||
writeDescriptorSets[i].descriptorCount = 1;
|
||||
writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
writeDescriptorSets[i].pImageInfo = &descriptorImageInfos[i];
|
||||
}
|
||||
|
||||
renderer->vkUpdateDescriptorSets(
|
||||
renderer->logicalDevice,
|
||||
graphicsPipeline->fragmentSamplerBindingCount,
|
||||
writeDescriptorSets,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
|
||||
SDL_stack_free(writeDescriptorSets);
|
||||
SDL_stack_free(descriptorImageInfos);
|
||||
}
|
||||
|
||||
static void VULKAN_GetTextureData2D(
|
||||
|
@ -5079,6 +5212,11 @@ static REFRESH_Device* VULKAN_CreateDevice(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Descriptor Pools */
|
||||
|
||||
renderer->descriptorPools = NULL;
|
||||
renderer->descriptorPoolCount = 0;
|
||||
|
||||
/* Threading */
|
||||
|
||||
renderer->allocatorLock = SDL_CreateMutex();
|
||||
|
|
Loading…
Reference in New Issue