2020-10-21 12:39:22 +08:00
|
|
|
|
#include<hgl/graph/VKRenderResource.h>
|
2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VKDevice.h>
|
|
|
|
|
#include<hgl/graph/VKRenderableInstance.h>
|
|
|
|
|
#include<hgl/graph/VKInlinePipeline.h>
|
2020-09-02 18:16:15 +08:00
|
|
|
|
|
|
|
|
|
VK_NAMESPACE_BEGIN
|
2020-10-21 12:39:22 +08:00
|
|
|
|
VAB *RenderResource::CreateVAB(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode)
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{
|
|
|
|
|
VAB *vb=device->CreateVAB(format,count,data,sharing_mode);
|
|
|
|
|
|
|
|
|
|
if(!vb)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
|
|
|
|
rm_buffers.Add(vb);
|
|
|
|
|
|
|
|
|
|
return vb;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +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-10-21 12:09:15 +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-10-21 12:39:22 +08:00
|
|
|
|
GPUBuffer *RenderResource::Create##name(VkDeviceSize size,SharingMode sharing_mode) \
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{ \
|
2020-10-21 12:09:15 +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);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
MaterialInstance *RenderResource::CreateMaterialInstance(Material *mtl)
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{
|
|
|
|
|
if(!mtl)return(nullptr);
|
|
|
|
|
|
|
|
|
|
MaterialInstance *mi=mtl->CreateInstance();
|
|
|
|
|
|
|
|
|
|
if(mi)
|
|
|
|
|
Add(mi);
|
|
|
|
|
|
|
|
|
|
return mi;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
MaterialInstance *RenderResource::CreateMaterialInstance(const OSString &mtl_filename)
|
2020-09-19 23:49:32 +08:00
|
|
|
|
{
|
|
|
|
|
Material *mtl=this->CreateMaterial(mtl_filename);
|
|
|
|
|
|
|
|
|
|
if(!mtl)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
|
|
|
|
return CreateMaterialInstance(mtl);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
|
2020-10-16 12:48:54 +08:00
|
|
|
|
{
|
|
|
|
|
PipelineData *pd=GetPipelineData(ip);
|
|
|
|
|
|
|
|
|
|
pd->Set(prim,prim_restart);
|
|
|
|
|
|
|
|
|
|
Pipeline *p=device->CreatePipeline(pd,mtl,rt);
|
|
|
|
|
|
|
|
|
|
if(p)
|
|
|
|
|
Add(p);
|
|
|
|
|
|
|
|
|
|
return(p);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
|
2020-10-16 12:48:54 +08:00
|
|
|
|
{
|
|
|
|
|
return CreatePipeline(mi->GetMaterial(),rt,ip,prim,prim_restart);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart)
|
2020-09-19 23:49:32 +08:00
|
|
|
|
{
|
|
|
|
|
pd->Set(prim,prim_restart);
|
|
|
|
|
|
|
|
|
|
Pipeline *p=device->CreatePipeline(pd,mtl,rt);
|
|
|
|
|
|
|
|
|
|
if(p)
|
|
|
|
|
Add(p);
|
|
|
|
|
|
|
|
|
|
return(p);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart)
|
2020-09-21 17:19:47 +08:00
|
|
|
|
{
|
|
|
|
|
return CreatePipeline(mi->GetMaterial(),rt,pd,prim,prim_restart);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(Material *mtl,RenderTarget *rt,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart)
|
2020-09-21 17:19:47 +08:00
|
|
|
|
{
|
2020-10-21 12:47:06 +08:00
|
|
|
|
PipelineData *pd=GetPipelineData(pipeline_filename);
|
2020-09-21 17:19:47 +08:00
|
|
|
|
|
|
|
|
|
if(!pd)return(nullptr);
|
|
|
|
|
|
|
|
|
|
return CreatePipeline(mtl,rt,pd,prim,prim_restart);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Pipeline *RenderResource::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const OSString &filename,const Prim &prim,const bool prim_restart)
|
2020-09-19 23:49:32 +08:00
|
|
|
|
{
|
|
|
|
|
return CreatePipeline(mi->GetMaterial(),rt,filename,prim,prim_restart);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
Renderable *RenderResource::CreateRenderable(const uint32_t vertex_count)
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{
|
2020-09-21 19:05:25 +08:00
|
|
|
|
if(!vertex_count)return(nullptr);
|
2020-09-02 18:16:15 +08:00
|
|
|
|
|
2020-09-21 19:05:25 +08:00
|
|
|
|
Renderable *ro=new Renderable(vertex_count);
|
2020-09-02 18:16:15 +08:00
|
|
|
|
|
|
|
|
|
if(ro)
|
|
|
|
|
Add(ro);
|
|
|
|
|
|
|
|
|
|
return ro;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
TextRenderable *RenderResource::CreateTextRenderable(Material *mtl)
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{
|
|
|
|
|
if(!mtl)return(nullptr);
|
|
|
|
|
|
|
|
|
|
TextRenderable *tr=new TextRenderable(device,mtl);
|
|
|
|
|
|
|
|
|
|
if(tr)
|
|
|
|
|
Add(tr);
|
|
|
|
|
|
|
|
|
|
return tr;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
RenderableInstance *RenderResource::CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p)
|
2020-09-02 18:16:15 +08:00
|
|
|
|
{
|
|
|
|
|
if(!p||!mi||!r)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
2020-09-21 19:05:25 +08:00
|
|
|
|
RenderableInstance *ri=VK_NAMESPACE::CreateRenderableInstance(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;
|
|
|
|
|
}
|
|
|
|
|
VK_NAMESPACE_END
|