#include #include #include #include #include #include VK_NAMESPACE_BEGIN VAB *RenderResource::CreateVAB(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode) { VAB *vb=device->CreateVAB(format,count,data,sharing_mode); if(!vb) return(nullptr); rm_buffers.Add(vb); return vb; } #define SCENE_DB_CREATE_BUFFER(name) DeviceBuffer *RenderResource::Create##name(const AnsiString &buf_name,VkDeviceSize size,void *data,SharingMode sharing_mode) \ { \ DeviceBuffer *buf=device->Create##name(size,data,sharing_mode); \ \ if(!buf)return(nullptr); \ AddBuffer(#name ":"+buf_name,buf); \ return(buf); \ } SCENE_DB_CREATE_BUFFER(UBO) SCENE_DB_CREATE_BUFFER(SSBO) SCENE_DB_CREATE_BUFFER(INBO) #undef SCENE_DB_CREATE_BUFFER IndexBuffer *RenderResource::CreateIBO(IndexType index_type,uint32_t count,const void *data,SharingMode sharing_mode) { IndexBuffer *buf=device->CreateIBO(index_type,count,data,sharing_mode); if(!buf)return(nullptr); rm_buffers.Add(buf); return(buf); } MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl,const VILConfig *vil_cfg) { if(!mtl)return(nullptr); MaterialInstance *mi=mtl->CreateMI(vil_cfg); if(mi) Add(mi); return mi; } MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl,const VILConfig *vil_cfg,const void *mi_data,const int mi_bytes) { if(!mtl)return(nullptr); if(!mi_data||mi_bytes<=0)return(nullptr); MaterialInstance *mi=mtl->CreateMI(vil_cfg); if(!mi) return nullptr; Add(mi); mi->WriteMIData(mi_data,mi_bytes); return mi; } MaterialInstance *RenderResource::CreateMaterialInstance(const mtl::MaterialCreateInfo *mci,const VILConfig *vil_cfg) { Material *mtl=this->CreateMaterial(mci); if(!mtl) return(nullptr); return CreateMaterialInstance(mtl,vil_cfg); } Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p) { if(!p||!mi||!r) return(nullptr); Renderable *ri=VK_NAMESPACE::CreateRenderable(r,mi,p); if(ri) Add(ri); return ri; } Renderable *RenderResource::CreateRenderable(PrimitiveCreater *pc,MaterialInstance *mi,Pipeline *p) { if(!p||!mi||!pc) return(nullptr); Primitive *prim=pc->Create(); if(!prim) return(nullptr); Renderable *ri=VK_NAMESPACE::CreateRenderable(prim,mi,p); if(ri) { Add(prim); Add(ri); return ri; } delete prim; return(nullptr); } Sampler *RenderResource::CreateSampler(VkSamplerCreateInfo *sci) { Sampler *s=device->CreateSampler(sci); if(s) Add(s); return s; } Sampler *RenderResource::CreateSampler(Texture *tex) { Sampler *s=device->CreateSampler(tex); if(s) Add(s); return s; } Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps); Texture2D *RenderResource::LoadTexture2D(const OSString &filename,bool auto_mipmaps) { Texture2D *tex; if(texture_by_name.Get(filename,(Texture *&)tex)) return tex; tex=CreateTexture2DFromFile(device,filename,auto_mipmaps); if(tex) { texture_by_name.Add(filename,tex); Add(tex); #ifdef _DEBUG DebugUtils *du=device->GetDebugUtils(); if(du) { const UTF8String name=U8_TEXT("Tex2D:")+ToUTF8String(filename); du->SetImage(tex->GetImage(),(char *)(name.c_str())); } #endif//_DEBUG } return tex; } Texture2DArray *RenderResource::CreateTexture2DArray(const AnsiString &name,const uint32_t width,const uint32_t height,const uint32_t layer,const VkFormat &fmt,bool auto_mipmaps) { Texture2DArray *ta=device->CreateTexture2DArray(width,height,layer,fmt,auto_mipmaps); if(ta) Add(ta); else return nullptr; #ifdef _DEBUG DebugUtils *du=device->GetDebugUtils(); if(du) { du->SetImage(ta->GetImage(),"Tex2DArrayImage:"+name); du->SetImageView(ta->GetVulkanImageView(),"Tex2DArrayImageView:"+name); du->SetDeviceMemory(ta->GetDeviceMemory(),"Tex2DArrayMemory:"+name); } #endif//_DEBUG return ta; } bool LoadTexture2DLayerFromFile(GPUDevice *device,Texture2DArray *t2d,const uint32_t layer,const OSString &filename,bool auto_mipmaps); bool RenderResource::LoadTexture2DToArray(Texture2DArray *ta,const uint32_t layer,const OSString &filename) { if(!ta)return(false); if(!LoadTexture2DLayerFromFile(device,ta,layer,filename,false)) return(false); return(true); } TextureCube *CreateTextureCubeFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps); TextureCube *RenderResource::LoadTextureCube(const OSString &filename,bool auto_mipmaps) { TextureCube *tex; if(texture_by_name.Get(filename,(Texture *&)tex)) return tex; tex=CreateTextureCubeFromFile(device,filename,auto_mipmaps); if(tex) { texture_by_name.Add(filename,tex); Add(tex); } return tex; } VK_NAMESPACE_END