optimized ShaderModuleMapByName in RenderResource
This commit is contained in:
parent
e6560dfe5f
commit
5749d8ec8a
2
CMCore
2
CMCore
@ -1 +1 @@
|
|||||||
Subproject commit 72fcbb18ab3bbd8971777f62ee9fcb967ab25e9e
|
Subproject commit be17b06a2f243faffd55fc7bde6156c83d2c5a7a
|
@ -34,7 +34,7 @@ public:
|
|||||||
|
|
||||||
#define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;}
|
#define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;}
|
||||||
MP_TYPE_IS(Instance)
|
MP_TYPE_IS(Instance)
|
||||||
//MP_TYPE_IS(PerMaterial)
|
MP_TYPE_IS(PerMaterial)
|
||||||
MP_TYPE_IS(PerFrame)
|
MP_TYPE_IS(PerFrame)
|
||||||
MP_TYPE_IS(Global)
|
MP_TYPE_IS(Global)
|
||||||
#undef MP_TYPE_IS
|
#undef MP_TYPE_IS
|
||||||
|
@ -29,6 +29,9 @@ using TextureID =int;
|
|||||||
|
|
||||||
class VertexAttribData;
|
class VertexAttribData;
|
||||||
|
|
||||||
|
using ShaderModuleMapByName=ObjectMap<AnsiString,ShaderModule>;
|
||||||
|
constexpr const size_t VK_SHADER_STAGE_TYPE_COUNT=20;//GetBitOffset((uint32_t)VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI)+1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 资源管理,用于管理场景内所需的所有数据
|
* 资源管理,用于管理场景内所需的所有数据
|
||||||
*/
|
*/
|
||||||
@ -36,7 +39,7 @@ class RenderResource
|
|||||||
{
|
{
|
||||||
GPUDevice *device;
|
GPUDevice *device;
|
||||||
|
|
||||||
ObjectMap<AnsiString,ShaderModule> shader_module_by_name;
|
ShaderModuleMapByName shader_module_by_name[VK_SHADER_STAGE_TYPE_COUNT];
|
||||||
Map<AnsiString,Material *> material_by_name;
|
Map<AnsiString,Material *> material_by_name;
|
||||||
Map<OSString,Texture *> texture_by_name;
|
Map<OSString,Texture *> texture_by_name;
|
||||||
|
|
||||||
@ -95,7 +98,7 @@ public: // VBO/VAO
|
|||||||
|
|
||||||
public: //Material
|
public: //Material
|
||||||
|
|
||||||
const ShaderModule *CreateShaderModule(const AnsiString &shader_module_name,VkShaderStageFlagBits shader_stage,const uint32_t *spv_data,const size_t spv_size);
|
const ShaderModule *CreateShaderModule(const AnsiString &shader_module_name,const ShaderCreateInfo *);
|
||||||
|
|
||||||
Material * CreateMaterial(const mtl::MaterialCreateInfo *);
|
Material * CreateMaterial(const mtl::MaterialCreateInfo *);
|
||||||
|
|
||||||
|
@ -12,21 +12,28 @@
|
|||||||
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
#include<hgl/shadergen/ShaderDescriptorInfo.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
const ShaderModule *RenderResource::CreateShaderModule(const AnsiString &sm_name,VkShaderStageFlagBits shader_stage,const uint32_t *spv_data,const size_t spv_size)
|
const ShaderModule *RenderResource::CreateShaderModule(const AnsiString &sm_name,const ShaderCreateInfo *sci)
|
||||||
{
|
{
|
||||||
if(!device)return(nullptr);
|
if(!device)return(nullptr);
|
||||||
if(sm_name.IsEmpty())return(nullptr);
|
if(sm_name.IsEmpty())return(nullptr);
|
||||||
if(!spv_data)return(nullptr);
|
|
||||||
if(spv_size<4)return(nullptr);
|
const int bit_offset=GetBitOffset((uint32_t)sci->GetShaderStage());
|
||||||
|
|
||||||
|
if(bit_offset<0||bit_offset>VK_SHADER_STAGE_TYPE_COUNT)return(nullptr);
|
||||||
|
|
||||||
ShaderModule *sm;
|
ShaderModule *sm;
|
||||||
|
|
||||||
if(shader_module_by_name.Get(sm_name,sm))
|
ShaderModuleMapByName &sm_map=shader_module_by_name[bit_offset];
|
||||||
|
|
||||||
|
if(sm_map.Get(sm_name,sm))
|
||||||
return sm;
|
return sm;
|
||||||
|
|
||||||
sm=device->CreateShaderModule(shader_stage,spv_data,spv_size);
|
sm=device->CreateShaderModule(sci->GetShaderStage(),sci->GetSPVData(),sci->GetSPVSize());
|
||||||
|
|
||||||
shader_module_by_name.Add(sm_name,sm);
|
if(!sm)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
sm_map.Add(sm_name,sm);
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
{
|
{
|
||||||
@ -65,9 +72,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
|
|||||||
|
|
||||||
if(vert)
|
if(vert)
|
||||||
{
|
{
|
||||||
sm=CreateShaderModule( mtl_name+U8_TEXT("?Vertex"),
|
sm=CreateShaderModule(mtl_name,vert);
|
||||||
VK_SHADER_STAGE_VERTEX_BIT,
|
|
||||||
vert->GetSPVData(),vert->GetSPVSize());
|
|
||||||
|
|
||||||
if(!sm)
|
if(!sm)
|
||||||
return(false);
|
return(false);
|
||||||
@ -80,9 +85,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
|
|||||||
|
|
||||||
if(geom)
|
if(geom)
|
||||||
{
|
{
|
||||||
sm=CreateShaderModule( mtl_name+U8_TEXT("?Geometry"),
|
sm=CreateShaderModule(mtl_name,geom);
|
||||||
VK_SHADER_STAGE_GEOMETRY_BIT,
|
|
||||||
geom->GetSPVData(),geom->GetSPVSize());
|
|
||||||
|
|
||||||
smm->Add(sm);
|
smm->Add(sm);
|
||||||
}
|
}
|
||||||
@ -91,9 +94,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
|
|||||||
|
|
||||||
if(frag)
|
if(frag)
|
||||||
{
|
{
|
||||||
sm=CreateShaderModule( mtl_name+U8_TEXT("?Fragment"),
|
sm=CreateShaderModule(mtl_name,frag);
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
|
||||||
frag->GetSPVData(),frag->GetSPVSize());
|
|
||||||
|
|
||||||
smm->Add(sm);
|
smm->Add(sm);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user