support .material file
This commit is contained in:
parent
8f68b3935d
commit
37ffb5dc8c
2
CMCore
2
CMCore
@ -1 +1 @@
|
|||||||
Subproject commit 7c69cfff60cceb41760513ea4c5fbf78053012e3
|
Subproject commit 6f1249263e97c2c88fb69d0c277e24d887fd32cb
|
@ -42,8 +42,7 @@ private:
|
|||||||
|
|
||||||
bool InitMaterial()
|
bool InitMaterial()
|
||||||
{
|
{
|
||||||
material=shader_manage->CreateMaterial(OS_TEXT("res/shader/Atomsphere.vert"),
|
material=shader_manage->CreateMaterial(OS_TEXT("res/material/Atmosphere"));
|
||||||
OS_TEXT("res/shader/Atomsphere.frag"));
|
|
||||||
if(!material)
|
if(!material)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
@ -41,8 +41,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
class ShaderResource
|
class ShaderResource
|
||||||
{
|
{
|
||||||
const uint8 *data;
|
|
||||||
|
|
||||||
VkShaderStageFlagBits stage_flag;
|
VkShaderStageFlagBits stage_flag;
|
||||||
|
|
||||||
const void *spv_data;
|
const void *spv_data;
|
||||||
@ -55,8 +53,8 @@ VK_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShaderResource(const uint8 *,const VkShaderStageFlagBits &,const void *,const uint32);
|
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
||||||
virtual ~ShaderResource();
|
virtual ~ShaderResource()=default;
|
||||||
|
|
||||||
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
||||||
|
|
||||||
@ -95,5 +93,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
}
|
}
|
||||||
};//class ShaderResource
|
};//class ShaderResource
|
||||||
|
|
||||||
|
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header);
|
||||||
ShaderResource *LoadShaderResoruce(const OSString &filename);
|
ShaderResource *LoadShaderResoruce(const OSString &filename);
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
@ -92,6 +92,22 @@ enum class ShaderStageBit
|
|||||||
Compute =VK_SHADER_STAGE_COMPUTE_BIT
|
Compute =VK_SHADER_STAGE_COMPUTE_BIT
|
||||||
};//enum class ShaderStageBit
|
};//enum class ShaderStageBit
|
||||||
|
|
||||||
|
inline const uint GetShaderCountByBits(const uint32_t bits)
|
||||||
|
{
|
||||||
|
uint comp=(uint)VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
uint result=0;
|
||||||
|
|
||||||
|
for(uint i=0;i<6;i++)
|
||||||
|
{
|
||||||
|
if(bits&comp)
|
||||||
|
++result;
|
||||||
|
|
||||||
|
comp<<=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* max-lengths:
|
* max-lengths:
|
||||||
*
|
*
|
||||||
|
@ -20,6 +20,11 @@ class ShaderModuleManage
|
|||||||
int shader_count;
|
int shader_count;
|
||||||
Map<int,ShaderModule *> shader_list;
|
Map<int,ShaderModule *> shader_list;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void Free(ShaderModuleMap *);
|
||||||
|
Material *CreateMaterial(ShaderModuleMap *);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShaderModuleManage(Device *dev)
|
ShaderModuleManage(Device *dev)
|
||||||
@ -56,53 +61,13 @@ public:
|
|||||||
const ShaderModule *GetShader (int);
|
const ShaderModule *GetShader (int);
|
||||||
bool ReleaseShader (const ShaderModule *);
|
bool ReleaseShader (const ShaderModule *);
|
||||||
|
|
||||||
Material * CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)const;
|
Material *CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module);
|
||||||
Material * CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)const;
|
Material *CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module);
|
||||||
|
|
||||||
Material * CreateMaterial(const OSString &vertex_shader_filename,const OSString &fragment_shader_filename)
|
Material *CreateMaterial(const OSString &vertex_shader_filename,const OSString &fragment_shader_filename);
|
||||||
{
|
Material *CreateMaterial(const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename);
|
||||||
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
|
||||||
|
|
||||||
if(!vs)
|
Material *CreateMaterial(const OSString &filename);
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
|
||||||
|
|
||||||
if(!fs)
|
|
||||||
{
|
|
||||||
ReleaseShader(vs);
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(CreateMaterial((VertexShaderModule *)vs,fs));
|
|
||||||
}
|
|
||||||
|
|
||||||
Material * CreateMaterial(const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename)
|
|
||||||
{
|
|
||||||
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
|
||||||
|
|
||||||
if(!vs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *gs=CreateShader(VK_SHADER_STAGE_GEOMETRY_BIT,geometry_shader_filename);
|
|
||||||
|
|
||||||
if(!gs)
|
|
||||||
{
|
|
||||||
ReleaseShader(vs);
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
|
||||||
|
|
||||||
if(!fs)
|
|
||||||
{
|
|
||||||
ReleaseShader(gs);
|
|
||||||
ReleaseShader(vs);
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(CreateMaterial((VertexShaderModule *)vs,gs,fs));
|
|
||||||
}
|
|
||||||
};//class ShaderModuleManage
|
};//class ShaderModuleManage
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MANAGE_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MANAGE_INCLUDE
|
||||||
|
2
res
2
res
@ -1 +1 @@
|
|||||||
Subproject commit 7f2ffa2e7c7cfb308d5eb20019faee68d4652181
|
Subproject commit 6e4f4a9329b440787eb0a92eaa691e989497e9bd
|
@ -100,7 +100,33 @@ bool ShaderModuleManage::ReleaseShader(const ShaderModule *const_sm)
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)const
|
void ShaderModuleManage::Free(ShaderModuleMap *smm)
|
||||||
|
{
|
||||||
|
const int count=smm->GetCount();
|
||||||
|
|
||||||
|
auto **it=smm->GetDataList();
|
||||||
|
|
||||||
|
for(int i=0;i<count;i++)
|
||||||
|
{
|
||||||
|
ReleaseShader((*it)->right);
|
||||||
|
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete smm;
|
||||||
|
}
|
||||||
|
|
||||||
|
Material *ShaderModuleManage::CreateMaterial(ShaderModuleMap *smm)
|
||||||
|
{
|
||||||
|
Material *mtl=VK_NAMESPACE::CreateMaterial(device,smm);
|
||||||
|
|
||||||
|
if(mtl)return(mtl);
|
||||||
|
|
||||||
|
Free(smm);
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)
|
||||||
{
|
{
|
||||||
if(!vertex_shader_module||!fragment_shader_module)
|
if(!vertex_shader_module||!fragment_shader_module)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
@ -113,10 +139,10 @@ Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_sh
|
|||||||
smm->Add(vertex_shader_module);
|
smm->Add(vertex_shader_module);
|
||||||
smm->Add(fragment_shader_module);
|
smm->Add(fragment_shader_module);
|
||||||
|
|
||||||
return(VK_NAMESPACE::CreateMaterial(device,smm));
|
return CreateMaterial(smm);
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)const
|
Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)
|
||||||
{
|
{
|
||||||
if(!vertex_shader_module
|
if(!vertex_shader_module
|
||||||
||!geometry_shader_module
|
||!geometry_shader_module
|
||||||
@ -133,6 +159,120 @@ Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_sh
|
|||||||
smm->Add(geometry_shader_module);
|
smm->Add(geometry_shader_module);
|
||||||
smm->Add(fragment_shader_module);
|
smm->Add(fragment_shader_module);
|
||||||
|
|
||||||
return(VK_NAMESPACE::CreateMaterial(device,smm));
|
return CreateMaterial(smm);
|
||||||
|
}
|
||||||
|
|
||||||
|
Material *ShaderModuleManage::CreateMaterial(const OSString &vertex_shader_filename,const OSString &fragment_shader_filename)
|
||||||
|
{
|
||||||
|
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
||||||
|
|
||||||
|
if(!vs)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
||||||
|
|
||||||
|
if(!fs)
|
||||||
|
{
|
||||||
|
ReleaseShader(vs);
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(CreateMaterial((VertexShaderModule *)vs,fs));
|
||||||
|
}
|
||||||
|
|
||||||
|
Material *ShaderModuleManage::CreateMaterial(const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename)
|
||||||
|
{
|
||||||
|
const ShaderModule *vs=CreateShader(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_filename);
|
||||||
|
|
||||||
|
if(!vs)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const ShaderModule *gs=CreateShader(VK_SHADER_STAGE_GEOMETRY_BIT,geometry_shader_filename);
|
||||||
|
|
||||||
|
if(!gs)
|
||||||
|
{
|
||||||
|
ReleaseShader(vs);
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ShaderModule *fs=CreateShader(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_filename);
|
||||||
|
|
||||||
|
if(!fs)
|
||||||
|
{
|
||||||
|
ReleaseShader(gs);
|
||||||
|
ReleaseShader(vs);
|
||||||
|
return(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(CreateMaterial((VertexShaderModule *)vs,gs,fs));
|
||||||
|
}
|
||||||
|
|
||||||
|
Material *ShaderModuleManage::CreateMaterial(const OSString &filename)
|
||||||
|
{
|
||||||
|
constexpr char MaterialFileHeader[]=u8"Material\x1A";
|
||||||
|
constexpr uint MaterialFileHeaderLength=sizeof(MaterialFileHeader)-1;
|
||||||
|
|
||||||
|
int64 filesize;
|
||||||
|
AutoDeleteArray<uint8> origin_filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".material"),filesize);
|
||||||
|
|
||||||
|
if(filesize<MaterialFileHeaderLength)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
const uint8 *sp=origin_filedata;
|
||||||
|
int64 left=filesize;
|
||||||
|
|
||||||
|
if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
sp+=MaterialFileHeaderLength;
|
||||||
|
left-=MaterialFileHeaderLength;
|
||||||
|
|
||||||
|
const uint8 ver=*sp;
|
||||||
|
++sp;
|
||||||
|
--left;
|
||||||
|
|
||||||
|
const uint32_t shader_bits=*(uint32_t *)sp;
|
||||||
|
sp+=sizeof(uint32_t);
|
||||||
|
left-=sizeof(uint32_t);
|
||||||
|
|
||||||
|
const uint count=GetShaderCountByBits(shader_bits);
|
||||||
|
uint32_t size;
|
||||||
|
|
||||||
|
ShaderResource *sr;
|
||||||
|
const ShaderModule *sm;
|
||||||
|
|
||||||
|
bool result=true;
|
||||||
|
ShaderModuleMap *smm=new ShaderModuleMap;
|
||||||
|
|
||||||
|
for(uint i=0;i<count;i++)
|
||||||
|
{
|
||||||
|
size=*(uint32_t *)sp;
|
||||||
|
sp+=sizeof(uint32_t);
|
||||||
|
left-=sizeof(uint32_t);
|
||||||
|
|
||||||
|
sr=LoadShaderResource(sp,size,false);
|
||||||
|
sp+=size;
|
||||||
|
left-=size;
|
||||||
|
|
||||||
|
if(sr)
|
||||||
|
{
|
||||||
|
sm=CreateShader(sr);
|
||||||
|
|
||||||
|
if(sm)
|
||||||
|
{
|
||||||
|
if(smm->Add(sm))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result=false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result)
|
||||||
|
return CreateMaterial(smm);
|
||||||
|
|
||||||
|
Free(smm);
|
||||||
|
return(nullptr);
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -81,19 +81,13 @@ VK_NAMESPACE_BEGIN
|
|||||||
}
|
}
|
||||||
}//namespcae
|
}//namespcae
|
||||||
|
|
||||||
ShaderResource::ShaderResource(const uint8 *fd,const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
|
ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
|
||||||
{
|
{
|
||||||
data=fd;
|
|
||||||
stage_flag=flag;
|
stage_flag=flag;
|
||||||
spv_data=sd;
|
spv_data=sd;
|
||||||
spv_size=size;
|
spv_size=size;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderResource::~ShaderResource()
|
|
||||||
{
|
|
||||||
delete[] data;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ShaderStage *ShaderResource::GetStageInput(const AnsiString &name) const
|
const ShaderStage *ShaderResource::GetStageInput(const AnsiString &name) const
|
||||||
{
|
{
|
||||||
const int count=stage_inputs.GetCount();
|
const int count=stage_inputs.GetCount();
|
||||||
@ -143,13 +137,15 @@ VK_NAMESPACE_BEGIN
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderResource *LoadShaderResoruce(const OSString &filename)
|
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header)
|
||||||
{
|
{
|
||||||
int64 filesize;
|
|
||||||
uint8 *origin_filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".shader"),filesize);
|
|
||||||
|
|
||||||
if(!origin_filedata)return(nullptr);
|
if(!origin_filedata)return(nullptr);
|
||||||
|
|
||||||
|
const uint8 *filedata=origin_filedata;
|
||||||
|
const uint8 *file_end=filedata+filesize;
|
||||||
|
|
||||||
|
if(include_file_header)
|
||||||
|
{
|
||||||
if(filesize<SHADER_FILE_MIN_SIZE
|
if(filesize<SHADER_FILE_MIN_SIZE
|
||||||
||memcmp(origin_filedata,SHADER_FILE_HEADER,SHADER_FILE_HEADER_BYTES))
|
||memcmp(origin_filedata,SHADER_FILE_HEADER,SHADER_FILE_HEADER_BYTES))
|
||||||
{
|
{
|
||||||
@ -157,10 +153,8 @@ VK_NAMESPACE_BEGIN
|
|||||||
return(nullptr);
|
return(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8 *filedata=origin_filedata;
|
|
||||||
const uint8 *file_end=filedata+filesize;
|
|
||||||
|
|
||||||
filedata+=SHADER_FILE_HEADER_BYTES;
|
filedata+=SHADER_FILE_HEADER_BYTES;
|
||||||
|
}
|
||||||
|
|
||||||
uint8 version;
|
uint8 version;
|
||||||
VkShaderStageFlagBits flag;
|
VkShaderStageFlagBits flag;
|
||||||
@ -171,7 +165,7 @@ VK_NAMESPACE_BEGIN
|
|||||||
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
|
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
|
||||||
spv_size=AccessByPointer(filedata,uint32);
|
spv_size=AccessByPointer(filedata,uint32);
|
||||||
|
|
||||||
ShaderResource *sr=new ShaderResource(origin_filedata,flag,filedata,spv_size);
|
ShaderResource *sr=new ShaderResource(flag,filedata,spv_size);
|
||||||
|
|
||||||
filedata+=spv_size;
|
filedata+=spv_size;
|
||||||
|
|
||||||
@ -187,4 +181,12 @@ VK_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
return sr;
|
return sr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShaderResource *LoadShaderResoruce(const OSString &filename)
|
||||||
|
{
|
||||||
|
int64 filesize;
|
||||||
|
AutoDeleteArray<uint8> origin_filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".shader"),filesize);
|
||||||
|
|
||||||
|
return LoadShaderResource(origin_filedata,filesize,true);
|
||||||
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
Loading…
x
Reference in New Issue
Block a user