From ccf24106ab31063adb24abcf7ad6e631545db21a Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 16 Oct 2020 12:48:54 +0800 Subject: [PATCH] CreatePipeline functions support InlinePipeline --- CMSceneGraph | 2 +- example/Vulkan/texture_rect.cpp | 3 ++- example/common/VulkanAppFramework.h | 10 ++++++++++ inc/hgl/graph/vulkan/VK.h | 1 + inc/hgl/graph/vulkan/VKDatabase.h | 12 +++++++----- inc/hgl/graph/vulkan/VKPipeline.h | 1 + src/RenderDevice/Vulkan/VKDatabase.cpp | 20 ++++++++++++++++++++ src/RenderDevice/Vulkan/VKPipeline.cpp | 9 +++++++++ 8 files changed, 51 insertions(+), 7 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index 543cd58d..6113fb00 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 543cd58d70b60706c58b58ad9189249f27e1a63d +Subproject commit 6113fb00e0a3c8896de4018f554432679fc5fe43 diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 3818dabe..4ab1a476 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -4,6 +4,7 @@ #include"VulkanAppFramework.h" #include #include +#include #include using namespace hgl; @@ -62,7 +63,7 @@ private: material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D")); if(!material_instance)return(false); - pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/solid2d")); + pipeline=CreatePipeline(material_instance,vulkan::InlinePipeline::Solid2D); if(!pipeline)return(false); texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 2abca418..675ff1c0 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -269,6 +269,16 @@ public: public: //pipeline + vulkan::Pipeline *CreatePipeline(vulkan::Material *mtl,const vulkan::InlinePipeline &ip,const Prim &prim=Prim::Triangles,const bool prim_restart=false) + { + return db->CreatePipeline(mtl,sc_render_target,ip,prim,prim_restart); + } + + vulkan::Pipeline *CreatePipeline(vulkan::MaterialInstance *mi,const vulkan::InlinePipeline &ip,const Prim &prim=Prim::Triangles,const bool prim_restart=false) + { + return db->CreatePipeline(mi,sc_render_target,ip,prim,prim_restart); + } + vulkan::Pipeline *CreatePipeline(vulkan::Material *mtl,vulkan::PipelineData *pd,const Prim &prim=Prim::Triangles,const bool prim_restart=false) { return db->CreatePipeline(mtl,sc_render_target,pd,prim,prim_restart); diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index 78526d2d..f00c9cc5 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -59,6 +59,7 @@ class Material; class MaterialInstance; class PipelineLayout; struct PipelineData; +enum class InlinePipeline; class Pipeline; class DescriptorSets; class VertexAttributeBinding; diff --git a/inc/hgl/graph/vulkan/VKDatabase.h b/inc/hgl/graph/vulkan/VKDatabase.h index 9ef60112..a53fef42 100644 --- a/inc/hgl/graph/vulkan/VKDatabase.h +++ b/inc/hgl/graph/vulkan/VKDatabase.h @@ -97,11 +97,13 @@ public: //Material Material * CreateMaterial(const OSString &); MaterialInstance * CreateMaterialInstance(Material *); MaterialInstance * CreateMaterialInstance(const OSString &); - - Pipeline * CreatePipeline(Material *, RenderTarget *,PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(Material *, RenderTarget *,const OSString &,const Prim &prim=Prim::Triangles,const bool prim_restart=false); - Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,const OSString &,const Prim &prim=Prim::Triangles,const bool prim_restart=false); + + Pipeline * CreatePipeline(Material *, RenderTarget *,const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,const InlinePipeline &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline * CreatePipeline(Material *, RenderTarget *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *, PipelineData *, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline * CreatePipeline(Material *, RenderTarget *,const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); + Pipeline * CreatePipeline(MaterialInstance *, RenderTarget *,const OSString &, const Prim &prim=Prim::Triangles,const bool prim_restart=false); Renderable * CreateRenderable(const uint32_t vertex_count=0); TextRenderable * CreateTextRenderable(Material *); diff --git a/inc/hgl/graph/vulkan/VKPipeline.h b/inc/hgl/graph/vulkan/VKPipeline.h index c582b321..7d44159a 100644 --- a/inc/hgl/graph/vulkan/VKPipeline.h +++ b/inc/hgl/graph/vulkan/VKPipeline.h @@ -3,6 +3,7 @@ #include #include +#include #include VK_NAMESPACE_BEGIN class Pipeline diff --git a/src/RenderDevice/Vulkan/VKDatabase.cpp b/src/RenderDevice/Vulkan/VKDatabase.cpp index ab160087..7d6799a2 100644 --- a/src/RenderDevice/Vulkan/VKDatabase.cpp +++ b/src/RenderDevice/Vulkan/VKDatabase.cpp @@ -1,6 +1,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN VAB *Database::CreateVAB(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode) @@ -70,6 +71,25 @@ MaterialInstance *Database::CreateMaterialInstance(const OSString &mtl_filename) return CreateMaterialInstance(mtl); } +Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +{ + PipelineData *pd=GetPipelineData(ip); + + pd->Set(prim,prim_restart); + + Pipeline *p=device->CreatePipeline(pd,mtl,rt); + + if(p) + Add(p); + + return(p); +} + +Pipeline *Database::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) +{ + return CreatePipeline(mi->GetMaterial(),rt,ip,prim,prim_restart); +} + Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart) { pd->Set(prim,prim_restart); diff --git a/src/RenderDevice/Vulkan/VKPipeline.cpp b/src/RenderDevice/Vulkan/VKPipeline.cpp index e7b21f83..7c02a06e 100644 --- a/src/RenderDevice/Vulkan/VKPipeline.cpp +++ b/src/RenderDevice/Vulkan/VKPipeline.cpp @@ -40,6 +40,15 @@ Pipeline *CreatePipeline(VkDevice device,VkPipelineCache pipeline_cache,Pipeline return(new Pipeline(device,graphicsPipeline,data)); } +Pipeline *Device::CreatePipeline(const InlinePipeline &ip,const Material *mtl,const RenderTarget *rt) +{ + PipelineData *pd=GetPipelineData(ip); + + if(!pd)return(nullptr); + + return VK_NAMESPACE::CreatePipeline(attr->device,attr->pipeline_cache,pd,mtl,rt); +} + Pipeline *Device::CreatePipeline(PipelineData *pd,const Material *mtl,const RenderTarget *rt) { return VK_NAMESPACE::CreatePipeline(attr->device,attr->pipeline_cache,pd,mtl,rt);