ULRE/inc/hgl/graph/vulkan/VKShaderModule.h

105 lines
3.2 KiB
C
Raw Normal View History

#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>
VK_NAMESPACE_BEGIN
using ShaderBindingList=List<uint32_t>; ///<shader<65>󶨵<EFBFBD><F3B6A8B5>б<EFBFBD>
class ShaderParse;
/**
* 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
{
VkDevice device;
int shader_id;
int ref_count;
private:
VkPipelineShaderStageCreateInfo *stage_create_info;
Map<UTF8String,int> ubo_map;
ShaderBindingList ubo_list;
protected:
void ParseUBO(const ShaderParse *);
public:
ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *);
virtual ~ShaderModule();
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;
if(ubo_map.Get(name,binding))
return binding;
else
return -1;
}
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;
public:
VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse);
virtual ~VertexShaderModule();
const int GetLocation (const UTF8String &)const;
const int GetBinding (const UTF8String &)const;
const uint32_t GetAttrCount()const{return attr_count;}
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);}
public:
VertexAttributeBinding * CreateVertexAttributeBinding();
bool Release(VertexAttributeBinding *);
const uint32_t GetInstanceCount()const{return vab_sets.GetCount();}
};//class VertexShaderModule:public ShaderModule
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE