ULRE/src/SceneGraph/Vulkan/VKRenderResource.cpp

170 lines
4.5 KiB
C++
Raw Normal View History

2020-10-21 12:39:22 +08:00
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
2020-09-02 18:16:15 +08:00
VK_NAMESPACE_BEGIN
2021-11-29 15:58:48 +08:00
VBO *RenderResource::CreateVBO(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode)
2020-09-02 18:16:15 +08:00
{
2021-11-29 15:58:48 +08:00
VBO *vb=device->CreateVBO(format,count,data,sharing_mode);
2020-09-02 18:16:15 +08:00
if(!vb)
return(nullptr);
rm_buffers.Add(vb);
return vb;
}
2020-12-10 14:52:58 +08:00
#define SCENE_DB_CREATE_BUFFER(name) GPUBuffer *RenderResource::Create##name(VkDeviceSize size,void *data,SharingMode sharing_mode) \
2020-09-02 18:16:15 +08:00
{ \
2020-12-10 14:52:58 +08:00
GPUBuffer *buf=device->Create##name(size,data,sharing_mode); \
2020-09-02 18:16:15 +08:00
\
if(!buf)return(nullptr); \
rm_buffers.Add(buf); \
return(buf); \
} \
\
2020-12-10 14:52:58 +08:00
GPUBuffer *RenderResource::Create##name(VkDeviceSize size,SharingMode sharing_mode) \
2020-09-02 18:16:15 +08:00
{ \
2020-12-10 14:52:58 +08:00
GPUBuffer *buf=device->Create##name(size,sharing_mode); \
2020-09-02 18:16:15 +08:00
\
if(!buf)return(nullptr); \
rm_buffers.Add(buf); \
return(buf); \
}
SCENE_DB_CREATE_BUFFER(UBO)
SCENE_DB_CREATE_BUFFER(SSBO)
SCENE_DB_CREATE_BUFFER(INBO)
#undef SCENE_DB_CREATE_BUFFER
2020-10-21 12:39:22 +08:00
IndexBuffer *RenderResource::CreateIBO(IndexType index_type,uint32_t count,const void *data,SharingMode sharing_mode)
2020-09-02 18:16:15 +08:00
{
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 VABConfigInfo *vab_cfg)
2020-09-02 18:16:15 +08:00
{
if(!mtl)return(nullptr);
MaterialInstance *mi=device->CreateMI(mtl,vab_cfg);
2020-09-02 18:16:15 +08:00
if(mi)
Add(mi);
return mi;
}
MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_filename,const VABConfigInfo *vab_cfg)
{
Material *mtl=this->CreateMaterial(mtl_filename);
if(!mtl)
return(nullptr);
return CreateMaterialInstance(mtl,vab_cfg);
}
2022-06-24 17:51:05 +08:00
Primitive *RenderResource::CreatePrimitive(const uint32_t vertex_count)
2020-09-02 18:16:15 +08:00
{
if(!vertex_count)return(nullptr);
2020-09-02 18:16:15 +08:00
2022-06-24 17:51:05 +08:00
Primitive *ro=new Primitive(vertex_count);
2020-09-02 18:16:15 +08:00
if(ro)
Add(ro);
return ro;
}
Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p)
2020-09-02 18:16:15 +08:00
{
if(!p||!mi||!r)
return(nullptr);
Renderable *ri=VK_NAMESPACE::CreateRenderable(r,mi,p);
2020-09-02 18:16:15 +08:00
if(ri)
Add(ri);
return ri;
}
2020-10-21 12:39:22 +08:00
Sampler *RenderResource::CreateSampler(VkSamplerCreateInfo *sci)
2020-09-02 18:16:15 +08:00
{
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);
2020-10-24 21:50:36 +08:00
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);
2022-09-26 16:11:42 +08:00
#ifdef _DEBUG
GPUDeviceAttribute *da=device->GetDeviceAttribute();
const UTF8String name=ToUTF8String(filename);
if(da->debug_maker)
da->debug_maker->SetImage(tex->GetImage(),name);
if(da->debug_utils)
da->debug_utils->SetImage(tex->GetImage(),name);
#endif//_DEBUG
}
return tex;
}
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;
}
2020-09-02 18:16:15 +08:00
VK_NAMESPACE_END