#include #include #include #include #include #include #include #include VK_NAMESPACE_BEGIN const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,ShaderResource *shader_resource) { if(!device)return(nullptr); if(filename.IsEmpty())return(nullptr); if(!shader_resource)return(nullptr); ShaderModule *sm; if(shader_module_by_name.Get(filename,sm)) return sm; sm=device->CreateShaderModule(shader_resource); shader_module_by_name.Add(filename,sm); return sm; } void LoadShaderDescriptor(const uint8 *data,ShaderDescriptor *sd_list,const uint count) { ShaderDescriptor *sd=sd_list; uint str_len; for(uint i=0;idesc_type=VkDescriptorType(*data++); { str_len=*data++; memcpy(sd->name,(char *)data,str_len); data+=str_len; } sd->set =*data++; sd->binding =*data++; sd->stage_flag =*(uint32 *)data; data+=sizeof(uint32); sd->set_type=CheckDescriptorSetType(sd->name); if(sd->set_type==DescriptorSetType::Renderable) { if(sd->desc_type==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;else if(sd->desc_type==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; } ++sd; } } Material *RenderResource::CreateMaterial(const OSString &filename) { Material *mtl; if(material_by_name.Get(filename,mtl)) return mtl; constexpr char MaterialFileHeader[]=u8"Material\x1A"; constexpr uint MaterialFileHeaderLength=sizeof(MaterialFileHeader)-1; int64 filesize; uint8 *filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".material"),filesize); if(!filedata) { material_by_name.Add(filename,nullptr); return(nullptr); } AutoDeleteArray origin_filedata(filedata,filesize); if(filesizeGetStageName()); sm=CreateShaderModule(shader_name,sr); if(sm) { if(smm->Add(sm)) continue; } } result=false; break; } MaterialDescriptorSets *mds=nullptr; { const uint8 count=*sp; ++sp; if(count>0) { ShaderDescriptor *sd_list=hgl_zero_new(count); LoadShaderDescriptor(filedata,sd_list,count); mds=new MaterialDescriptorSets(sd_list,count); } } if(result) { mtl=device->CreateMaterial(ToUTF8String(filename),smm,mds); Add(mtl); } else { delete smm; mtl=nullptr; } material_by_name.Add(filename,mtl); return(mtl); } VK_NAMESPACE_END