改进Shader中的资源管理,改为一次注册所有数据
This commit is contained in:
parent
bd59374f25
commit
1cebaa2714
@ -88,7 +88,7 @@ private:
|
|||||||
if(!ubo_mvp)
|
if(!ubo_mvp)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
return desciptor_sets->UpdateUBO(material->GetUBOBinding("world"),*ubo_mvp);
|
return desciptor_sets->UpdateUBO(material->GetUBO("world"),*ubo_mvp); //material中这里可以改成不区分类型,返回的值包含类型和ID,这样descriptor_sets->Update也不再需要类型
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitVBO()
|
void InitVBO()
|
||||||
|
@ -37,9 +37,24 @@ public:
|
|||||||
Material(Device *dev,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc);
|
Material(Device *dev,ShaderModuleMap *smm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc);
|
||||||
~Material();
|
~Material();
|
||||||
|
|
||||||
const int GetUBOBinding(const UTF8String &)const;
|
const int GetBinding(VkDescriptorType,const UTF8String &)const;
|
||||||
// const int GetSSBOBinding(const UTF8String &)const;
|
|
||||||
// const int GetINBOBinding(const UTF8String &)const;
|
#define GET_BO_BINDING(name,vk_name) const int Get##name(const UTF8String &obj_name)const{return GetBinding(VK_DESCRIPTOR_TYPE_##vk_name,obj_name);}
|
||||||
|
GET_BO_BINDING(Sampler, SAMPLER)
|
||||||
|
|
||||||
|
GET_BO_BINDING(CombindImageSampler, COMBINED_IMAGE_SAMPLER)
|
||||||
|
GET_BO_BINDING(SampledImage, SAMPLED_IMAGE)
|
||||||
|
GET_BO_BINDING(StorageImage, STORAGE_IMAGE)
|
||||||
|
|
||||||
|
GET_BO_BINDING(UTBO, UNIFORM_TEXEL_BUFFER)
|
||||||
|
GET_BO_BINDING(SSTBO, STORAGE_TEXEL_BUFFER)
|
||||||
|
GET_BO_BINDING(UBO, UNIFORM_BUFFER)
|
||||||
|
GET_BO_BINDING(SSBO, STORAGE_BUFFER)
|
||||||
|
GET_BO_BINDING(UBODynamic, UNIFORM_BUFFER_DYNAMIC)
|
||||||
|
GET_BO_BINDING(SSBODynamic, STORAGE_BUFFER_DYNAMIC)
|
||||||
|
|
||||||
|
GET_BO_BINDING(InputAttachment, INPUT_ATTACHMENT)
|
||||||
|
#undef GET_BO_BINDING
|
||||||
|
|
||||||
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
||||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
||||||
|
@ -1,14 +1,9 @@
|
|||||||
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||||
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
|
||||||
|
|
||||||
#include"VK.h"
|
#include<hgl/graph/vulkan/VKShaderResource.h>
|
||||||
#include<hgl/type/BaseString.h>
|
|
||||||
#include<hgl/type/Map.h>
|
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
|
|
||||||
using ShaderBindingList=List<uint32_t>; ///<shader绑定点列表
|
|
||||||
|
|
||||||
class ShaderParse;
|
class ShaderParse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -25,12 +20,7 @@ private:
|
|||||||
|
|
||||||
VkPipelineShaderStageCreateInfo *stage_create_info;
|
VkPipelineShaderStageCreateInfo *stage_create_info;
|
||||||
|
|
||||||
Map<UTF8String,int> ubo_map;
|
ShaderResource resource;
|
||||||
ShaderBindingList ubo_list;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
void ParseUBO(const ShaderParse *);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -47,17 +37,11 @@ public:
|
|||||||
const VkShaderStageFlagBits GetStage ()const{return stage_create_info->stage;}
|
const VkShaderStageFlagBits GetStage ()const{return stage_create_info->stage;}
|
||||||
const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;}
|
const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;}
|
||||||
|
|
||||||
const int GetUBO (const UTF8String &name)const
|
const ShaderResource & GetResource ()const{return resource;}
|
||||||
|
const int GetBinding (VkDescriptorType desc_type,const UTF8String &name)const
|
||||||
{
|
{
|
||||||
int binding;
|
return resource[desc_type].GetBinding(name);
|
||||||
|
|
||||||
if(ubo_map.Get(name,binding))
|
|
||||||
return binding;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ShaderBindingList & GetUBOBindingList()const{return ubo_list;} ///<取得UBO绑定点列表
|
|
||||||
};//class ShaderModule
|
};//class ShaderModule
|
||||||
|
|
||||||
class VertexAttributeBinding;
|
class VertexAttributeBinding;
|
||||||
|
29
inc/hgl/graph/vulkan/VKShaderResource.h
Normal file
29
inc/hgl/graph/vulkan/VKShaderResource.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
||||||
|
#define HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
||||||
|
|
||||||
|
#include<hgl/graph/vulkan/VK.h>
|
||||||
|
#include<hgl/type/BaseString.h>
|
||||||
|
#include<hgl/type/Map.h>
|
||||||
|
|
||||||
|
VK_NAMESPACE_BEGIN
|
||||||
|
struct ShaderResourceList
|
||||||
|
{
|
||||||
|
Map<UTF8String,int> binding_by_name; ///<名字索引
|
||||||
|
List<uint32_t> binding_list; ///<资源binding列表
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
const int GetBinding(const UTF8String &name)const
|
||||||
|
{
|
||||||
|
int binding;
|
||||||
|
|
||||||
|
if(binding_by_name.Get(name,binding))
|
||||||
|
return binding;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};//struct ShaderResource
|
||||||
|
|
||||||
|
using ShaderResource=ShaderResourceList[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||||
|
VK_NAMESPACE_END
|
||||||
|
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
|
@ -17,6 +17,7 @@
|
|||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderable.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderable.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderPass.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderPass.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSemaphore.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSemaphore.h
|
||||||
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderResource.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModule.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModule.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModuleManage.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModuleManage.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSurfaceExtensionName.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSurfaceExtensionName.h
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include<hgl/graph/vulkan/VK.h>
|
#include<hgl/graph/vulkan/VKShaderResource.h>
|
||||||
#include<hgl/type/Map.h>
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
class Device;
|
class Device;
|
||||||
class DescriptorSets;
|
class DescriptorSets;
|
||||||
@ -26,27 +25,33 @@ public:
|
|||||||
|
|
||||||
void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits);
|
void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits);
|
||||||
void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage);
|
void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage);
|
||||||
|
void Bind(const ShaderResourceList &srl,VkDescriptorType type,VkShaderStageFlagBits stage){Bind(srl.binding_list.GetData(),srl.binding_list.GetCount(),type,stage);}
|
||||||
|
void Bind(const ShaderResource &sr,VkShaderStageFlagBits stage)
|
||||||
|
{
|
||||||
|
for(uint32_t i=VK_DESCRIPTOR_TYPE_BEGIN_RANGE;i<=VK_DESCRIPTOR_TYPE_END_RANGE;i++)
|
||||||
|
Bind(sr[i],(VkDescriptorType)i,stage);
|
||||||
|
}
|
||||||
|
|
||||||
#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \
|
//
|
||||||
void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);}
|
//#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \
|
||||||
|
// void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);}
|
||||||
DESC_SET_BIND_FUNC(Sampler, SAMPLER);
|
//
|
||||||
DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER);
|
// DESC_SET_BIND_FUNC(Sampler, SAMPLER);
|
||||||
DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER);
|
//
|
||||||
|
// DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER);
|
||||||
DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER);
|
// DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE);
|
||||||
DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE);
|
// DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE);
|
||||||
DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE);
|
//
|
||||||
DESC_SET_BIND_FUNC(UniformTexelBuffer, UNIFORM_TEXEL_BUFFER);
|
// DESC_SET_BIND_FUNC(UTBO, UNIFORM_TEXEL_BUFFER);
|
||||||
DESC_SET_BIND_FUNC(StorageTexelBuffer, STORAGE_TEXEL_BUFFER);
|
// DESC_SET_BIND_FUNC(SSTBO, STORAGE_TEXEL_BUFFER);
|
||||||
|
// DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER);
|
||||||
|
// DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER);
|
||||||
DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC);
|
// DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC);
|
||||||
DESC_SET_BIND_FUNC(SBODynamic, STORAGE_BUFFER_DYNAMIC);
|
// DESC_SET_BIND_FUNC(SSBODynamic, STORAGE_BUFFER_DYNAMIC);
|
||||||
|
//
|
||||||
DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT);
|
// DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT);
|
||||||
|
//
|
||||||
#undef DESC_SET_BIND_FUNC
|
//#undef DESC_SET_BIND_FUNC
|
||||||
|
|
||||||
bool CreatePipelineLayout();
|
bool CreatePipelineLayout();
|
||||||
|
|
||||||
|
@ -34,11 +34,7 @@ Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps)
|
|||||||
sm=(*itp)->right;
|
sm=(*itp)->right;
|
||||||
memcpy(p,sm->GetCreateInfo(),sizeof(VkPipelineShaderStageCreateInfo));
|
memcpy(p,sm->GetCreateInfo(),sizeof(VkPipelineShaderStageCreateInfo));
|
||||||
|
|
||||||
{
|
dsl_creater->Bind(sm->GetResource(),sm->GetStage());
|
||||||
const ShaderBindingList &ubo_list=sm->GetUBOBindingList();
|
|
||||||
|
|
||||||
dsl_creater->BindUBO(ubo_list.GetData(),ubo_list.GetCount(),sm->GetStage());
|
|
||||||
}
|
|
||||||
|
|
||||||
++p;
|
++p;
|
||||||
++itp;
|
++itp;
|
||||||
@ -78,9 +74,14 @@ Material::~Material()
|
|||||||
delete shader_maps;
|
delete shader_maps;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int Material::GetUBOBinding(const UTF8String &name)const
|
const int Material::GetBinding(VkDescriptorType desc_type,const UTF8String &name)const
|
||||||
{
|
{
|
||||||
int result;
|
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
|
||||||
|
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE
|
||||||
|
||name.IsEmpty())
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
int binding;
|
||||||
const int shader_count=shader_maps->GetCount();
|
const int shader_count=shader_maps->GetCount();
|
||||||
|
|
||||||
const ShaderModule *sm;
|
const ShaderModule *sm;
|
||||||
@ -88,9 +89,9 @@ const int Material::GetUBOBinding(const UTF8String &name)const
|
|||||||
for(int i=0;i<shader_count;i++)
|
for(int i=0;i<shader_count;i++)
|
||||||
{
|
{
|
||||||
sm=(*itp)->right;
|
sm=(*itp)->right;
|
||||||
result=sm->GetUBO(name);
|
binding=sm->GetBinding(desc_type,name);
|
||||||
if(result!=-1)
|
if(binding!=-1)
|
||||||
return result;
|
return binding;
|
||||||
|
|
||||||
++itp;
|
++itp;
|
||||||
}
|
}
|
||||||
@ -98,14 +99,6 @@ const int Material::GetUBOBinding(const UTF8String &name)const
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//const int Material::GetSSBOBinding(const UTF8String &name)const
|
|
||||||
//{
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//const int Material::GetINBOBinding(const UTF8String &name)const
|
|
||||||
//{
|
|
||||||
//}
|
|
||||||
|
|
||||||
const VkPipelineLayout Material::GetPipelineLayout()const
|
const VkPipelineLayout Material::GetPipelineLayout()const
|
||||||
{
|
{
|
||||||
return dsl_creater->GetPipelineLayout();
|
return dsl_creater->GetPipelineLayout();
|
||||||
|
@ -3,6 +3,21 @@
|
|||||||
#include"VKShaderParse.h"
|
#include"VKShaderParse.h"
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
void EnumShaderResource(const ShaderParse *parse,ShaderResourceList &sr,const spirv_cross::SmallVector<spirv_cross::Resource> &res)
|
||||||
|
{
|
||||||
|
for(const auto &obj:res)
|
||||||
|
{
|
||||||
|
const UTF8String & name =parse->GetName(obj);
|
||||||
|
const uint binding =parse->GetBinding(obj);
|
||||||
|
|
||||||
|
sr.binding_by_name.Add(name,binding);
|
||||||
|
sr.binding_list.Add(binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//namespace
|
||||||
|
|
||||||
ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *sci,const ShaderParse *sp)
|
ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *sci,const ShaderParse *sp)
|
||||||
{
|
{
|
||||||
device=dev;
|
device=dev;
|
||||||
@ -11,7 +26,9 @@ ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *
|
|||||||
|
|
||||||
stage_create_info=sci;
|
stage_create_info=sci;
|
||||||
|
|
||||||
ParseUBO(sp);
|
EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER],sp->GetUBO());
|
||||||
|
EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER],sp->GetSSBO());
|
||||||
|
// EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_SAMPLER],sp->GetSampler());
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderModule::~ShaderModule()
|
ShaderModule::~ShaderModule()
|
||||||
@ -20,21 +37,9 @@ ShaderModule::~ShaderModule()
|
|||||||
delete stage_create_info;
|
delete stage_create_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderModule::ParseUBO(const ShaderParse *parse)
|
|
||||||
{
|
|
||||||
for(const auto &ubo:parse->GetUBO())
|
|
||||||
{
|
|
||||||
const UTF8String & name =parse->GetName(ubo);
|
|
||||||
const uint binding =parse->GetBinding(ubo);
|
|
||||||
|
|
||||||
ubo_map.Add(name,binding);
|
|
||||||
ubo_list.Add(binding);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VertexShaderModule::VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(dev,id,pssci,parse)
|
VertexShaderModule::VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(dev,id,pssci,parse)
|
||||||
{
|
{
|
||||||
const auto &stage_inputs=parse->GetStageInput();
|
const auto &stage_inputs=parse->GetStageInputs();
|
||||||
|
|
||||||
attr_count=(uint32_t)stage_inputs.size();
|
attr_count=(uint32_t)stage_inputs.size();
|
||||||
binding_list=new VkVertexInputBindingDescription[attr_count];
|
binding_list=new VkVertexInputBindingDescription[attr_count];
|
||||||
|
@ -25,8 +25,23 @@ public:
|
|||||||
delete compiler;
|
delete compiler;
|
||||||
}
|
}
|
||||||
|
|
||||||
const spirv_cross::SmallVector<spirv_cross::Resource> &GetUBO()const{return resource.uniform_buffers;}
|
#define SHADER_PARSE_GET_RESOURCE(name,buf_name) const spirv_cross::SmallVector<spirv_cross::Resource> &Get##name()const{return resource.buf_name;}
|
||||||
const spirv_cross::SmallVector<spirv_cross::Resource> &GetStageInput()const{return resource.stage_inputs;}
|
|
||||||
|
SHADER_PARSE_GET_RESOURCE(UBO, uniform_buffers)
|
||||||
|
SHADER_PARSE_GET_RESOURCE(SSBO, storage_buffers)
|
||||||
|
SHADER_PARSE_GET_RESOURCE(StageInputs, stage_inputs)
|
||||||
|
SHADER_PARSE_GET_RESOURCE(StageOutputs, stage_outputs)
|
||||||
|
|
||||||
|
//SmallVector<Resource> subpass_inputs;
|
||||||
|
//SmallVector<Resource> storage_images;
|
||||||
|
//SmallVector<Resource> sampled_images;
|
||||||
|
//SmallVector<Resource> atomic_counters;
|
||||||
|
//SmallVector<Resource> acceleration_structures;
|
||||||
|
//SmallVector<Resource> push_constant_buffers;
|
||||||
|
//SmallVector<Resource> separate_images;
|
||||||
|
//SmallVector<Resource> separate_samplers;
|
||||||
|
|
||||||
|
#undef SHADER_PARSE_GET_RESOURCE
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user