ULRE/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp

127 lines
3.2 KiB
C++
Raw Normal View History

#include<hgl/graph/VKShaderModule.h>
#include<hgl/graph/VKMaterial.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKShaderModuleMap.h>
2021-09-13 20:39:25 +08:00
#include<hgl/graph/VKShaderResource.h>
#include<hgl/graph/VKMaterialDescriptorManager.h>
#include<hgl/graph/VKVertexInput.h>
#include<hgl/filesystem/FileSystem.h>
2020-10-21 12:39:22 +08:00
#include<hgl/graph/VKRenderResource.h>
2023-02-23 19:01:01 +08:00
#include<hgl/io/ConstBufferReader.h>
2023-03-17 21:06:05 +08:00
#include<hgl/shadergen/MaterialCreateInfo.h>
#include<hgl/shadergen/ShaderDescriptorInfo.h>
VK_NAMESPACE_BEGIN
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,VkShaderStageFlagBits shader_stage,const uint32_t *spv_data,const size_t spv_size)
{
if(!device)return(nullptr);
if(filename.IsEmpty())return(nullptr);
if(!spv_data)return(nullptr);
if(spv_size<4)return(nullptr);
ShaderModule *sm;
if(shader_module_by_name.Get(filename,sm))
return sm;
sm=device->CreateShaderModule(shader_stage,spv_data,spv_size);
shader_module_by_name.Add(filename,sm);
2022-09-29 18:29:21 +08:00
#ifdef _DEBUG
{
auto da=device->GetDeviceAttribute();
const UTF8String sn=ToUTF8String(filename);
if(da->debug_maker)
da->debug_maker->SetShaderModule(*sm,sn);
if(da->debug_utils)
da->debug_utils->SetShaderModule(*sm,sn);
}
#endif//_DEBUG
return sm;
}
2023-05-16 02:23:45 +08:00
Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
2023-03-17 21:06:05 +08:00
{
if(!mci)
return(nullptr);
Material *mtl;
const OSString mtl_name=ToOSString(mci->GetName());
if(material_by_name.Get(mtl_name,mtl))
return mtl;
2023-03-17 21:06:05 +08:00
const uint count=GetShaderCountByBits(mci->GetShaderStage());
const ShaderModule *sm;
2023-03-17 21:06:05 +08:00
ShaderModuleMap *smm=new ShaderModuleMap;
VertexInput *vertex_input=nullptr;
const ShaderCreateInfoVertex *vert=mci->GetVS();
if(vert)
2023-05-19 22:22:55 +08:00
{
sm=CreateShaderModule( mtl_name+OS_TEXT("?Vertex"),
VK_SHADER_STAGE_VERTEX_BIT,
vert->GetSPVData(),vert->GetSPVSize());
if(!sm)
return(false);
if(smm->Add(sm))
vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input);
}
const ShaderCreateInfoGeometry *geom=mci->GetGS();
if(geom)
{
sm=CreateShaderModule( mtl_name+OS_TEXT("?Geometry"),
VK_SHADER_STAGE_GEOMETRY_BIT,
geom->GetSPVData(),geom->GetSPVSize());
2023-03-17 21:06:05 +08:00
smm->Add(sm);
}
const ShaderCreateInfoFragment *frag=mci->GetFS();
if(frag)
{
sm=CreateShaderModule( mtl_name+OS_TEXT("?Fragment"),
VK_SHADER_STAGE_FRAGMENT_BIT,
frag->GetSPVData(),frag->GetSPVSize());
smm->Add(sm);
}
2023-03-17 21:06:05 +08:00
MaterialDescriptorManager *mdm=nullptr;
{
const auto &mdi=mci->GetMDI();
if(mdi.GetCount()>0)
mdm=new MaterialDescriptorManager(mci->GetName(),mdi.Get());
}
2023-03-17 21:06:05 +08:00
mtl=device->CreateMaterial(mci->GetName(),smm,mdm,vertex_input);
if(!mtl)
{
delete mdm;
delete smm;
}
else
{
Add(mtl);
}
material_by_name.Add(mtl_name,mtl);
return mtl;
}
VK_NAMESPACE_END