2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VKMaterial.h>
|
|
|
|
|
#include<hgl/graph/VKDevice.h>
|
|
|
|
|
#include<hgl/graph/VKDescriptorSets.h>
|
|
|
|
|
#include<hgl/graph/VKShaderModule.h>
|
|
|
|
|
#include<hgl/graph/VKShaderModuleMap.h>
|
|
|
|
|
#include<hgl/graph/VKVertexAttributeBinding.h>
|
|
|
|
|
#include<hgl/graph/VKBuffer.h>
|
2019-05-05 21:30:55 +08:00
|
|
|
|
#include"VKDescriptorSetLayoutCreater.h"
|
2019-04-25 10:09:56 +08:00
|
|
|
|
VK_NAMESPACE_BEGIN
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Material *GPUDevice::CreateMaterial(ShaderModuleMap *shader_maps)
|
2019-04-27 02:07:06 +08:00
|
|
|
|
{
|
2019-04-28 16:06:53 +08:00
|
|
|
|
const int shader_count=shader_maps->GetCount();
|
|
|
|
|
|
2019-05-05 21:30:55 +08:00
|
|
|
|
if(shader_count<2)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
2020-09-05 17:53:48 +08:00
|
|
|
|
const ShaderModule *sm;
|
2019-05-05 21:30:55 +08:00
|
|
|
|
|
2020-09-05 17:53:48 +08:00
|
|
|
|
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
2019-05-05 21:30:55 +08:00
|
|
|
|
return(nullptr);
|
|
|
|
|
|
2020-09-19 23:49:32 +08:00
|
|
|
|
DescriptorSetLayoutCreater *dsl_creater=CreateDescriptorSetLayoutCreater();
|
2019-04-28 21:25:52 +08:00
|
|
|
|
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
2019-05-05 14:22:58 +08:00
|
|
|
|
|
2019-04-28 21:25:52 +08:00
|
|
|
|
shader_stage_list->SetCount(shader_count);
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2019-04-28 21:25:52 +08:00
|
|
|
|
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
auto **itp=shader_maps->GetDataList();
|
|
|
|
|
for(int i=0;i<shader_count;i++)
|
|
|
|
|
{
|
2020-09-05 17:53:48 +08:00
|
|
|
|
sm=(*itp)->right;
|
2020-09-19 18:36:05 +08:00
|
|
|
|
hgl_cpy(p,sm->GetCreateInfo());
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2020-09-05 17:53:48 +08:00
|
|
|
|
dsl_creater->Bind(sm->GetDescriptorList(),sm->GetStage());
|
2019-04-28 21:25:52 +08:00
|
|
|
|
|
2019-05-05 21:30:55 +08:00
|
|
|
|
++p;
|
|
|
|
|
++itp;
|
2019-04-28 21:25:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-09-05 17:53:48 +08:00
|
|
|
|
if(!dsl_creater->CreatePipelineLayout())
|
|
|
|
|
{
|
2020-09-07 20:08:19 +08:00
|
|
|
|
delete shader_stage_list;
|
|
|
|
|
delete dsl_creater;
|
2020-09-05 17:53:48 +08:00
|
|
|
|
delete shader_maps;
|
|
|
|
|
return(nullptr);
|
|
|
|
|
}
|
2019-05-05 21:30:55 +08:00
|
|
|
|
|
2020-09-19 23:49:32 +08:00
|
|
|
|
return(new Material(shader_maps,shader_stage_list,dsl_creater));
|
2019-04-28 21:25:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Material *GPUDevice::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)
|
2020-09-19 23:49:32 +08:00
|
|
|
|
{
|
|
|
|
|
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(smm);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Material *GPUDevice::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)
|
2020-09-19 23:49:32 +08:00
|
|
|
|
{
|
|
|
|
|
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(smm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Material::Material(ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc)
|
2019-04-28 21:25:52 +08:00
|
|
|
|
{
|
|
|
|
|
shader_maps=smm;
|
|
|
|
|
shader_stage_list=psci_list;
|
|
|
|
|
dsl_creater=dslc;
|
2019-05-05 21:30:55 +08:00
|
|
|
|
|
|
|
|
|
const ShaderModule *sm;
|
|
|
|
|
if(smm->Get(VK_SHADER_STAGE_VERTEX_BIT,sm))
|
|
|
|
|
{
|
|
|
|
|
vertex_sm=(VertexShaderModule *)sm;
|
|
|
|
|
vab=vertex_sm->CreateVertexAttributeBinding();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//理论上不可能到达这里,前面CreateMaterial已经检测过了
|
|
|
|
|
vertex_sm=nullptr;
|
|
|
|
|
vab=nullptr;
|
|
|
|
|
}
|
2019-04-27 02:07:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-04-25 10:09:56 +08:00
|
|
|
|
Material::~Material()
|
|
|
|
|
{
|
2019-04-27 02:07:06 +08:00
|
|
|
|
delete dsl_creater;
|
2019-05-24 23:51:45 +08:00
|
|
|
|
|
2020-09-05 17:53:48 +08:00
|
|
|
|
if(vab)
|
|
|
|
|
{
|
|
|
|
|
vertex_sm->Release(vab);
|
|
|
|
|
delete vab;
|
|
|
|
|
}
|
2019-05-24 23:51:45 +08:00
|
|
|
|
|
2019-04-28 21:25:52 +08:00
|
|
|
|
delete shader_stage_list;
|
2019-04-28 16:06:53 +08:00
|
|
|
|
delete shader_maps;
|
2019-04-25 10:09:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-07-07 19:16:23 +08:00
|
|
|
|
const int Material::GetBinding(VkDescriptorType desc_type,const AnsiString &name)const
|
2019-04-25 10:09:56 +08:00
|
|
|
|
{
|
2019-05-06 22:33:21 +08:00
|
|
|
|
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
|
|
|
|
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE
|
|
|
|
|
||name.IsEmpty())
|
|
|
|
|
return(-1);
|
|
|
|
|
|
|
|
|
|
int binding;
|
2019-04-28 16:06:53 +08:00
|
|
|
|
const int shader_count=shader_maps->GetCount();
|
|
|
|
|
|
|
|
|
|
const ShaderModule *sm;
|
|
|
|
|
auto **itp=shader_maps->GetDataList();
|
|
|
|
|
for(int i=0;i<shader_count;i++)
|
|
|
|
|
{
|
|
|
|
|
sm=(*itp)->right;
|
2019-05-06 22:33:21 +08:00
|
|
|
|
binding=sm->GetBinding(desc_type,name);
|
|
|
|
|
if(binding!=-1)
|
|
|
|
|
return binding;
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
|
|
|
|
++itp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(-1);
|
2019-04-27 01:36:58 +08:00
|
|
|
|
}
|
2019-04-26 21:43:22 +08:00
|
|
|
|
|
2019-05-05 18:00:26 +08:00
|
|
|
|
const VkPipelineLayout Material::GetPipelineLayout()const
|
|
|
|
|
{
|
2019-05-05 21:30:55 +08:00
|
|
|
|
return dsl_creater->GetPipelineLayout();
|
2019-04-28 16:06:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-05 21:30:55 +08:00
|
|
|
|
DescriptorSets *Material::CreateDescriptorSets()const
|
2019-04-27 01:36:58 +08:00
|
|
|
|
{
|
2019-05-05 21:30:55 +08:00
|
|
|
|
return dsl_creater->Create();
|
2019-04-25 10:09:56 +08:00
|
|
|
|
}
|
|
|
|
|
VK_NAMESPACE_END
|