(WIP)support newly material file,can't use.
This commit is contained in:
parent
903f9081eb
commit
ba6367556b
@ -1 +1 @@
|
|||||||
Subproject commit 2940b99b99cfe575dd45103ef20f4019dee15b54
|
Subproject commit 97a78cdd429f33a7c074fd0d7649012eec20d43a
|
@ -1 +1 @@
|
|||||||
Subproject commit 9be589598595963f94ba264d7b416d0533421106
|
Subproject commit c39fbdac0f0f6638d5cfca43988750a1aac512db
|
@ -1 +1 @@
|
|||||||
Subproject commit 630770496d8d78dd6c06511ba180dbe4ddf14f94
|
Subproject commit b61ed5cbfad8b76339ef1b2564ca03ffe34de7cc
|
2
CMCore
2
CMCore
@ -1 +1 @@
|
|||||||
Subproject commit 468aa4462224a722b334d7140723b169556ba368
|
Subproject commit 9c5cb2dc4a946906be186e10a3c0a4fb67d2a912
|
@ -1 +1 @@
|
|||||||
Subproject commit e2f056ddff2e1adacd6431c685af9c0ed8177e06
|
Subproject commit 7a5040224a162cd63f54e28d31eaf7eb710b48a0
|
2
CMUtil
2
CMUtil
@ -1 +1 @@
|
|||||||
Subproject commit 9982ca25af1a52981054af8636dfc5f3e2ea59c9
|
Subproject commit 8ce98c85a397921277cd19a91993b6724bf1d391
|
@ -195,9 +195,9 @@ public: //shader & material
|
|||||||
|
|
||||||
ShaderModule *CreateShaderModule(ShaderResource *);
|
ShaderModule *CreateShaderModule(ShaderResource *);
|
||||||
|
|
||||||
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps);
|
Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *);
|
||||||
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module);
|
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
|
||||||
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module);
|
Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *);
|
||||||
|
|
||||||
public: //Command Buffer 相关
|
public: //Command Buffer 相关
|
||||||
|
|
||||||
|
@ -88,10 +88,6 @@ public: // VBO/VAO
|
|||||||
public: //Material
|
public: //Material
|
||||||
|
|
||||||
const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource);
|
const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource);
|
||||||
const ShaderModule *CreateShaderModule(const OSString &filename);
|
|
||||||
|
|
||||||
Material * CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &fragment_shader_filename);
|
|
||||||
Material * CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename);
|
|
||||||
|
|
||||||
Material * CreateMaterial(const OSString &);
|
Material * CreateMaterial(const OSString &);
|
||||||
MaterialInstance * CreateMaterialInstance(Material *);
|
MaterialInstance * CreateMaterialInstance(Material *);
|
||||||
|
@ -30,6 +30,7 @@ struct ShaderDescriptor
|
|||||||
DescriptorSetType set_type;
|
DescriptorSetType set_type;
|
||||||
uint32_t set;
|
uint32_t set;
|
||||||
uint32_t binding;
|
uint32_t binding;
|
||||||
|
uint32_t stage_flag;
|
||||||
};
|
};
|
||||||
|
|
||||||
using ShaderDescriptorList=List<ShaderDescriptor>;
|
using ShaderDescriptorList=List<ShaderDescriptor>;
|
||||||
@ -46,38 +47,12 @@ constexpr size_t VK_DESCRIPTOR_TYPE_END_RANGE=VK_DESCRIPTOR_TYPE_INPUT_ATTACHMEN
|
|||||||
constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1;
|
constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1;
|
||||||
#endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE
|
#endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE
|
||||||
|
|
||||||
class ShaderResource
|
class MaterialDescriptorSets
|
||||||
{
|
{
|
||||||
VkShaderStageFlagBits stage_flag;
|
|
||||||
|
|
||||||
const void *spv_data;
|
|
||||||
uint32 spv_size;
|
|
||||||
|
|
||||||
ShaderStageList stage_inputs;
|
|
||||||
ShaderStageList stage_outputs;
|
|
||||||
|
|
||||||
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
ShaderDescriptorList descriptor_list[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
|
||||||
virtual ~ShaderResource()=default;
|
|
||||||
|
|
||||||
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
|
||||||
const os_char * GetStageName ()const;
|
|
||||||
|
|
||||||
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 uint GetStageInputCount ()const {return stage_inputs.GetCount();}
|
|
||||||
const uint GetStageOutputCount ()const {return stage_outputs.GetCount();}
|
|
||||||
|
|
||||||
const ShaderStage * GetStageInput (const AnsiString &)const;
|
|
||||||
const int GetStageInputBinding(const AnsiString &)const;
|
|
||||||
|
|
||||||
const ShaderDescriptorList * GetDescriptorList ()const {return descriptor_list;}
|
const ShaderDescriptorList * GetDescriptorList ()const {return descriptor_list;}
|
||||||
ShaderDescriptorList * GetDescriptorList (VkDescriptorType desc_type)
|
ShaderDescriptorList * GetDescriptorList (VkDescriptorType desc_type)
|
||||||
{
|
{
|
||||||
@ -101,10 +76,40 @@ public:
|
|||||||
|
|
||||||
// return &(descriptor_list[desc_type].binding_list);
|
// return &(descriptor_list[desc_type].binding_list);
|
||||||
//}
|
//}
|
||||||
|
};//
|
||||||
|
|
||||||
|
class ShaderResource
|
||||||
|
{
|
||||||
|
VkShaderStageFlagBits stage_flag;
|
||||||
|
|
||||||
|
const void *spv_data;
|
||||||
|
uint32 spv_size;
|
||||||
|
|
||||||
|
ShaderStageList stage_inputs;
|
||||||
|
ShaderStageList stage_outputs;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
|
||||||
|
virtual ~ShaderResource()=default;
|
||||||
|
|
||||||
|
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
|
||||||
|
const os_char * GetStageName ()const;
|
||||||
|
|
||||||
|
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 uint GetStageInputCount ()const {return stage_inputs.GetCount();}
|
||||||
|
const uint GetStageOutputCount ()const {return stage_outputs.GetCount();}
|
||||||
|
|
||||||
|
const ShaderStage * GetStageInput (const AnsiString &)const;
|
||||||
|
const int GetStageInputBinding(const AnsiString &)const;
|
||||||
};//class ShaderResource
|
};//class ShaderResource
|
||||||
|
|
||||||
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header);
|
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize);
|
||||||
ShaderResource *LoadShaderResoruce(const OSString &filename);
|
|
||||||
|
|
||||||
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
|
struct ShaderModuleCreateInfo:public vkstruct_flag<VkShaderModuleCreateInfo,VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO>
|
||||||
{
|
{
|
||||||
|
2
res
2
res
@ -1 +1 @@
|
|||||||
Subproject commit 9f031f98a611172812ceb4094af0f032218c5e91
|
Subproject commit a0c84d12663e1d0ce0ad22faa5cd89ede26af90f
|
@ -3,7 +3,7 @@
|
|||||||
#include"VKDescriptorSetLayoutCreater.h"
|
#include"VKDescriptorSetLayoutCreater.h"
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps)
|
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds)
|
||||||
{
|
{
|
||||||
const int shader_count=shader_maps->GetCount();
|
const int shader_count=shader_maps->GetCount();
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
|
|||||||
return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater));
|
return(new Material(mtl_name,shader_maps,shader_stage_list,dsl_creater));
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module)
|
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
|
||||||
{
|
{
|
||||||
if(!vertex_shader_module||!fragment_shader_module)
|
if(!vertex_shader_module||!fragment_shader_module)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
@ -58,10 +58,10 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
|
|||||||
smm->Add(vertex_shader_module);
|
smm->Add(vertex_shader_module);
|
||||||
smm->Add(fragment_shader_module);
|
smm->Add(fragment_shader_module);
|
||||||
|
|
||||||
return CreateMaterial(mtl_name,smm);
|
return CreateMaterial(mtl_name,smm,mds);
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module)
|
Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds)
|
||||||
{
|
{
|
||||||
if(!vertex_shader_module
|
if(!vertex_shader_module
|
||||||
||!geometry_shader_module
|
||!geometry_shader_module
|
||||||
@ -78,6 +78,6 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShade
|
|||||||
smm->Add(geometry_shader_module);
|
smm->Add(geometry_shader_module);
|
||||||
smm->Add(fragment_shader_module);
|
smm->Add(fragment_shader_module);
|
||||||
|
|
||||||
return CreateMaterial(mtl_name,smm);
|
return CreateMaterial(mtl_name,smm,mds);
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
@ -26,57 +26,50 @@ const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,
|
|||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename)
|
const bool LoadShaderDescriptor(ShaderResource *sr,const uint8 *data)
|
||||||
{
|
{
|
||||||
ShaderModule *sm;
|
const uint8 count=*data++;
|
||||||
|
|
||||||
if(shader_module_by_name.Get(filename,sm))
|
if(count<=0)return(true);
|
||||||
return sm;
|
|
||||||
|
|
||||||
ShaderResource *shader_resource=LoadShaderResoruce(filename);
|
ShaderDescriptorList *sd_list;
|
||||||
|
const VkDescriptorType desc_type;
|
||||||
|
|
||||||
if(!shader_resource)return(nullptr);
|
|
||||||
|
|
||||||
sm=device->CreateShaderModule(shader_resource);
|
|
||||||
|
|
||||||
shader_module_by_name.Add(filename,sm);
|
uint str_len;
|
||||||
|
|
||||||
return sm;
|
sd_list->SetCount(count);
|
||||||
|
|
||||||
|
ShaderDescriptor *sd=sd_list->GetData();
|
||||||
|
|
||||||
|
for(uint i=0;i<count;i++)
|
||||||
|
{
|
||||||
|
sd->set=*data++;
|
||||||
|
sd->binding=*data++;
|
||||||
|
str_len=*data++;
|
||||||
|
|
||||||
|
memcpy(sd->name,(char *)data,str_len);
|
||||||
|
sd->name[str_len]=0;
|
||||||
|
data+=str_len;
|
||||||
|
|
||||||
|
sd->set_type=CheckDescriptorSetType(sd->name);
|
||||||
|
|
||||||
|
if(sd->set_type==DescriptorSetType::Renderable)
|
||||||
|
{
|
||||||
|
if(desc_type==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;else
|
||||||
|
if(desc_type==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;else
|
||||||
|
sd->desc_type=desc_type;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sd->desc_type=desc_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *RenderResource::CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &fragment_shader_filename)
|
++sd;
|
||||||
{
|
|
||||||
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
|
|
||||||
|
|
||||||
if(!vs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *fs=CreateShaderModule(fragment_shader_filename);
|
|
||||||
|
|
||||||
if(!fs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
return(device->CreateMaterial(mtl_name,(VertexShaderModule *)vs,fs));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *RenderResource::CreateMaterial(const UTF8String &mtl_name,const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename)
|
return data;
|
||||||
{
|
|
||||||
const ShaderModule *vs=CreateShaderModule(vertex_shader_filename);
|
|
||||||
|
|
||||||
if(!vs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *gs=CreateShaderModule(geometry_shader_filename);
|
|
||||||
|
|
||||||
if(!gs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
const ShaderModule *fs=CreateShaderModule(fragment_shader_filename);
|
|
||||||
|
|
||||||
if(!fs)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
return(device->CreateMaterial(mtl_name,(VertexShaderModule *)vs,gs,fs));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Material *RenderResource::CreateMaterial(const OSString &filename)
|
Material *RenderResource::CreateMaterial(const OSString &filename)
|
||||||
@ -104,24 +97,21 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
|
|||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
const uint8 *sp=origin_filedata;
|
const uint8 *sp=origin_filedata;
|
||||||
int64 left=filesize;
|
const uint8 *end=sp+filesize;
|
||||||
|
|
||||||
if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0)
|
if(memcmp(sp,MaterialFileHeader,MaterialFileHeaderLength)!=0)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
sp+=MaterialFileHeaderLength;
|
sp+=MaterialFileHeaderLength;
|
||||||
left-=MaterialFileHeaderLength;
|
|
||||||
|
|
||||||
const uint8 ver=*sp;
|
const uint8 ver=*sp;
|
||||||
++sp;
|
++sp;
|
||||||
--left;
|
|
||||||
|
|
||||||
if(ver!=1)
|
if(ver!=2)
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
const uint32_t shader_bits=*(uint32_t *)sp;
|
const uint32_t shader_bits=*(uint32_t *)sp;
|
||||||
sp+=sizeof(uint32_t);
|
sp+=sizeof(uint32_t);
|
||||||
left-=sizeof(uint32_t);
|
|
||||||
|
|
||||||
const uint count=GetShaderCountByBits(shader_bits);
|
const uint count=GetShaderCountByBits(shader_bits);
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
@ -138,11 +128,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
|
|||||||
{
|
{
|
||||||
size=*(uint32_t *)sp;
|
size=*(uint32_t *)sp;
|
||||||
sp+=sizeof(uint32_t);
|
sp+=sizeof(uint32_t);
|
||||||
left-=sizeof(uint32_t);
|
|
||||||
|
|
||||||
sr=LoadShaderResource(sp,size,false);
|
sr=LoadShaderResource(sp,size);
|
||||||
sp+=size;
|
sp+=size;
|
||||||
left-=size;
|
|
||||||
|
|
||||||
if(sr)
|
if(sr)
|
||||||
{
|
{
|
||||||
@ -161,6 +149,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!LoadShaderDescriptor(sr,filedata))
|
||||||
|
result=false;
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
{
|
{
|
||||||
mtl=device->CreateMaterial(ToUTF8String(filename),smm);
|
mtl=device->CreateMaterial(ToUTF8String(filename),smm);
|
||||||
|
@ -40,8 +40,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
if(count<=0)
|
if(count<=0)
|
||||||
return(data);
|
return(data);
|
||||||
|
|
||||||
const uint32 total_bytes=AccessByPointer(data,uint32);
|
|
||||||
|
|
||||||
int str_len;
|
int str_len;
|
||||||
|
|
||||||
ShaderStage *ss;
|
ShaderStage *ss;
|
||||||
@ -67,51 +65,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8 *LoadShaderDescriptor(const uint8_t version,ShaderDescriptorList *sd_list,const VkDescriptorType desc_type,const uint8 *data)
|
|
||||||
{
|
|
||||||
const uint32 total_bytes=AccessByPointer(data,uint32);
|
|
||||||
|
|
||||||
const uint count=*data++;
|
|
||||||
|
|
||||||
uint str_len;
|
|
||||||
|
|
||||||
sd_list->SetCount(count);
|
|
||||||
|
|
||||||
ShaderDescriptor *sd=sd_list->GetData();
|
|
||||||
|
|
||||||
for(uint i=0;i<count;i++)
|
|
||||||
{
|
|
||||||
if(version>=1)
|
|
||||||
sd->set=*data++;
|
|
||||||
else
|
|
||||||
sd->set=0;
|
|
||||||
|
|
||||||
sd->binding=*data++;
|
|
||||||
str_len=*data++;
|
|
||||||
|
|
||||||
memcpy(sd->name,(char *)data,str_len);
|
|
||||||
sd->name[str_len]=0;
|
|
||||||
data+=str_len;
|
|
||||||
|
|
||||||
sd->set_type=CheckDescriptorSetType(sd->name);
|
|
||||||
|
|
||||||
if(sd->set_type==DescriptorSetType::Renderable)
|
|
||||||
{
|
|
||||||
if(desc_type==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;else
|
|
||||||
if(desc_type==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)sd->desc_type=VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;else
|
|
||||||
sd->desc_type=desc_type;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sd->desc_type=desc_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
++sd;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}//namespcae
|
}//namespcae
|
||||||
|
|
||||||
ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
|
ShaderResource::ShaderResource(const VkShaderStageFlagBits &flag,const void *sd,const uint32 size)
|
||||||
@ -195,31 +148,16 @@ VK_NAMESPACE_BEGIN
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header)
|
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize)
|
||||||
{
|
{
|
||||||
if(!origin_filedata)return(nullptr);
|
if(!origin_filedata)return(nullptr);
|
||||||
|
|
||||||
const uint8 *filedata=origin_filedata;
|
const uint8 *filedata=origin_filedata;
|
||||||
const uint8 *file_end=filedata+filesize;
|
const uint8 *file_end=filedata+filesize;
|
||||||
|
|
||||||
if(include_file_header)
|
|
||||||
{
|
|
||||||
if(filesize<SHADER_FILE_MIN_SIZE
|
|
||||||
||memcmp(origin_filedata,SHADER_FILE_HEADER,SHADER_FILE_HEADER_BYTES))
|
|
||||||
{
|
|
||||||
delete[] origin_filedata;
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
filedata+=SHADER_FILE_HEADER_BYTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8 version;
|
|
||||||
VkShaderStageFlagBits flag;
|
VkShaderStageFlagBits flag;
|
||||||
uint32 spv_size;
|
uint32 spv_size;
|
||||||
uint32 desc_type;
|
|
||||||
|
|
||||||
version =AccessByPointer(filedata,uint8);
|
|
||||||
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
|
flag =(const VkShaderStageFlagBits)AccessByPointer(filedata,uint32);
|
||||||
spv_size=AccessByPointer(filedata,uint32);
|
spv_size=AccessByPointer(filedata,uint32);
|
||||||
|
|
||||||
@ -230,37 +168,6 @@ VK_NAMESPACE_BEGIN
|
|||||||
filedata=LoadShaderStages(sr->GetStageInputs(),filedata);
|
filedata=LoadShaderStages(sr->GetStageInputs(),filedata);
|
||||||
filedata=LoadShaderStages(sr->GetStageOutputs(),filedata);
|
filedata=LoadShaderStages(sr->GetStageOutputs(),filedata);
|
||||||
|
|
||||||
while(filedata<file_end)
|
|
||||||
{
|
|
||||||
desc_type=AccessByPointer(filedata,uint32);
|
|
||||||
|
|
||||||
filedata=LoadShaderDescriptor(version,sr->GetDescriptorList((VkDescriptorType)desc_type),(VkDescriptorType)desc_type,filedata);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShaderResource *LoadShaderResoruce(const OSString &filename)
|
|
||||||
{
|
|
||||||
ShaderResource *sr;
|
|
||||||
|
|
||||||
if(shader_resource_by_filename.Get(filename,sr))
|
|
||||||
return sr;
|
|
||||||
|
|
||||||
int64 filesize;
|
|
||||||
uint8 *filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".shader"),filesize);
|
|
||||||
|
|
||||||
if(!filedata)
|
|
||||||
{
|
|
||||||
shader_resource_by_filename.Add(filename,nullptr);
|
|
||||||
return(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
AutoDeleteArray<uint8> origin_filedata(filedata,filesize);
|
|
||||||
|
|
||||||
sr=LoadShaderResource(origin_filedata,filesize,true);
|
|
||||||
|
|
||||||
shader_resource_by_filename.Add(filename,sr);
|
|
||||||
return sr;
|
return sr;
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
Loading…
x
Reference in New Issue
Block a user