1.removed VertexShaderModule
2.added VertexInput at MaterialData 3.newly CreateShaderModule/CreateMaterial functions at GPUDevice/RenderResource class.
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user