From f4a8406ad86b4b7f0d9e243e924a362200b0f243 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Fri, 2 Jun 2023 20:45:19 +0800 Subject: [PATCH] support MI_MAX_COUNT in ShaderGen --- example/Vulkan/first_triangle.cpp | 4 +- example/Vulkan/fourth_triangle.cpp | 4 +- example/Vulkan/second_triangle.cpp | 4 +- example/Vulkan/third_triangle.cpp | 4 +- inc/hgl/graph/VKDescriptorSet.h | 6 +- inc/hgl/graph/VKDevice.h | 4 - ...ial2DConfig.h => Material2DCreateConfig.h} | 16 +-- inc/hgl/graph/mtl/MaterialConfig.h | 10 +- inc/hgl/graph/mtl/StdMaterial.h | 10 ++ inc/hgl/graph/mtl/UBOCommon.h | 2 +- inc/hgl/shadergen/MaterialCreateInfo.h | 88 +++++++++-------- inc/hgl/shadergen/MaterialDescriptorInfo.h | 6 ++ inc/hgl/shadergen/ShaderCreateInfo.h | 10 ++ src/SceneGraph/MaterialRenderList.cpp | 6 +- src/SceneGraph/RenderExtraBuffer.h | 20 ++-- src/SceneGraph/Vulkan/VKDeviceMaterial.cpp | 78 ++++++++------- .../Vulkan/VKPipelineLayoutData.cpp | 10 +- src/ShaderGen/2d/PureColor2D.cpp | 10 +- src/ShaderGen/2d/Std2DMaterial.cpp | 18 ++-- src/ShaderGen/2d/Std2DMaterial.h | 18 ++-- src/ShaderGen/2d/VertexColor2D.cpp | 8 +- src/ShaderGen/CMakeLists.txt | 2 +- src/ShaderGen/MaterialCreateInfo.cpp | 24 +++-- src/ShaderGen/ShaderCreateInfo.cpp | 98 ++++++++++++++++--- src/ShaderGen/ShaderCreateInfoFragment.cpp | 2 + src/ShaderGen/common/MFCommon.h | 9 +- src/ShaderGen/common/MFGetPosition.h | 36 ++++--- 27 files changed, 318 insertions(+), 189 deletions(-) rename inc/hgl/graph/mtl/2d/{Material2DConfig.h => Material2DCreateConfig.h} (51%) diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index c8244cfc..06c62ebb 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include using namespace hgl; using namespace hgl::graph; @@ -87,7 +87,7 @@ private: bool InitAutoMaterial() { - mtl::Material2DConfig cfg("VertexColor2d"); + mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"VertexColor2d"); cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.local_to_world=false; diff --git a/example/Vulkan/fourth_triangle.cpp b/example/Vulkan/fourth_triangle.cpp index eed65cf6..ed178f20 100644 --- a/example/Vulkan/fourth_triangle.cpp +++ b/example/Vulkan/fourth_triangle.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include using namespace hgl; @@ -47,7 +47,7 @@ private: bool InitMaterial() { { - mtl::Material2DConfig cfg("PureColor2D"); + mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"PureColor2D"); cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.local_to_world=true; diff --git a/example/Vulkan/second_triangle.cpp b/example/Vulkan/second_triangle.cpp index 23f5cf1f..f1c19132 100644 --- a/example/Vulkan/second_triangle.cpp +++ b/example/Vulkan/second_triangle.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include using namespace hgl; using namespace hgl::graph; @@ -45,7 +45,7 @@ private: bool InitMaterial() { - mtl::Material2DConfig cfg("VertexColor2D"); + mtl::Material2DCreateConfig cfg("VertexColor2D"); #ifdef USE_ZERO2ONE_COORD cfg.coordinate_system=CoordinateSystem2D::ZeroToOne; diff --git a/example/Vulkan/third_triangle.cpp b/example/Vulkan/third_triangle.cpp index 5cc5af9a..4cbdbfd3 100644 --- a/example/Vulkan/third_triangle.cpp +++ b/example/Vulkan/third_triangle.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include using namespace hgl; @@ -46,7 +46,7 @@ private: bool InitMaterial() { { - mtl::Material2DConfig cfg("VertexColor2D"); + mtl::Material2DCreateConfig cfg("VertexColor2D"); cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.local_to_world=true; diff --git a/inc/hgl/graph/VKDescriptorSet.h b/inc/hgl/graph/VKDescriptorSet.h index 4d0d3d9f..e5edbba9 100644 --- a/inc/hgl/graph/VKDescriptorSet.h +++ b/inc/hgl/graph/VKDescriptorSet.h @@ -23,9 +23,7 @@ class DescriptorSet bool is_dirty; -private: - - friend class GPUDevice; +public: DescriptorSet(VkDevice dev,const int bc,VkPipelineLayout pl,VkDescriptorSet ds) { @@ -37,8 +35,6 @@ private: is_dirty=true; } -public: - ~DescriptorSet()=default; const uint32_t GetCount ()const{return binding_count;} diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 35140548..47b56478 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -209,10 +209,6 @@ public: // public: //shader & material - PipelineLayoutData *CreatePipelineLayoutData(const MaterialDescriptorManager *); - void Destroy(PipelineLayoutData *); - - DescriptorSet * CreateDS(const PipelineLayoutData *,const DescriptorSetType &type)const; MaterialParameters *CreateMP(const MaterialDescriptorManager *,const PipelineLayoutData *,const DescriptorSetType &); MaterialParameters *CreateMP(Material *,const DescriptorSetType &); diff --git a/inc/hgl/graph/mtl/2d/Material2DConfig.h b/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h similarity index 51% rename from inc/hgl/graph/mtl/2d/Material2DConfig.h rename to inc/hgl/graph/mtl/2d/Material2DCreateConfig.h index 7d7d7366..c6d017a6 100644 --- a/inc/hgl/graph/mtl/2d/Material2DConfig.h +++ b/inc/hgl/graph/mtl/2d/Material2DCreateConfig.h @@ -1,11 +1,11 @@ -#ifndef HGL_GRAPH_MTL_2D_CONFIG_INCLUDE -#define HGL_GRAPH_MTL_2D_CONFIG_INCLUDE +#ifndef HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE +#define HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE #include #include STD_MTL_NAMESPACE_BEGIN -struct Material2DConfig:public MaterialConfig +struct Material2DCreateConfig:public MaterialCreateConfig { CoordinateSystem2D coordinate_system; ///<使用的坐标系 @@ -13,7 +13,7 @@ struct Material2DConfig:public MaterialConfig public: - Material2DConfig(const AnsiString &name):MaterialConfig(name) + Material2DCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name):MaterialCreateConfig(da,name) { rt_output.color=1; //输出一个颜色 rt_output.depth=false; //不输出深度 @@ -22,9 +22,9 @@ public: coordinate_system=CoordinateSystem2D::NDC; local_to_world=false; } -};//struct Material2DConfig:public MaterialConfig +};//struct Material2DCreateConfig:public MaterialCreateConfig -MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *); -MaterialCreateInfo *CreatePureColor2D(const Material2DConfig *); +MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *); +MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *); STD_MTL_NAMESPACE_END -#endif//HGL_GRAPH_MTL_2D_CONFIG_INCLUDE +#endif//HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/MaterialConfig.h b/inc/hgl/graph/mtl/MaterialConfig.h index cf8e3a37..84e7b165 100644 --- a/inc/hgl/graph/mtl/MaterialConfig.h +++ b/inc/hgl/graph/mtl/MaterialConfig.h @@ -12,8 +12,10 @@ class MaterialCreateInfo; /** * 材质配置结构 */ -struct MaterialConfig +struct MaterialCreateConfig { + const GPUDeviceAttribute *dev_attr; + AnsiString mtl_name; ///<材质名称 RenderTargetOutputConfig rt_output; ///<渲染目标输出配置 @@ -22,12 +24,14 @@ struct MaterialConfig public: - MaterialConfig(const AnsiString &name) + MaterialCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name) { + dev_attr=da; + mtl_name=name; shader_stage=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT; } -};//struct MaterialConfig +};//struct MaterialCreateConfig STD_MTL_NAMESPACE_END #endif//HGL_GRAPH_MTL_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index 4d1f8f98..b6fff4b1 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -4,3 +4,13 @@ #define STD_MTL_NAMESPACE_END }}} #define STD_MTL_NAMESPACE_USING using namespace hgl::graph::mtl; + +namespace hgl +{ + namespace graph + { + namespace mtl + { + }//namespace mtl + }//namespace graph +}//namespace hgl diff --git a/inc/hgl/graph/mtl/UBOCommon.h b/inc/hgl/graph/mtl/UBOCommon.h index ca62f6c1..e22d3fb9 100644 --- a/inc/hgl/graph/mtl/UBOCommon.h +++ b/inc/hgl/graph/mtl/UBOCommon.h @@ -50,7 +50,7 @@ constexpr const ShaderBufferSource SBS_MaterialInstanceData= "mtl", R"( - MaterialInstance mi[256];)" + MaterialInstance mi[MI_MAX_COUNT];)" }; constexpr const ShaderBufferSource SBS_JointInfo= diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index 5e0df587..001e21ff 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -10,64 +10,72 @@ #include #include -STD_MTL_NAMESPACE_BEGIN -class MaterialCreateInfo +namespace hgl{namespace graph { -protected: + struct GPUDeviceAttribute; - const MaterialConfig *config; + namespace mtl + { + class MaterialCreateInfo + { + protected: - MaterialDescriptorInfo mdi; ///<材质描述符管理器 + const MaterialCreateConfig *config; - AnsiString mi_codes; ///mtl_name;} + public: - const uint32 GetShaderStage ()const{return config->shader_stage;} + const AnsiString &GetName ()const{return config->mtl_name;} - bool hasShader (const VkShaderStageFlagBits ss)const{return config->shader_stage&ss;} + const uint32 GetShaderStage ()const{return config->shader_stage;} - bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} -// bool hasTessCtrl ()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);} -// bool hasTessEval ()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);} - bool hasGeometry ()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);} - bool hasFragment ()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} -// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} + bool hasShader (const VkShaderStageFlagBits ss)const{return config->shader_stage&ss;} - ShaderCreateInfoVertex * GetVS()const{return vert;} - ShaderCreateInfoGeometry * GetGS()const{return geom;} - ShaderCreateInfoFragment * GetFS()const{return frag;} + bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} + // bool hasTessCtrl ()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);} + // bool hasTessEval ()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);} + bool hasGeometry ()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);} + bool hasFragment ()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} + // bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} -public: + ShaderCreateInfoVertex * GetVS()const{return vert;} + ShaderCreateInfoGeometry * GetGS()const{return geom;} + ShaderCreateInfoFragment * GetFS()const{return frag;} - const MaterialDescriptorInfo &GetMDI()const{return mdi;} - const uint32_t GetMIDataBytes()const{return mi_data_bytes;} + public: -public: + const MaterialDescriptorInfo &GetMDI()const{return mdi;} + const uint32_t GetMIDataBytes()const{return mi_data_bytes;} - MaterialCreateInfo(const MaterialConfig *); - ~MaterialCreateInfo()=default; + public: - bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage); + MaterialCreateInfo(const MaterialCreateConfig *); + ~MaterialCreateInfo()=default; - bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes); - bool AddStruct(const ShaderBufferSource &ss){return AddStruct(ss.struct_name,ss.codes);} + bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage); - bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name); - bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); + bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes); + bool AddStruct(const ShaderBufferSource &ss){return AddStruct(ss.struct_name,ss.codes);} - bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss); + bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name); + bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); + + bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss); + + bool CreateShader(const GPUDeviceAttribute *); + };//class MaterialCreateInfo + }//namespace mtl +}//namespace graph +}//namespace hgl - bool CreateShader(); -};//class MaterialCreateInfo -STD_MTL_NAMESPACE_END diff --git a/inc/hgl/shadergen/MaterialDescriptorInfo.h b/inc/hgl/shadergen/MaterialDescriptorInfo.h index 3464aa5d..1a6cb56c 100644 --- a/inc/hgl/shadergen/MaterialDescriptorInfo.h +++ b/inc/hgl/shadergen/MaterialDescriptorInfo.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace hgl{namespace graph{ @@ -28,6 +29,11 @@ public: return(true); } + bool AddStruct(const ShaderBufferSource &ss) + { + return(AddStruct(ss.struct_name,ss.codes)); + } + bool GetStruct(const AnsiString &name,AnsiString &code) { return(struct_map.Get(name,code)); diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index 83c820ba..f9a7df3f 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -25,6 +25,11 @@ protected: protected: + AnsiStringList define_macro_list; + AnsiStringList define_value_list; + uint32_t define_macro_max_length; + uint32_t define_value_max_length; + AnsiString output_struct; AnsiString mi_codes; @@ -39,6 +44,9 @@ protected: protected: virtual bool ProcHeader(){return(true);} + + virtual bool ProcDefine(); + virtual bool ProcSubpassInput(); virtual bool ProcInput(ShaderCreateInfo *); virtual bool ProcOutput(); @@ -65,6 +73,8 @@ public: ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorInfo *m); virtual ~ShaderCreateInfo(); + bool AddDefine(const AnsiString &m,const AnsiString &v); + int AddOutput(const graph::VAT &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth); int AddOutput(const AnsiString &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth); diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index 731c9d9e..e4808338 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -115,9 +115,9 @@ void MaterialRenderList::End() if(mi_count<=0)return; - if(extra_buffer->mi_countMIAlloc(device,mi_count,); - extra_buffer->WriteMaterialInstance(rn_list.GetData(),node_count,mi_set); + //if(extra_buffer->mi_countMIAlloc(device,mi_count,); + //extra_buffer->WriteMaterialInstance(rn_list.GetData(),node_count,mi_set); } void MaterialRenderList::RenderItem::Set(Renderable *ri) diff --git a/src/SceneGraph/RenderExtraBuffer.h b/src/SceneGraph/RenderExtraBuffer.h index 408d138b..3e01e247 100644 --- a/src/SceneGraph/RenderExtraBuffer.h +++ b/src/SceneGraph/RenderExtraBuffer.h @@ -144,20 +144,20 @@ public: //MaterialInstance Data { - const uint count=mi_set.GetCount(); + //const uint count=mi_set.GetCount(); - uint8 *tp=(uint8 *)(mi_data_buffer->Map()); - const MaterialInstance **mi=mi_set.GetData(); + //uint8 *tp=(uint8 *)(mi_data_buffer->Map()); + //const MaterialInstance **mi=mi_set.GetData(); - for(uint i=0;iGetData(),mi_size); + //for(uint i=0;iGetData(),mi_size); - ++mi; - tp+=mi_size; - } + // ++mi; + // tp+=mi_size; + //} - mi_data_buffer->Unmap(); + //mi_data_buffer->Unmap(); } } };//struct RenderExtraBuffer diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index 73c19df3..1e9a72f6 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -8,35 +8,61 @@ #include"VKPipelineLayoutData.h" VK_NAMESPACE_BEGIN -DescriptorSet *GPUDevice::CreateDS(const PipelineLayoutData *pld,const DescriptorSetType &type)const + +PipelineLayoutData *CreatePipelineLayoutData(VkDevice device,const MaterialDescriptorManager *desc_manager); + +namespace { - RANGE_CHECK_RETURN_NULLPTR(type); + DescriptorSet *CreateDS(VkDevice device,VkDescriptorPool desc_pool,const PipelineLayoutData *pld,const DescriptorSetType &type) + { + RANGE_CHECK_RETURN_NULLPTR(type); - const uint32_t binding_count=pld->binding_count[size_t(type)]; + const uint32_t binding_count=pld->binding_count[size_t(type)]; - if(!binding_count) - return(nullptr); + if(!binding_count) + return(nullptr); - DescriptorSetAllocateInfo alloc_info; + DescriptorSetAllocateInfo alloc_info; - alloc_info.descriptorPool = attr->desc_pool; - alloc_info.descriptorSetCount = 1; - alloc_info.pSetLayouts = pld->layouts+size_t(type); + alloc_info.descriptorPool = desc_pool; + alloc_info.descriptorSetCount = 1; + alloc_info.pSetLayouts = pld->layouts+size_t(type); - VkDescriptorSet desc_set; + VkDescriptorSet desc_set; - if(vkAllocateDescriptorSets(attr->device,&alloc_info,&desc_set)!=VK_SUCCESS) - return(nullptr); + if(vkAllocateDescriptorSets(device,&alloc_info,&desc_set)!=VK_SUCCESS) + return(nullptr); - return(new DescriptorSet(attr->device,binding_count,pld->pipeline_layout,desc_set)); -} + return(new DescriptorSet(device,binding_count,pld->pipeline_layout,desc_set)); + } + + void CreateShaderStageList(List &shader_stage_list,ShaderModuleMap *shader_maps) + { + const ShaderModule *sm; + + const int shader_count=shader_maps->GetCount(); + shader_stage_list.SetCount(shader_count); + + VkPipelineShaderStageCreateInfo *p=shader_stage_list.GetData(); + + auto **itp=shader_maps->GetDataList(); + for(int i=0;ivalue; + hgl_cpy(p,sm->GetCreateInfo(),1); + + ++p; + ++itp; + } + } +}//namespace MaterialParameters *GPUDevice::CreateMP(const MaterialDescriptorManager *desc_manager,const PipelineLayoutData *pld,const DescriptorSetType &desc_set_type) { if(!desc_manager||!pld)return(nullptr); RANGE_CHECK_RETURN_NULLPTR(desc_set_type) - DescriptorSet *ds=CreateDS(pld,desc_set_type); + DescriptorSet *ds=CreateDS(attr->device,attr->desc_pool,pld,desc_set_type); if(!ds)return(nullptr); @@ -56,26 +82,6 @@ MaterialParameters *GPUDevice::CreateMP(Material *mtl,const DescriptorSetType &d return CreateMP(mtl->GetDescriptorSets(),mtl->GetPipelineLayoutData(),desc_set_type); } -void CreateShaderStageList(List &shader_stage_list,ShaderModuleMap *shader_maps) -{ - const ShaderModule *sm; - - const int shader_count=shader_maps->GetCount(); - shader_stage_list.SetCount(shader_count); - - VkPipelineShaderStageCreateInfo *p=shader_stage_list.GetData(); - - auto **itp=shader_maps->GetDataList(); - for(int i=0;ivalue; - hgl_cpy(p,sm->GetCreateInfo(),1); - - ++p; - ++itp; - } -} - Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorManager *desc_manager,VertexInput *vi) { const int shader_count=shader_maps->GetCount(); @@ -83,7 +89,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * if(shader_count<1) return(nullptr); - PipelineLayoutData *pld=CreatePipelineLayoutData(desc_manager); + PipelineLayoutData *pld=CreatePipelineLayoutData(attr->device,desc_manager); if(!pld) { diff --git a/src/SceneGraph/Vulkan/VKPipelineLayoutData.cpp b/src/SceneGraph/Vulkan/VKPipelineLayoutData.cpp index 12a471a7..30122ad0 100644 --- a/src/SceneGraph/Vulkan/VKPipelineLayoutData.cpp +++ b/src/SceneGraph/Vulkan/VKPipelineLayoutData.cpp @@ -4,7 +4,7 @@ #include VK_NAMESPACE_BEGIN -PipelineLayoutData *GPUDevice::CreatePipelineLayoutData(const MaterialDescriptorManager *desc_manager) +PipelineLayoutData *CreatePipelineLayoutData(VkDevice device,const MaterialDescriptorManager *desc_manager) { PipelineLayoutData *pld=hgl_zero_new(); @@ -18,9 +18,9 @@ PipelineLayoutData *GPUDevice::CreatePipelineLayoutData(const MaterialDescriptor continue; if(pld->layouts[i]) - vkDestroyDescriptorSetLayout(attr->device,pld->layouts[i],nullptr); + vkDestroyDescriptorSetLayout(device,pld->layouts[i],nullptr); - if(vkCreateDescriptorSetLayout(attr->device,dslci,nullptr,pld->layouts+i)!=VK_SUCCESS) + if(vkCreateDescriptorSetLayout(device,dslci,nullptr,pld->layouts+i)!=VK_SUCCESS) { delete pld; return(nullptr); @@ -56,9 +56,9 @@ PipelineLayoutData *GPUDevice::CreatePipelineLayoutData(const MaterialDescriptor pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;//1; pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;//&push_constant_range; - pld->device=attr->device; + pld->device=device; - if(vkCreatePipelineLayout(attr->device,&pPipelineLayoutCreateInfo,nullptr,&(pld->pipeline_layout))!=VK_SUCCESS) + if(vkCreatePipelineLayout(device,&pPipelineLayoutCreateInfo,nullptr,&(pld->pipeline_layout))!=VK_SUCCESS) { delete pld; return(nullptr); diff --git a/src/ShaderGen/2d/PureColor2D.cpp b/src/ShaderGen/2d/PureColor2D.cpp index 70f11521..de5070f9 100644 --- a/src/ShaderGen/2d/PureColor2D.cpp +++ b/src/ShaderGen/2d/PureColor2D.cpp @@ -35,16 +35,16 @@ void main() ~MaterialPureColor2D()=default; - bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { - if(!Std2DMaterial::CreateVertexShader(vsc)) + if(!Std2DMaterial::CustomVertexShader(vsc)) return(false); vsc->SetMain(vs_main); return(true); } - bool CreateFragmentShader(ShaderCreateInfoFragment *fsc) override + bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { fsc->AddOutput(VAT_VEC4,"Color"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。 @@ -52,7 +52,7 @@ void main() return(true); } - bool AfterCreateShader() override + bool EndCustomShader() override { mci->SetMaterialInstance( mi_codes, //材质实例glsl代码 mi_bytes, //材质实例数据大小 @@ -63,7 +63,7 @@ void main() };//class MaterialPureColor2D:public Std2DMaterial }//namespace -MaterialCreateInfo *CreatePureColor2D(const Material2DConfig *cfg) +MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *cfg) { MaterialPureColor2D mpc2d(cfg); diff --git a/src/ShaderGen/2d/Std2DMaterial.cpp b/src/ShaderGen/2d/Std2DMaterial.cpp index 6f2219c8..da62a488 100644 --- a/src/ShaderGen/2d/Std2DMaterial.cpp +++ b/src/ShaderGen/2d/Std2DMaterial.cpp @@ -1,18 +1,18 @@ #include"Std2DMaterial.h" #include -#include +#include #include #include"common/MFGetPosition.h" STD_MTL_NAMESPACE_BEGIN -Std2DMaterial::Std2DMaterial(const Material2DConfig *c) +Std2DMaterial::Std2DMaterial(const Material2DCreateConfig *c) { mci=new MaterialCreateInfo(c); cfg=c; } -bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc) +bool Std2DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc) { RANGE_CHECK_RETURN_FALSE(cfg->coordinate_system) @@ -39,25 +39,25 @@ bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc) MaterialCreateInfo *Std2DMaterial::Create() { - if(!BeforeCreateShader()) + if(!BeginCustomShader()) return(nullptr); if(mci->hasVertex()) - if(!CreateVertexShader(mci->GetVS())) + if(!CustomVertexShader(mci->GetVS())) return(nullptr); if(mci->hasGeometry()) - if(!CreateGeometryShader(mci->GetGS())) + if(!CustomGeometryShader(mci->GetGS())) return(nullptr); if(mci->hasFragment()) - if(!CreateFragmentShader(mci->GetFS())) + if(!CustomFragmentShader(mci->GetFS())) return(nullptr); - if(!AfterCreateShader()) + if(!EndCustomShader()) return(false); - if(!mci->CreateShader()) + if(!mci->CreateShader(cfg->dev_attr)) return(nullptr); return(mci); diff --git a/src/ShaderGen/2d/Std2DMaterial.h b/src/ShaderGen/2d/Std2DMaterial.h index 8246e962..5338fd58 100644 --- a/src/ShaderGen/2d/Std2DMaterial.h +++ b/src/ShaderGen/2d/Std2DMaterial.h @@ -6,6 +6,8 @@ namespace hgl { namespace graph { + struct GPUDeviceAttribute; + class ShaderCreateInfoVertex; class ShaderCreateInfoGeometry; class ShaderCreateInfoFragment; @@ -13,29 +15,29 @@ namespace hgl namespace mtl { class MaterialCreateInfo; - struct Material2DConfig; + struct Material2DCreateConfig; class Std2DMaterial { protected: - const Material2DConfig *cfg; + const Material2DCreateConfig *cfg; MaterialCreateInfo *mci; protected: - virtual bool BeforeCreateShader(){return true;/*some work before creating shader*/}; + virtual bool BeginCustomShader(){return true;/*some work before creating shader*/}; - virtual bool CreateVertexShader(ShaderCreateInfoVertex *); - virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;} - virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0; + virtual bool CustomVertexShader(ShaderCreateInfoVertex *); + virtual bool CustomGeometryShader(ShaderCreateInfoGeometry *){return false;} + virtual bool CustomFragmentShader(ShaderCreateInfoFragment *)=0; - virtual bool AfterCreateShader(){return true;/*some work after creating shader*/}; + virtual bool EndCustomShader(){return true;/*some work after creating shader*/}; public: - Std2DMaterial(const Material2DConfig *); + Std2DMaterial(const Material2DCreateConfig *); virtual ~Std2DMaterial()=default; virtual MaterialCreateInfo *Create(); diff --git a/src/ShaderGen/2d/VertexColor2D.cpp b/src/ShaderGen/2d/VertexColor2D.cpp index 1827b6b4..a327a05e 100644 --- a/src/ShaderGen/2d/VertexColor2D.cpp +++ b/src/ShaderGen/2d/VertexColor2D.cpp @@ -31,9 +31,9 @@ void main() using Std2DMaterial::Std2DMaterial; ~MaterialVertexColor2D()=default; - bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { - if(!Std2DMaterial::CreateVertexShader(vsc)) + if(!Std2DMaterial::CustomVertexShader(vsc)) return(false); vsc->AddInput(VAT_VEC4,VAN::Color); @@ -44,7 +44,7 @@ void main() return(true); } - bool CreateFragmentShader(ShaderCreateInfoFragment *fsc) override + bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { fsc->AddOutput(VAT_VEC4,"Color"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。 @@ -54,7 +54,7 @@ void main() };//class MaterialVertexColor2D:public Std2DMaterial }//namespace -MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *cfg) +MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *cfg) { MaterialVertexColor2D mvc2d(cfg); diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index 01d024c9..75c8b086 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -46,7 +46,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) SET(STD_MTL_2D_HEADER_PATH ${STD_MTL_HEADER_PATH}/2d) -SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/Material2DConfig.h +SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/Material2DCreateConfig.h 2d/Std2DMaterial.h 2d/Std2DMaterial.cpp 2d/VertexColor2D.cpp diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 22fb39c6..2e2073fe 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -1,13 +1,14 @@ #include #include #include +#include #include"common/MFCommon.h" using namespace hgl; using namespace hgl::graph; STD_MTL_NAMESPACE_BEGIN -MaterialCreateInfo::MaterialCreateInfo(const MaterialConfig *mc) +MaterialCreateInfo::MaterialCreateInfo(const MaterialCreateConfig *mc) { config=mc; @@ -140,7 +141,11 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const if(data_bytes>0) mi_codes=glsl_codes; + const uint32_t ubo_range=config->dev_attr->physical_device->GetUBORange(); + AnsiString MI_MAX_COUNT=AnsiString::numberOf(ubo_range/data_bytes); + mdi.AddStruct(MaterialInstanceStruct,mi_codes); + mdi.AddStruct(SBS_MaterialInstanceData); UBODescriptor *ubo=new UBODescriptor(); @@ -148,7 +153,6 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name); ubo->stage_flag=shader_stage; - mdi.AddStruct(SBS_MaterialInstanceData.struct_name,SBS_MaterialInstanceData.codes); mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo); auto *it=shader_map.GetDataList(); @@ -156,7 +160,10 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const for(int i=0;ikey&shader_stage) + { + (*it)->value->AddDefine("MI_MAX_COUNT",MI_MAX_COUNT); (*it)->value->SetMaterialInstance(ubo,mi_codes); + } ++it; } @@ -168,7 +175,7 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &glsl_codes,const return(true); } -bool MaterialCreateInfo::CreateShader() +bool MaterialCreateInfo::CreateShader(const GPUDeviceAttribute *dev_attr) { if(shader_map.IsEmpty()) return(false); @@ -182,12 +189,11 @@ bool MaterialCreateInfo::CreateShader() if(!shader_map.GetValue(i,sc)) return(false); - if(mi_shader_stage) - if(sc->GetShaderStage()AddOutput(VAT_UINT,VAN::MaterialInstanceID,Interpolation::Flat); - sc->AddFunction(mtl::func::HandoverMI); - } + if(sc->GetShaderStage()AddOutput(VAT_UINT,VAN::MaterialInstanceID,Interpolation::Flat); + sc->AddFunction(mtl::func::HandoverMI); + } sc->CreateShader(last); diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index f1779c80..13471800 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -12,6 +12,9 @@ ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorIn sdm=new ShaderDescriptorInfo(ss); spv_data=nullptr; + + define_macro_max_length=0; + define_value_max_length=0; } ShaderCreateInfo::~ShaderCreateInfo() @@ -22,6 +25,70 @@ ShaderCreateInfo::~ShaderCreateInfo() delete sdm; } +bool ShaderCreateInfo::AddDefine(const AnsiString &m,const AnsiString &v) +{ + if(define_macro_list.Find(m)!=-1) + return(false); + + define_macro_list.Add(m); + define_value_list.Add(v); + + if(m.Length()>define_macro_max_length) + define_macro_max_length=m.Length(); + + if(v.Length()>define_value_max_length) + define_value_max_length=v.Length(); + + return(true); +} + +bool ShaderCreateInfo::ProcDefine() +{ + const uint count=define_macro_list.GetCount(); + + if(count<=0)return(true); + + final_shader+="\n"; + + constexpr const char GLSL_DEFINE_FRONT[]="#define "; + constexpr const uint GLSL_DEFINE_FRONT_LENGTH=sizeof(GLSL_DEFINE_FRONT)-1; + + const uint32_t total_length=GLSL_DEFINE_FRONT_LENGTH+define_macro_max_length+define_value_max_length+3; + + char *tmp=new char[total_length]; + + memcpy(tmp,GLSL_DEFINE_FRONT,GLSL_DEFINE_FRONT_LENGTH); + + uint macro_length; + uint value_length; + + AnsiString m; + AnsiString v; + + for(uint i=0;iGetStruct(*str,codes)) return(false); - final_shader+="struct "; + final_shader+="\nstruct "; final_shader+=*str; final_shader+="\n{"; final_shader+=codes; - final_shader+="};\n\n"; + final_shader+="};\n"; } return(true); @@ -174,7 +239,7 @@ bool ShaderCreateInfo::ProcMI() if(mi_codes.IsEmpty()) return(true); - final_shader+="struct MaterialInstance\n{\n"; + final_shader+="\nstruct MaterialInstance\n{\n"; final_shader+=mi_codes; final_shader+="\n};\n"; return(true); @@ -188,6 +253,8 @@ bool ShaderCreateInfo::ProcUBO() if(count<=0)return(true); + final_shader+="\n"; + auto ubo=ubo_list.GetData(); AnsiString struct_codes; @@ -214,7 +281,6 @@ bool ShaderCreateInfo::ProcUBO() ++ubo; } - final_shader+="\n"; return(true); } @@ -231,6 +297,8 @@ bool ShaderCreateInfo::ProcConst() if(count<=0)return(true); + final_shader+="\n"; + auto const_data=const_list.GetData(); for(int i=0;i