2019-04-27 21:23:57 +08:00
|
|
|
|
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
|
|
|
|
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
|
|
|
|
|
|
|
|
|
#include"VK.h"
|
|
|
|
|
#include<hgl/type/BaseString.h>
|
|
|
|
|
#include<hgl/type/Map.h>
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2019-04-27 21:23:57 +08:00
|
|
|
|
VK_NAMESPACE_BEGIN
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
|
|
|
|
using ShaderBindingList=List<uint32_t>; ///<shader<65><EFBFBD><F3B6A8B5>б<EFBFBD>
|
|
|
|
|
|
|
|
|
|
class ShaderParse;
|
|
|
|
|
|
2019-04-27 21:23:57 +08:00
|
|
|
|
/**
|
|
|
|
|
* Shaderģ<EFBFBD><EFBFBD><br>
|
|
|
|
|
* <EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD>shader<EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD><EFBFBD>ģ<EFBFBD>ֻ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ShaderModuleManage<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
class ShaderModule
|
|
|
|
|
{
|
|
|
|
|
int shader_id;
|
|
|
|
|
|
|
|
|
|
int ref_count;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
VkPipelineShaderStageCreateInfo *stage_create_info;
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
Map<UTF8String,int> ubo_map;
|
|
|
|
|
ShaderBindingList ubo_list;
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
protected:
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
void ParseUBO(const ShaderParse *);
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
|
|
|
|
public:
|
2019-05-05 14:22:58 +08:00
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
ShaderModule(int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *);
|
|
|
|
|
virtual ~ShaderModule();
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
|
|
|
|
const int GetID()const{return shader_id;}
|
|
|
|
|
|
|
|
|
|
const int IncRef(){return ++ref_count;}
|
|
|
|
|
const int DecRef(){return --ref_count;}
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
const VkShaderStageFlagBits GetStage ()const{return stage_create_info->stage;}
|
|
|
|
|
const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;}
|
|
|
|
|
|
|
|
|
|
const int GetUBO (const UTF8String &name)const
|
|
|
|
|
{
|
|
|
|
|
int binding;
|
2019-05-05 14:22:58 +08:00
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
if(ubo_map.Get(name,binding))
|
2019-04-27 21:23:57 +08:00
|
|
|
|
return binding;
|
2019-05-05 14:22:58 +08:00
|
|
|
|
else
|
2019-04-27 21:23:57 +08:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
const ShaderBindingList & GetUBOBindingList()const{return ubo_list;} ///<ȡ<><C8A1>UBO<42><EFBFBD><F3B6A8B5>б<EFBFBD>
|
|
|
|
|
};//class ShaderModule
|
|
|
|
|
|
|
|
|
|
class VertexAttributeBinding;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Shaderģ<EFBFBD><EFBFBD><br>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>shader<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>shader<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VertexInput<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
class VertexShaderModule:public ShaderModule
|
|
|
|
|
{
|
|
|
|
|
uint32_t attr_count;
|
|
|
|
|
VkVertexInputBindingDescription *binding_list;
|
|
|
|
|
VkVertexInputAttributeDescription *attribute_list;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
Map<UTF8String,VkVertexInputAttributeDescription *> stage_input_locations;
|
|
|
|
|
|
|
|
|
|
Set<VertexAttributeBinding *> vab_sets;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
void ParseVertexInput(const ShaderParse *);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
VertexShaderModule(int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(id,pssci,parse)
|
|
|
|
|
{
|
|
|
|
|
ParseVertexInput(parse);
|
|
|
|
|
}
|
|
|
|
|
virtual ~VertexShaderModule();
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
|
|
|
|
const int GetLocation (const UTF8String &)const;
|
|
|
|
|
const int GetBinding (const UTF8String &)const;
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
const uint32_t GetAttrCount()const{return attr_count;}
|
|
|
|
|
|
2019-04-27 21:23:57 +08:00
|
|
|
|
const VkVertexInputBindingDescription * GetDescList ()const{return binding_list;}
|
|
|
|
|
const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;}
|
|
|
|
|
|
|
|
|
|
const VkVertexInputBindingDescription * GetDesc (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);}
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
VertexAttributeBinding * CreateVertexAttributeBinding();
|
|
|
|
|
bool Release(VertexAttributeBinding *);
|
|
|
|
|
const uint32_t GetInstanceCount()const{return vab_sets.GetCount();}
|
|
|
|
|
};//class VertexShaderModule:public ShaderModule
|
2019-04-27 21:23:57 +08:00
|
|
|
|
VK_NAMESPACE_END
|
|
|
|
|
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|