1.removed VertexShaderModule
2.added VertexInput at MaterialData 3.newly CreateShaderModule/CreateMaterial functions at GPUDevice/RenderResource class.
This commit is contained in:
parent
42f63c5ef1
commit
facdec5556
@ -1 +1 @@
|
|||||||
Subproject commit f51a6a98d6268e93fe854a2c3a07e559778c3e54
|
Subproject commit 4a7af92ac66d55d1e6bf3d7e384ab92797e0559a
|
@ -6,6 +6,7 @@
|
|||||||
#include<hgl/math/HalfFloat.h>
|
#include<hgl/math/HalfFloat.h>
|
||||||
#include<hgl/filesystem/FileSystem.h>
|
#include<hgl/filesystem/FileSystem.h>
|
||||||
#include<hgl/graph/SceneInfo.h>
|
#include<hgl/graph/SceneInfo.h>
|
||||||
|
#include<hgl/graph/VKVertexInputConfig.h>
|
||||||
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
|
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
|
||||||
|
|
||||||
using namespace hgl;
|
using namespace hgl;
|
||||||
|
@ -75,7 +75,6 @@ struct ShaderAttribute;
|
|||||||
|
|
||||||
class ShaderResource;
|
class ShaderResource;
|
||||||
class ShaderModule;
|
class ShaderModule;
|
||||||
class VertexShaderModule;
|
|
||||||
class ShaderModuleMap;
|
class ShaderModuleMap;
|
||||||
class MaterialDescriptorSets;
|
class MaterialDescriptorSets;
|
||||||
|
|
||||||
@ -86,39 +85,9 @@ struct PipelineData;
|
|||||||
enum class InlinePipeline;
|
enum class InlinePipeline;
|
||||||
class Pipeline;
|
class Pipeline;
|
||||||
|
|
||||||
struct VAConfig
|
struct VAConfig;
|
||||||
{
|
class VILConfig;
|
||||||
VkFormat format;
|
class VertexInput;
|
||||||
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));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class VertexInputLayout;
|
class VertexInputLayout;
|
||||||
using VIL=VertexInputLayout;
|
using VIL=VertexInputLayout;
|
||||||
|
@ -224,11 +224,9 @@ public: //shader & material
|
|||||||
MaterialParameters *CreateMP(const MaterialDescriptorSets *,const PipelineLayoutData *,const DescriptorSetType &);
|
MaterialParameters *CreateMP(const MaterialDescriptorSets *,const PipelineLayoutData *,const DescriptorSetType &);
|
||||||
MaterialParameters *CreateMP(Material *,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,ShaderModuleMap *shader_maps,MaterialDescriptorSets *,VertexInput *);
|
||||||
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 *);
|
|
||||||
|
|
||||||
MaterialInstance *CreateMI(Material *,const VILConfig *vil_cfg=nullptr);
|
MaterialInstance *CreateMI(Material *,const VILConfig *vil_cfg=nullptr);
|
||||||
|
|
||||||
|
@ -15,10 +15,11 @@ struct MaterialData
|
|||||||
{
|
{
|
||||||
UTF8String name;
|
UTF8String name;
|
||||||
|
|
||||||
ShaderModuleMap *shader_maps;
|
VertexInput *vertex_input;
|
||||||
MaterialDescriptorSets *mds;
|
|
||||||
|
|
||||||
VertexShaderModule *vertex_sm;
|
ShaderModuleMap *shader_maps;
|
||||||
|
|
||||||
|
MaterialDescriptorSets *mds;
|
||||||
|
|
||||||
ShaderStageCreateInfoList shader_stage_list;
|
ShaderStageCreateInfoList shader_stage_list;
|
||||||
|
|
||||||
@ -54,7 +55,7 @@ public:
|
|||||||
|
|
||||||
const UTF8String & GetName ()const{return data->name;}
|
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;}
|
const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;}
|
||||||
|
|
||||||
@ -72,6 +73,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool hasSet (const DescriptorSetType &type)const;
|
const bool hasSet (const DescriptorSetType &type)const;
|
||||||
|
|
||||||
|
VIL * CreateVIL(const VILConfig *format_map=nullptr);
|
||||||
|
bool Release(VIL *);
|
||||||
|
const uint GetVILCount();
|
||||||
};//class Material
|
};//class Material
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|
||||||
|
@ -88,7 +88,7 @@ public: // VBO/VAO
|
|||||||
|
|
||||||
public: //Material
|
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 OSString &);
|
||||||
Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *);
|
Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *);
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||||
|
|
||||||
#include<hgl/graph/VK.h>
|
#include<hgl/graph/VK.h>
|
||||||
#include<hgl/graph/VKShaderResource.h>
|
|
||||||
#include<hgl/graph/VKVertexInputLayout.h>
|
#include<hgl/graph/VKVertexInputLayout.h>
|
||||||
#include<hgl/type/SortedSets.h>
|
#include<hgl/type/SortedSets.h>
|
||||||
|
|
||||||
@ -21,13 +20,9 @@ private:
|
|||||||
|
|
||||||
VkPipelineShaderStageCreateInfo *stage_create_info;
|
VkPipelineShaderStageCreateInfo *stage_create_info;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
ShaderResource *shader_resource;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *);
|
ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci);
|
||||||
virtual ~ShaderModule();
|
virtual ~ShaderModule();
|
||||||
|
|
||||||
const int IncRef(){return ++ref_count;}
|
const int IncRef(){return ++ref_count;}
|
||||||
@ -50,48 +45,5 @@ public:
|
|||||||
|
|
||||||
operator VkShaderModule ()const{return stage_create_info->module;}
|
operator VkShaderModule ()const{return stage_create_info->module;}
|
||||||
};//class ShaderModule
|
};//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/location,而是绑定顺序的序列号。对应vkCmdBindVertexBuffer的缓冲区序列号
|
|
||||||
*/
|
|
||||||
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
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||||
|
@ -38,16 +38,5 @@ public:
|
|||||||
const ShaderAttribute * GetInput (const AnsiString &)const;
|
const ShaderAttribute * GetInput (const AnsiString &)const;
|
||||||
const int GetInputBinding (const AnsiString &)const;
|
const int GetInputBinding (const AnsiString &)const;
|
||||||
};//class ShaderResource
|
};//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
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
||||||
|
@ -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();
|
const int shader_count=shader_maps->GetCount();
|
||||||
|
|
||||||
if(shader_count<2)
|
if(shader_count<1)
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *vsm;
|
|
||||||
|
|
||||||
if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,vsm))
|
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
PipelineLayoutData *pld=CreatePipelineLayoutData(mds);
|
PipelineLayoutData *pld=CreatePipelineLayoutData(mds);
|
||||||
@ -103,7 +98,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
|
|||||||
data->name =mtl_name;
|
data->name =mtl_name;
|
||||||
data->shader_maps =shader_maps;
|
data->shader_maps =shader_maps;
|
||||||
data->mds =mds;
|
data->mds =mds;
|
||||||
data->vertex_sm =(VertexShaderModule *)vsm;
|
data->vertex_input =vi;
|
||||||
|
|
||||||
CreateShaderStageList(data->shader_stage_list,shader_maps);
|
CreateShaderStageList(data->shader_stage_list,shader_maps);
|
||||||
|
|
||||||
@ -124,40 +119,4 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
|
|||||||
|
|
||||||
return(new Material(data));
|
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
|
VK_NAMESPACE_END
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include<hgl/graph/VKMaterial.h>
|
#include<hgl/graph/VKMaterial.h>
|
||||||
#include<hgl/graph/VKMaterialParameters.h>
|
#include<hgl/graph/VKMaterialParameters.h>
|
||||||
#include<hgl/graph/VKMaterialDescriptorSets.h>
|
#include<hgl/graph/VKMaterialDescriptorSets.h>
|
||||||
|
#include<hgl/graph/VKVertexInput.h>
|
||||||
#include"VKPipelineLayoutData.h"
|
#include"VKPipelineLayoutData.h"
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
MaterialData::~MaterialData()
|
MaterialData::~MaterialData()
|
||||||
@ -11,6 +12,8 @@ MaterialData::~MaterialData()
|
|||||||
|
|
||||||
delete shader_maps;
|
delete shader_maps;
|
||||||
SAFE_CLEAR(mds);
|
SAFE_CLEAR(mds);
|
||||||
|
|
||||||
|
delete vertex_input;
|
||||||
}
|
}
|
||||||
|
|
||||||
Material::~Material()
|
Material::~Material()
|
||||||
@ -28,4 +31,19 @@ const bool Material::hasSet(const DescriptorSetType &dst)const
|
|||||||
{
|
{
|
||||||
return data->mds->hasSet(dst);
|
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
|
VK_NAMESPACE_END
|
||||||
|
@ -8,9 +8,7 @@ MaterialInstance *GPUDevice::CreateMI(Material *mtl,const VILConfig *vil_cfg)
|
|||||||
{
|
{
|
||||||
if(!mtl)return(nullptr);
|
if(!mtl)return(nullptr);
|
||||||
|
|
||||||
VertexShaderModule *vsm=mtl->GetVertexShaderModule();
|
VIL *vil=mtl->CreateVIL(vil_cfg);
|
||||||
|
|
||||||
VIL *vil=vsm->CreateVIL(vil_cfg);
|
|
||||||
|
|
||||||
if(!vil)return(nullptr);
|
if(!vil)return(nullptr);
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include<hgl/graph/VKShaderModuleMap.h>
|
#include<hgl/graph/VKShaderModuleMap.h>
|
||||||
#include<hgl/graph/VKShaderResource.h>
|
#include<hgl/graph/VKShaderResource.h>
|
||||||
#include<hgl/graph/VKMaterialDescriptorSets.h>
|
#include<hgl/graph/VKMaterialDescriptorSets.h>
|
||||||
|
#include<hgl/graph/VKVertexInput.h>
|
||||||
#include<hgl/filesystem/FileSystem.h>
|
#include<hgl/filesystem/FileSystem.h>
|
||||||
#include<hgl/graph/VKRenderResource.h>
|
#include<hgl/graph/VKRenderResource.h>
|
||||||
#include<hgl/io/ConstBufferReader.h>
|
#include<hgl/io/ConstBufferReader.h>
|
||||||
@ -11,18 +12,19 @@
|
|||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
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(!device)return(nullptr);
|
||||||
if(filename.IsEmpty())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;
|
ShaderModule *sm;
|
||||||
|
|
||||||
if(shader_module_by_name.Get(filename,sm))
|
if(shader_module_by_name.Get(filename,sm))
|
||||||
return sm;
|
return sm;
|
||||||
|
|
||||||
sm=device->CreateShaderModule(shader_resource);
|
sm=device->CreateShaderModule(shader_stage,spv_data,spv_size);
|
||||||
|
|
||||||
shader_module_by_name.Add(filename,sm);
|
shader_module_by_name.Add(filename,sm);
|
||||||
|
|
||||||
@ -128,6 +130,7 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
|
|||||||
|
|
||||||
bool result=true;
|
bool result=true;
|
||||||
ShaderModuleMap *smm=new ShaderModuleMap;
|
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||||
|
VertexInput *vertex_input=nullptr;
|
||||||
|
|
||||||
OSString shader_name;
|
OSString shader_name;
|
||||||
|
|
||||||
@ -142,12 +145,17 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
|
|||||||
{
|
{
|
||||||
shader_name=filename+OS_TEXT("?")+ToOSString(sr->GetStageName());
|
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(sm)
|
||||||
{
|
{
|
||||||
if(smm->Add(sm))
|
if(smm->Add(sm))
|
||||||
|
{
|
||||||
|
if(sr->GetStage()==VK_SHADER_STAGE_VERTEX_BIT)
|
||||||
|
vertex_input=new VertexInput(sr->GetInputs());
|
||||||
|
|
||||||
continue;
|
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);
|
Add(mtl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3,135 +3,42 @@
|
|||||||
#include<hgl/graph/VKDevice.h>
|
#include<hgl/graph/VKDevice.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
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);
|
return(nullptr);
|
||||||
|
|
||||||
ShaderModule *sm;
|
return(new ShaderModule(attr->device,pss_ci));
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci,ShaderResource *sr)
|
ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci)
|
||||||
{
|
{
|
||||||
device=dev;
|
device=dev;
|
||||||
ref_count=0;
|
ref_count=0;
|
||||||
|
|
||||||
stage_create_info=sci;
|
stage_create_info=sci;
|
||||||
|
|
||||||
shader_resource=sr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderModule::~ShaderModule()
|
ShaderModule::~ShaderModule()
|
||||||
{
|
{
|
||||||
vkDestroyShaderModule(device,stage_create_info->module,nullptr);
|
vkDestroyShaderModule(device,stage_create_info->module,nullptr);
|
||||||
//这里不用删除stage_create_info,材质中会删除的
|
//这里不用删除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
|
VK_NAMESPACE_END
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include<hgl/graph/font/TileFont.h>
|
#include<hgl/graph/font/TileFont.h>
|
||||||
#include<hgl/graph/font/TextLayout.h>
|
#include<hgl/graph/font/TextLayout.h>
|
||||||
#include<hgl/graph/VKDevice.h>
|
#include<hgl/graph/VKDevice.h>
|
||||||
|
#include<hgl/graph/VKVertexInputConfig.h>
|
||||||
#include<hgl/color/Color.h>
|
#include<hgl/color/Color.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user