141 lines
3.6 KiB
C++
141 lines
3.6 KiB
C++
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
|
|
|
SHADERGEN_NAMESPACE_BEGIN
|
|
ShaderDescriptorInfo::ShaderDescriptorInfo(VkShaderStageFlagBits flag_bit)
|
|
{
|
|
shader_stage=flag_bit;
|
|
|
|
hgl_zero(push_constant);
|
|
}
|
|
|
|
namespace
|
|
{
|
|
bool Find(ObjectList<ShaderStage> &ol,const ShaderStage *ss)
|
|
{
|
|
for(int i=0;i<ol.GetCount();i++)
|
|
if(hgl::strcmp(ol[i]->name,ss->name)==0)
|
|
return(true);
|
|
|
|
return(false);
|
|
}
|
|
}//namespace
|
|
|
|
bool ShaderDescriptorInfo::AddInput(ShaderStage *ss)
|
|
{
|
|
if(!ss)return(false);
|
|
|
|
if(Find(stage_io.input,ss))return(false);
|
|
|
|
ss->location=stage_io.input.GetCount();
|
|
stage_io.input.Add(ss);
|
|
return(true);
|
|
}
|
|
|
|
bool ShaderDescriptorInfo::AddOutput(ShaderStage *ss)
|
|
{
|
|
if(!ss)return(false);
|
|
|
|
if(Find(stage_io.output,ss))return(false);
|
|
|
|
ss->location=stage_io.output.GetCount();
|
|
stage_io.output.Add(ss);
|
|
return(true);
|
|
}
|
|
|
|
bool ShaderDescriptorInfo::AddUBO(DescriptorSetType type,const UBODescriptor *ubo)
|
|
{
|
|
if(!ubo)
|
|
return(false);
|
|
|
|
struct_list.AddUnique(ubo->type);
|
|
|
|
ubo_list.Add(ubo);
|
|
return true;
|
|
}
|
|
|
|
bool ShaderDescriptorInfo::AddSampler(DescriptorSetType type,const SamplerDescriptor *sampler)
|
|
{
|
|
if(!sampler)
|
|
return(false);
|
|
|
|
sampler_list.Add(sampler);
|
|
return true;
|
|
}
|
|
|
|
bool ShaderDescriptorInfo::AddConstValue(ConstValueDescriptor *sd)
|
|
{
|
|
if(!sd)return(false);
|
|
|
|
for(auto *p:const_value_list)
|
|
if(p->name.Comp(sd->name)==0)
|
|
return(false);
|
|
|
|
sd->constant_id=const_value_list.Add(sd);
|
|
return(true);
|
|
}
|
|
|
|
bool ShaderDescriptorInfo::AddSubpassInput(const UTF8String name,uint8_t index)
|
|
{
|
|
for(auto *si:subpass_input)
|
|
{
|
|
if(si->input_attachment_index==index)return(false);
|
|
if(si->name.Comp(name))return(false);
|
|
}
|
|
|
|
SubpassInputDescriptor *ssi=new SubpassInputDescriptor;
|
|
|
|
ssi->name=name;
|
|
ssi->input_attachment_index=index;
|
|
|
|
subpass_input.Add(ssi);
|
|
return(true);
|
|
}
|
|
|
|
void ShaderDescriptorInfo::SetPushConstant(const UTF8String name,uint8_t offset,uint8_t size)
|
|
{
|
|
push_constant.name =name;
|
|
push_constant.offset=offset;
|
|
push_constant.size =size;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
void ShaderDescriptorInfo::DebugOutput(int index)
|
|
{
|
|
UTF8String name=GetStageName();
|
|
|
|
LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader");
|
|
|
|
if(stage_io.input.GetCount()>0)
|
|
{
|
|
LOG_INFO("\tStage Input "+UTF8String::numberOf(stage_io.input.GetCount()));
|
|
|
|
for(auto *ss:stage_io.input)
|
|
LOG_INFO("\t\tlayout(location="+UTF8String::numberOf(ss->location)+") in "+UTF8String(GetShaderStageTypeName(ss))+"\t"+UTF8String(ss->name));
|
|
}
|
|
|
|
if(stage_io.output.GetCount()>0)
|
|
{
|
|
LOG_INFO("\tStage Output "+UTF8String::numberOf(stage_io.output.GetCount()));
|
|
|
|
for(auto *ss:stage_io.output)
|
|
LOG_INFO("\t\tlayout(location="+UTF8String::numberOf(ss->location)+") out "+UTF8String(GetShaderStageTypeName(ss))+"\t"+UTF8String(ss->name));
|
|
}
|
|
|
|
if(ubo_list.GetCount()>0)
|
|
{
|
|
LOG_INFO("\tUBO "+UTF8String::numberOf(ubo_list.GetCount()));
|
|
|
|
for(auto *ubo:ubo_list)
|
|
LOG_INFO("\t\tlayout(set="+UTF8String::numberOf(ubo->set)+",binding="+UTF8String::numberOf(ubo->binding)+") uniform "+ubo->type+"\t"+ubo->type);
|
|
}
|
|
|
|
if(sampler_list.GetCount()>0)
|
|
{
|
|
LOG_INFO("\tSampler "+UTF8String::numberOf(sampler_list.GetCount()));
|
|
|
|
for(auto *ubo:ubo_list)
|
|
LOG_INFO("\t\tlayout(set="+UTF8String::numberOf(ubo->set)+",binding="+UTF8String::numberOf(ubo->binding)+") uniform "+ubo->type+"\t"+ubo->type);
|
|
}
|
|
}
|
|
#endif//_DEBUG
|
|
SHADERGEN_NAMESPACE_END |