1.removed VertexShaderModule

2.added VertexInput at MaterialData
3.newly CreateShaderModule/CreateMaterial functions at GPUDevice/RenderResource class.
This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-19 19:41:21 +08:00
parent 42f63c5ef1
commit facdec5556
14 changed files with 73 additions and 268 deletions

@ -1 +1 @@
Subproject commit f51a6a98d6268e93fe854a2c3a07e559778c3e54
Subproject commit 4a7af92ac66d55d1e6bf3d7e384ab92797e0559a

View File

@ -6,6 +6,7 @@
#include<hgl/math/HalfFloat.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
using namespace hgl;

View File

@ -75,7 +75,6 @@ struct ShaderAttribute;
class ShaderResource;
class ShaderModule;
class VertexShaderModule;
class ShaderModuleMap;
class MaterialDescriptorSets;
@ -86,39 +85,9 @@ struct PipelineData;
enum class InlinePipeline;
class Pipeline;
struct VAConfig
{
VkFormat format;
bool instance;
public:
VAConfig()
{
format=PF_UNDEFINED;
instance=false;
}
VAConfig(const VkFormat fmt,bool inst=false)
{
format=fmt;
instance=inst;
}
CompOperatorMemcmp(const VAConfig &);
};
class VILConfig:public Map<AnsiString,VAConfig>
{
public:
using Map<AnsiString,VAConfig>::Map;
bool Add(const AnsiString &name,const VkFormat fmt,const bool inst=false)
{
return Map<AnsiString,VAConfig>::Add(name,VAConfig(fmt,inst));
}
};
struct VAConfig;
class VILConfig;
class VertexInput;
class VertexInputLayout;
using VIL=VertexInputLayout;

View File

@ -224,11 +224,9 @@ public: //shader & material
MaterialParameters *CreateMP(const MaterialDescriptorSets *,const PipelineLayoutData *,const DescriptorSetType &);
MaterialParameters *CreateMP(Material *,const DescriptorSetType &);
ShaderModule *CreateShaderModule(ShaderResource *);
ShaderModule *CreateShaderModule(VkShaderStageFlagBits,const void *,const size_t);
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *,VertexInput *);
MaterialInstance *CreateMI(Material *,const VILConfig *vil_cfg=nullptr);

View File

@ -15,10 +15,11 @@ struct MaterialData
{
UTF8String name;
ShaderModuleMap *shader_maps;
MaterialDescriptorSets *mds;
VertexInput *vertex_input;
VertexShaderModule *vertex_sm;
ShaderModuleMap *shader_maps;
MaterialDescriptorSets *mds;
ShaderStageCreateInfoList shader_stage_list;
@ -54,7 +55,7 @@ public:
const UTF8String & GetName ()const{return data->name;}
VertexShaderModule * GetVertexShaderModule () {return data->vertex_sm;}
const VertexInput * GetVertexInput ()const{return data->vertex_input;}
const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;}
@ -72,6 +73,10 @@ public:
}
const bool hasSet (const DescriptorSetType &type)const;
VIL * CreateVIL(const VILConfig *format_map=nullptr);
bool Release(VIL *);
const uint GetVILCount();
};//class Material
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

@ -88,7 +88,7 @@ public: // VBO/VAO
public: //Material
const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource);
const ShaderModule *CreateShaderModule(const OSString &filename,VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size);
Material * CreateMaterial(const OSString &);
Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *);

View File

@ -2,7 +2,6 @@
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
#include<hgl/graph/VK.h>
#include<hgl/graph/VKShaderResource.h>
#include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/type/SortedSets.h>
@ -21,13 +20,9 @@ private:
VkPipelineShaderStageCreateInfo *stage_create_info;
protected:
ShaderResource *shader_resource;
public:
ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *);
ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci);
virtual ~ShaderModule();
const int IncRef(){return ++ref_count;}
@ -50,48 +45,5 @@ public:
operator VkShaderModule ()const{return stage_create_info->module;}
};//class ShaderModule
/**
* Shader模块<br>
* shader在最前方执行shader多了VertexInput的数据
*/
class VertexShaderModule:public ShaderModule
{
uint32_t attr_count;
VAT *type_list;
const char **name_list;
ShaderAttribute *shader_attr_list;
private:
SortedSets<VIL *> vil_sets;
public:
VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr);
virtual ~VertexShaderModule();
/**
* binding并非是shader中的binding/locationvkCmdBindVertexBuffer的缓冲区序列号
*/
const int GetInputBinding(const AnsiString &name)const{return shader_resource->GetInputBinding(name);}
const ShaderAttribute * GetInput (const AnsiString &name)const{return shader_resource->GetInput(name);}
const uint GetInputCount () const{return shader_resource->GetInputCount();}
const ShaderAttributeArray & GetInputs () const{return shader_resource->GetInputs();}
//const uint32_t GetAttrCount()const{return attr_count;}
//const VkVertexInputBindingDescription * GetBindList ()const{return binding_list;}
//const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;}
//const VkVertexInputBindingDescription * GetBind (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);}
//const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);}
public:
VIL * CreateVIL(const VILConfig *format_map=nullptr);
bool Release(VIL *);
const uint32_t GetInstanceCount()const{return vil_sets.GetCount();}
};//class VertexShaderModule:public ShaderModule
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE

View File

@ -38,16 +38,5 @@ public:
const ShaderAttribute * GetInput (const AnsiString &)const;
const int GetInputBinding (const AnsiString &)const;
};//class ShaderResource
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
{
public:
ShaderModuleCreateInfo(ShaderResource *sr)
{
codeSize=sr->GetCodeSize();
pCode =sr->GetCode();
}
};//struct ShaderModuleCreateInfo
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE

View File

@ -77,16 +77,11 @@ void CreateShaderStageList(List<VkPipelineShaderStageCreateInfo> &shader_stage_l
}
}
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds)
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds,VertexInput *vi)
{
const int shader_count=shader_maps->GetCount();
if(shader_count<2)
return(nullptr);
const ShaderModule *vsm;
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,vsm))
if(shader_count<1)
return(nullptr);
PipelineLayoutData *pld=CreatePipelineLayoutData(mds);
@ -103,7 +98,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
data->name =mtl_name;
data->shader_maps =shader_maps;
data->mds =mds;
data->vertex_sm =(VertexShaderModule *)vsm;
data->vertex_input =vi;
CreateShaderStageList(data->shader_stage_list,shader_maps);
@ -124,40 +119,4 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
return(new Material(data));
}
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
{
if(!vertex_shader_module||!fragment_shader_module)
return(nullptr);
if(!vertex_shader_module->IsVertex())return(nullptr);
if(!fragment_shader_module->IsFragment())return(nullptr);
ShaderModuleMap *smm=new ShaderModuleMap;
smm->Add(vertex_shader_module);
smm->Add(fragment_shader_module);
return CreateMaterial(mtl_name,smm,mds);
}
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
{
if(!vertex_shader_module
||!geometry_shader_module
||!fragment_shader_module)
return(nullptr);
if(!vertex_shader_module->IsVertex())return(nullptr);
if(!geometry_shader_module->IsGeometry())return(nullptr);
if(!fragment_shader_module->IsFragment())return(nullptr);
ShaderModuleMap *smm=new ShaderModuleMap;
smm->Add(vertex_shader_module);
smm->Add(geometry_shader_module);
smm->Add(fragment_shader_module);
return CreateMaterial(mtl_name,smm,mds);
}
VK_NAMESPACE_END

View File

@ -1,6 +1,7 @@
#include<hgl/graph/VKMaterial.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterialDescriptorSets.h>
#include<hgl/graph/VKVertexInput.h>
#include"VKPipelineLayoutData.h"
VK_NAMESPACE_BEGIN
MaterialData::~MaterialData()
@ -11,6 +12,8 @@ MaterialData::~MaterialData()
delete shader_maps;
SAFE_CLEAR(mds);
delete vertex_input;
}
Material::~Material()
@ -28,4 +31,19 @@ const bool Material::hasSet(const DescriptorSetType &dst)const
{
return data->mds->hasSet(dst);
}
VIL *Material::CreateVIL(const VILConfig *format_map)
{
return data->vertex_input->CreateVIL(format_map);
}
bool Material::Release(VIL *vil)
{
return data->vertex_input->Release(vil);
}
const uint Material::GetVILCount()
{
return data->vertex_input->GetInstanceCount();
}
VK_NAMESPACE_END

View File

@ -8,9 +8,7 @@ MaterialInstance *GPUDevice::CreateMI(Material *mtl,const VILConfig *vil_cfg)
{
if(!mtl)return(nullptr);
VertexShaderModule *vsm=mtl->GetVertexShaderModule();
VIL *vil=vsm->CreateVIL(vil_cfg);
VIL *vil=mtl->CreateVIL(vil_cfg);
if(!vil)return(nullptr);

View File

@ -4,6 +4,7 @@
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKShaderResource.h>
#include<hgl/graph/VKMaterialDescriptorSets.h>
#include<hgl/graph/VKVertexInput.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/io/ConstBufferReader.h>
@ -11,18 +12,19 @@
VK_NAMESPACE_BEGIN
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,ShaderResource *shader_resource)
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size)
{
if(!device)return(nullptr);
if(filename.IsEmpty())return(nullptr);
if(!shader_resource)return(nullptr);
if(!spv_data)return(nullptr);
if(spv_size<4)return(nullptr);
ShaderModule *sm;
if(shader_module_by_name.Get(filename,sm))
return sm;
sm=device->CreateShaderModule(shader_resource);
sm=device->CreateShaderModule(shader_stage,spv_data,spv_size);
shader_module_by_name.Add(filename,sm);
@ -128,6 +130,7 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
bool result=true;
ShaderModuleMap *smm=new ShaderModuleMap;
VertexInput *vertex_input=nullptr;
OSString shader_name;
@ -142,14 +145,19 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
{
shader_name=filename+OS_TEXT("?")+ToOSString(sr->GetStageName());
sm=CreateShaderModule(shader_name,sr);
sm=CreateShaderModule(shader_name,sr->GetStage(),sr->GetCode(),sr->GetCodeSize());
if(sm)
{
if(smm->Add(sm))
{
if(sr->GetStage()==VK_SHADER_STAGE_VERTEX_BIT)
vertex_input=new VertexInput(sr->GetInputs());
continue;
}
}
}
result=false;
break;
@ -172,9 +180,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
}
}
if(result)
if(result&&vertex_input)
{
mtl=device->CreateMaterial(mtl_name,smm,mds);
mtl=device->CreateMaterial(mtl_name,smm,mds,vertex_input);
Add(mtl);
}
else

View File

@ -3,135 +3,42 @@
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
ShaderModule *GPUDevice::CreateShaderModule(ShaderResource *sr)
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
{
if(!sr)return(nullptr);
public:
PipelineShaderStageCreateInfo *shader_stage=new PipelineShaderStageCreateInfo(sr->GetStage());
ShaderModuleCreateInfo(const void *spv_data,const size_t spv_size)
{
codeSize=spv_size;
pCode =(const uint32_t *)spv_data;
}
};//struct ShaderModuleCreateInfo
ShaderModuleCreateInfo moduleCreateInfo(sr);
ShaderModule *GPUDevice::CreateShaderModule(VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size)
{
if(!spv_data||spv_size<4)return(nullptr);
if(vkCreateShaderModule(attr->device,&moduleCreateInfo,nullptr,&(shader_stage->module))!=VK_SUCCESS)
PipelineShaderStageCreateInfo *pss_ci=new PipelineShaderStageCreateInfo(shader_stage);
ShaderModuleCreateInfo moduleCreateInfo(spv_data,spv_size);
if(vkCreateShaderModule(attr->device,&moduleCreateInfo,nullptr,&(pss_ci->module))!=VK_SUCCESS)
return(nullptr);
ShaderModule *sm;
if(sr->GetStage()==VK_SHADER_STAGE_VERTEX_BIT)
sm=new VertexShaderModule(attr->device,shader_stage,sr);
else
sm=new ShaderModule(attr->device,shader_stage,sr);
return sm;
return(new ShaderModule(attr->device,pss_ci));
}
ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci,ShaderResource *sr)
ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci)
{
device=dev;
ref_count=0;
stage_create_info=sci;
shader_resource=sr;
}
ShaderModule::~ShaderModule()
{
vkDestroyShaderModule(device,stage_create_info->module,nullptr);
//这里不用删除stage_create_info材质中会删除的
SAFE_CLEAR(shader_resource);
}
VertexShaderModule::VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr):ShaderModule(dev,pssci,sr)
{
const ShaderAttributeArray &stage_input_list=sr->GetInputs();
attr_count=stage_input_list.count;
shader_attr_list=stage_input_list.items;
name_list=new const char *[attr_count];
type_list=new VAT[attr_count];
for(uint i=0;i<attr_count;i++)
{
name_list[i] =shader_attr_list[i].name;
type_list[i].basetype =VATBaseType(shader_attr_list[i].basetype);
type_list[i].vec_size =shader_attr_list[i].vec_size;
}
}
VertexShaderModule::~VertexShaderModule()
{
if(vil_sets.GetCount()>0)
{
//还有在用的,这是个错误
}
delete[] type_list;
delete[] name_list;
}
VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg)
{
VkVertexInputBindingDescription *binding_list=new VkVertexInputBindingDescription[attr_count];
VkVertexInputAttributeDescription *attribute_list=new VkVertexInputAttributeDescription[attr_count];
VkVertexInputBindingDescription *bind_desc=binding_list;
VkVertexInputAttributeDescription *attr_desc=attribute_list;
const ShaderAttribute *sa=shader_attr_list;
VAConfig vac;
for(uint i=0;i<attr_count;i++)
{
//binding对应的是第几个数据输入流
//实际使用一个binding可以绑定多个attrib
//比如在一个流中传递{pos,color}这样两个数据就需要两个attrib
//但在我们的设计中仅支持一个流传递一个attrib
attr_desc->binding =i;
attr_desc->location =sa->location; //此值对应shader中的layout(location=
attr_desc->offset =0;
bind_desc->binding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号所以这个数字必须从0开始而且紧密排列。
//在Renderable类中buffer_list必需严格按照本此binding为序列号排列
if(!cfg||!cfg->Get(sa->name,vac))
{
attr_desc->format =GetVulkanFormat(sa);
//if(memcmp((*sa)->name.c_str(),"Inst_",5)==0) //不可以使用CaseComp("Inst_",5)会被认为是比较一个5字长的字符串而不是只比较5个字符
// bind_desc->inputRate =VK_VERTEX_INPUT_RATE_INSTANCE;
//else
bind_desc->inputRate =VK_VERTEX_INPUT_RATE_VERTEX;
}
else
{
if(vac.format!=PF_UNDEFINED)
attr_desc->format =vac.format;
else
attr_desc->format =GetVulkanFormat(sa);
bind_desc->inputRate =vac.instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX;
}
bind_desc->stride =GetStrideByFormat(attr_desc->format);
++attr_desc;
++bind_desc;
++sa;
}
VIL *vil=new VIL(attr_count,name_list,type_list,binding_list,attribute_list);
vil_sets.Add(vil);
return(vil);
}
bool VertexShaderModule::Release(VIL *vil)
{
return vil_sets.Delete(vil);
}
VK_NAMESPACE_END

View File

@ -3,6 +3,7 @@
#include<hgl/graph/font/TileFont.h>
#include<hgl/graph/font/TextLayout.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/color/Color.h>
namespace hgl