ULRE/inc/hgl/graph/shader/ShaderResource.h

77 lines
2.5 KiB
C
Raw Normal View History

2020-06-06 19:45:38 +08:00
#pragma once
#include<hgl/type/BaseString.h>
2020-06-08 19:12:29 +08:00
#include<hgl/type/List.h>
2020-06-09 19:40:08 +08:00
#include<hgl/type/StringList.h>
#include<hgl/graph/vulkan/VKNamespace.h>
2020-06-06 19:45:38 +08:00
2020-06-09 19:40:08 +08:00
VK_NAMESPACE_BEGIN
struct ShaderStage
2020-06-06 19:45:38 +08:00
{
2020-06-09 19:40:08 +08:00
UTF8String name;
uint location;
VkFormat format;
};//struct ShaderStage
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
using ShaderStageList=ObjectList<ShaderStage>;
using ShaderBindingList=List<uint32_t>;
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
struct ShaderDescriptorList
{
UTF8StringList name_list;
ShaderBindingList binding_list;
};
class ShaderResource
{
const void *data;
VkShaderStageFlagBits stage_flag;
const void *spv_data;
uint32 spv_size;
ShaderStageList stage_inputs;
ShaderStageList stage_outputs;
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
public:
ShaderResource(const void *,const VkShaderStageFlagBits &,const void *,const uint32);
virtual ~ShaderResource();
const VkShaderStageFlagBits GetStage()const{return stage_flag;}
const uint32_t *GetCode ()const{return (uint32_t *)spv_data;}
const uint32_t GetCodeSize ()const{return spv_size;}
ShaderStageList &GetStageInputs(){return stage_inputs;}
ShaderStageList &GetStageOutputs(){return stage_outputs;}
const int GetStageInputBinding(const UTF8String &);
const ShaderDescriptorList *GetDescriptorList()const{return descriptor_list;}
ShaderDescriptorList *GetDescriptorList(VkDescriptorType desc_type)
2020-06-06 19:45:38 +08:00
{
2020-06-09 19:40:08 +08:00
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
return descriptor_list+desc_type;
}
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
ShaderDescriptorList &GetUBO(){return descriptor_list[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER];}
ShaderDescriptorList &GetSSBO(){return descriptor_list[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER];}
ShaderDescriptorList &GetSampler(){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
const int GetBinding (VkDescriptorType desc_type,const UTF8String &name)const;
const ShaderBindingList * GetBindingList (VkDescriptorType desc_type)const
{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
2020-06-08 19:12:29 +08:00
2020-06-09 19:40:08 +08:00
return &(descriptor_list[desc_type].binding_list);
}
};//class ShaderResource
2020-06-06 19:45:38 +08:00
2020-06-09 19:40:08 +08:00
ShaderResource *LoadShaderResoruce(const OSString &filename);
VK_NAMESPACE_END