compute shaders
This commit is contained in:
81
materialsystem/vulkan/csshader.cpp
Normal file
81
materialsystem/vulkan/csshader.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "vulkan_state.h"
|
||||
|
||||
void CVkComputeShader::Build()
|
||||
{
|
||||
VkPipelineShaderStageCreateInfo stage = {};
|
||||
VkShaderModuleCreateInfo mod = {};
|
||||
ShaderObject_t *s = m_shader.FindShaderObject(SHADER_BACKEND_SPIRV_VULKAN, SHADER_STAGE_COMPUTE);
|
||||
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(s->m_nMetadataLump);
|
||||
VkPipelineLayoutCreateInfo stPipelineLayout = {};
|
||||
CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {};
|
||||
|
||||
for ( int u = 0; u < pMetaData->nDescriptorsCount; u++ )
|
||||
{
|
||||
VulkanDescriptor_t stDescriptor = ((VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets))[u];
|
||||
bool bFound = false;
|
||||
if (bindings.GetSize()<=stDescriptor.uSet)
|
||||
bindings.Resize(stDescriptor.uSet+1);
|
||||
|
||||
uint32_t i = 0;
|
||||
for ( auto &set: bindings )
|
||||
{
|
||||
for ( auto &b: set )
|
||||
{
|
||||
if (i != stDescriptor.uSet)
|
||||
continue;
|
||||
if (b.binding != stDescriptor.uBinding)
|
||||
continue;
|
||||
bFound = true;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
if (bFound)
|
||||
break;
|
||||
}
|
||||
if (bFound)
|
||||
continue;
|
||||
VkDescriptorSetLayoutBinding bind = {};
|
||||
bind.binding = stDescriptor.uBinding;
|
||||
bind.descriptorCount = stDescriptor.uCount;
|
||||
bind.descriptorType = stDescriptor.eDescriptorType;
|
||||
bind.stageFlags = VK_SHADER_STAGE_ALL;
|
||||
bindings[stDescriptor.uSet].AppendTail(bind);
|
||||
m_bindings.AppendTail(stDescriptor);
|
||||
}
|
||||
mod.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
mod.pCode = (uint32_t*)m_shader.GetLumpPtr(s->m_nDataLump);
|
||||
mod.codeSize = m_shader.GetLumpSize(s->m_nDataLump);
|
||||
stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
stage.pNext = &mod;
|
||||
stage.pName = "main";
|
||||
stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
|
||||
if ( bindings.GetSize() >= 0 )
|
||||
{
|
||||
m_setLayouts.Reserve(bindings.GetSize());
|
||||
for ( int u = 0; u < bindings.GetSize(); u++ )
|
||||
{
|
||||
VkDescriptorSetLayoutCreateInfo stSetLayoutCreateInfo = {};
|
||||
VkDescriptorSetLayout l = NULL;
|
||||
stSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||
stSetLayoutCreateInfo.pBindings = bindings[u].GetData();
|
||||
stSetLayoutCreateInfo.bindingCount = bindings[u].GetSize();
|
||||
stSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
|
||||
vkCreateDescriptorSetLayout(m_hDevice, &stSetLayoutCreateInfo, NULL, &l);
|
||||
m_setLayouts.AppendTail(l);
|
||||
}
|
||||
stPipelineLayout.setLayoutCount = m_setLayouts.GetSize();
|
||||
stPipelineLayout.pSetLayouts = m_setLayouts.GetData();
|
||||
}
|
||||
|
||||
stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||
vkCreatePipelineLayout(m_hDevice, &stPipelineLayout, NULL, &m_hPipelineLayout);
|
||||
|
||||
VkComputePipelineCreateInfo ci = {};
|
||||
ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
|
||||
ci.layout = m_hPipelineLayout;
|
||||
ci.stage = stage;
|
||||
|
||||
vkCreateComputePipelines(m_hDevice, NULL, 1, &ci, NULL, &m_hPipeline);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user