1.removed VertexShaderModule

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

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,12 +145,17 @@ 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;
}
}
}
@@ -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