2019-04-15 08:25:30 +08:00
|
|
|
#include"VKShader.h"
|
|
|
|
|
|
|
|
VK_NAMESPACE_BEGIN
|
2019-04-18 16:18:05 +08:00
|
|
|
Shader::~Shader()
|
2019-04-15 22:19:09 +08:00
|
|
|
{
|
2019-04-16 00:49:09 +08:00
|
|
|
const int count=shader_stage_list.GetCount();
|
|
|
|
|
|
|
|
if(count>0)
|
|
|
|
{
|
|
|
|
VkPipelineShaderStageCreateInfo *ss=shader_stage_list.GetData();
|
|
|
|
for(int i=0;i<count;i++)
|
|
|
|
{
|
|
|
|
vkDestroyShaderModule(device,ss->module,nullptr);
|
|
|
|
++ss;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-18 16:18:05 +08:00
|
|
|
bool Shader::Add(const VkShaderStageFlagBits shader_stage_bit,const void *spv_data,const uint32_t spv_size)
|
2019-04-16 00:49:09 +08:00
|
|
|
{
|
2019-04-15 22:19:09 +08:00
|
|
|
VkPipelineShaderStageCreateInfo shader_stage;
|
|
|
|
shader_stage.sType=VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
|
|
shader_stage.pNext=nullptr;
|
|
|
|
shader_stage.pSpecializationInfo=nullptr;
|
|
|
|
shader_stage.flags=0;
|
|
|
|
shader_stage.stage=shader_stage_bit;
|
|
|
|
shader_stage.pName="main";
|
|
|
|
|
|
|
|
VkShaderModuleCreateInfo moduleCreateInfo;
|
|
|
|
moduleCreateInfo.sType=VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
|
|
moduleCreateInfo.pNext=nullptr;
|
|
|
|
moduleCreateInfo.flags=0;
|
|
|
|
moduleCreateInfo.codeSize=spv_size;
|
2019-04-16 00:49:09 +08:00
|
|
|
moduleCreateInfo.pCode=(const uint32_t *)spv_data;
|
2019-04-15 22:19:09 +08:00
|
|
|
|
2019-04-16 00:49:09 +08:00
|
|
|
if(vkCreateShaderModule(device,&moduleCreateInfo,nullptr,&shader_stage.module)!=VK_SUCCESS)
|
|
|
|
return(false);
|
2019-04-15 22:19:09 +08:00
|
|
|
|
2019-04-16 00:49:09 +08:00
|
|
|
shader_stage_list.Add(shader_stage);
|
2019-04-15 22:19:09 +08:00
|
|
|
|
2019-04-16 00:49:09 +08:00
|
|
|
return(true);
|
2019-04-15 22:19:09 +08:00
|
|
|
}
|
2019-04-15 08:25:30 +08:00
|
|
|
VK_NAMESPACE_END
|