From 906662f12b91d26060a261de0095cd1da169d1ab Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 21 Sep 2020 17:19:47 +0800 Subject: [PATCH] fix example programs. --- example/Vulkan/DrawTile.cpp | 4 +- example/Vulkan/HQFilterTexture.cpp | 128 ++++++++++++++----------- example/Vulkan/LoadStaticMesh.cpp | 8 +- example/Vulkan/RectanglePrimitive.cpp | 8 +- example/Vulkan/VulkanAppFramework.h | 12 ++- example/Vulkan/indices_rect.cpp | 85 +++++++--------- example/Vulkan/texture_rect.cpp | 73 ++++++-------- inc/hgl/graph/vulkan/VKDatabase.h | 2 + res | 2 +- src/RenderDevice/Vulkan/VKDatabase.cpp | 20 +++- 10 files changed, 170 insertions(+), 172 deletions(-) diff --git a/example/Vulkan/DrawTile.cpp b/example/Vulkan/DrawTile.cpp index e2b51458..2d4690a0 100644 --- a/example/Vulkan/DrawTile.cpp +++ b/example/Vulkan/DrawTile.cpp @@ -195,8 +195,8 @@ private: vertex_buffer =db->CreateVAB(VAF_VEC4,tile_count,vertex_data); tex_coord_buffer=db->CreateVAB(VAF_VEC4,tile_count,tex_coord_data); - render_obj->Set("Vertex",vertex_buffer); - render_obj->Set("TexCoord",tex_coord_buffer); + render_obj->Set(VAN::Position,vertex_buffer); + render_obj->Set(VAN::TexCoord,tex_coord_buffer); } bool InitPipeline() diff --git a/example/Vulkan/HQFilterTexture.cpp b/example/Vulkan/HQFilterTexture.cpp index e92947da..fd21041c 100644 --- a/example/Vulkan/HQFilterTexture.cpp +++ b/example/Vulkan/HQFilterTexture.cpp @@ -13,17 +13,16 @@ VK_NAMESPACE_BEGIN Texture2D *CreateTextureFromFile(Device *device,const OSString &filename); VK_NAMESPACE_END -constexpr uint32_t SCREEN_WIDTH=512; -constexpr uint32_t SCREEN_HEIGHT=512; +constexpr uint32_t SCREEN_SIZE=512; constexpr uint32_t VERTEX_COUNT=4; constexpr float vertex_data[VERTEX_COUNT][2]= { - {0,0}, - {1,0}, - {0,1}, - {1,1} + {0, 0}, + {1, 0}, + {0, 1}, + {1, 1} }; constexpr float tex_coord_data[VERTEX_COUNT][2]= @@ -46,31 +45,28 @@ class TestApp:public VulkanApplicationFramework { private: - struct MPD + vulkan::PipelineData * pipeline_data =nullptr;; + + struct MP { vulkan::Material * material =nullptr; vulkan::Pipeline * pipeline =nullptr; - vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; + }mp_normal,mp_hq; - public: - - ~MPD() - { - delete material; - delete render_obj; - delete material_instance; - delete pipeline; - } - }nearest,linear,nearest_hq,linear_hq; + struct MIR + { + MP * mp =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; + }mir_nearest,mir_linear,mir_nearest_hq,mir_linear_hq; vulkan::Texture2D * texture =nullptr; vulkan::Sampler * sampler_linear =nullptr; vulkan::Sampler * sampler_nearest =nullptr; - vulkan::VAB * vertex_buffer =nullptr; - vulkan::VAB * tex_coord_buffer =nullptr; + vulkan::VAB * vertex_buffer =nullptr; + vulkan::VAB * tex_coord_buffer =nullptr; vulkan::IndexBuffer * index_buffer =nullptr; SceneNode render_root; @@ -91,10 +87,10 @@ private: bool InitVBO() { - vertex_buffer =device->CreateVAB(FMT_RG32F,VERTEX_COUNT,vertex_data); + vertex_buffer =device->CreateVAB(VAF_VEC2,VERTEX_COUNT,vertex_data); if(!vertex_buffer)return(false); - tex_coord_buffer=device->CreateVAB(FMT_RG32F,VERTEX_COUNT,tex_coord_data); + tex_coord_buffer=device->CreateVAB(VAF_VEC2,VERTEX_COUNT,tex_coord_data); if(!tex_coord_buffer)return(false); index_buffer =device->CreateIBO16(INDEX_COUNT,index_data); @@ -135,36 +131,51 @@ private: return texture; } - bool InitMaterial(struct MPD *mpd,vulkan::Sampler *sampler,const OSString &fragment_shader) + bool InitMaterial(MP *mp,const OSString &mtl_name) { - mpd->material=shader_manage->CreateMaterial(OS_TEXT("res/shader/Texture2D.vert"), - OS_TEXT("res/shader/")+fragment_shader+OS_TEXT(".frag")); - if(!mpd->material) - return(false); + mp->material=db->CreateMaterial(mtl_name); + if(!mp->material)return(false); - mpd->material_instance=mpd->material->CreateInstance(); + mp->pipeline=CreatePipeline(mp->material,pipeline_data); + if(!mp->pipeline)return(false); - mpd->material_instance->BindSampler("tex",texture,sampler); - mpd->material_instance->Update(); - - mpd->render_obj=mpd->material->CreateRenderable(VERTEX_COUNT); - mpd->render_obj->Set("Vertex",vertex_buffer); - mpd->render_obj->Set("TexCoord",tex_coord_buffer); - mpd->render_obj->Set(index_buffer); - - AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,mpd->material,sc_render_target); - pipeline_creater->CloseCullFace(); - pipeline_creater->Set(Prim::Triangles); + mp->render_obj=db->CreateRenderable(mp->material,VERTEX_COUNT); + mp->render_obj->Set(VAN::Position,vertex_buffer); + mp->render_obj->Set(VAN::TexCoord,tex_coord_buffer); + mp->render_obj->Set(index_buffer); - mpd->pipeline=pipeline_creater->Create(); - - return mpd->pipeline; + return(true); } - bool Add(struct MPD *mpd,const Matrix4f &offset) + bool InitMaterial() { - RenderableInstance *ri=db->CreateRenderableInstance(mpd->pipeline,mpd->material_instance,mpd->render_obj); + pipeline_data=vulkan::GetPipelineData(OS_TEXT("res/pipeline/solid2d")); + if(!pipeline_data)return(false); + + if(!InitMaterial(&mp_normal,OS_TEXT("res/material/Texture2DPC")))return(false); + if(!InitMaterial(&mp_hq, OS_TEXT("res/material/Texture2DHQPC")))return(false); + + return(true); + } + + bool InitMIR(struct MIR *mir,vulkan::Sampler *sampler,MP *mp) + { + mir->material_instance=db->CreateMaterialInstance(mp->material); + if(!mir->material_instance)return(false); + + if(!mir->material_instance->BindSampler("tex",texture,sampler))return(false); + mir->material_instance->Update(); + + mir->mp=mp; + + return(true); + } + + bool Add(struct MIR *mir,const Matrix4f &offset) + { + RenderableInstance *ri=db->CreateRenderableInstance(mir->mp->pipeline, + mir->material_instance, + mir->mp->render_obj); if(!ri)return(false); @@ -175,10 +186,10 @@ private: bool InitScene() { - Add(&nearest, translate(-1,-1,0)); - Add(&linear, translate( 0,-1,0)); - Add(&nearest_hq,translate(-1, 0,0)); - Add(&linear_hq, translate( 0, 0,0)); + Add(&mir_nearest, translate(-1,-1,0)); + Add(&mir_linear, translate( 0,-1,0)); + Add(&mir_nearest_hq,translate(-1, 0,0)); + Add(&mir_linear_hq, translate( 0, 0,0)); render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); @@ -190,22 +201,25 @@ public: bool Init() { - if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) + if(!VulkanApplicationFramework::Init(SCREEN_SIZE,SCREEN_SIZE)) return(false); if(!InitVBO()) return(false); - sampler_nearest=InitSampler(VK_FILTER_NEAREST); - sampler_linear=InitSampler(VK_FILTER_LINEAR); - if(!InitTexture()) return(false); - if(!InitMaterial(&nearest, sampler_nearest ,OS_TEXT("FlatTexture")))return(false); - if(!InitMaterial(&linear, sampler_linear ,OS_TEXT("FlatTexture")))return(false); - if(!InitMaterial(&nearest_hq, sampler_nearest ,OS_TEXT("hqfilter")))return(false); - if(!InitMaterial(&linear_hq, sampler_linear ,OS_TEXT("hqfilter")))return(false); + if(!InitMaterial()) + return(false); + + sampler_nearest=InitSampler(VK_FILTER_NEAREST); + sampler_linear=InitSampler(VK_FILTER_LINEAR); + + if(!InitMIR(&mir_nearest, sampler_nearest ,&mp_normal ))return(false); + if(!InitMIR(&mir_linear, sampler_linear ,&mp_normal ))return(false); + if(!InitMIR(&mir_nearest_hq, sampler_nearest ,&mp_hq ))return(false); + if(!InitMIR(&mir_linear_hq, sampler_linear ,&mp_hq ))return(false); if(!InitScene()) return(false); diff --git a/example/Vulkan/LoadStaticMesh.cpp b/example/Vulkan/LoadStaticMesh.cpp index 4cd50b44..2d18d8b3 100644 --- a/example/Vulkan/LoadStaticMesh.cpp +++ b/example/Vulkan/LoadStaticMesh.cpp @@ -36,7 +36,7 @@ vulkan::Renderable *CreateMeshRenderable(Database *db,vulkan::Material *mtl,cons if(vertex_binding==-1) return(nullptr); - vulkan::VAB *vbo=db->CreateVAB(FMT_RGB32F,mesh->vertex_count,mesh->position); + vulkan::VAB *vbo=db->CreateVAB(VAF_VEC3,mesh->vertex_count,mesh->position); render_obj=mtl->CreateRenderable(); render_obj->Set(vertex_binding,vbo); @@ -47,7 +47,7 @@ vulkan::Renderable *CreateMeshRenderable(Database *db,vulkan::Material *mtl,cons if(normal_binding!=-1) { - vulkan::VAB *vbo=db->CreateVAB(FMT_RGB32F,mesh->vertex_count,mesh->normal); + vulkan::VAB *vbo=db->CreateVAB(VAF_VEC3,mesh->vertex_count,mesh->normal); render_obj->Set(normal_binding,vbo); } @@ -56,7 +56,7 @@ vulkan::Renderable *CreateMeshRenderable(Database *db,vulkan::Material *mtl,cons if(tagent_binding!=-1) { - vulkan::VAB *vbo=db->CreateVAB(FMT_RGB32F,mesh->vertex_count,mesh->tangent); + vulkan::VAB *vbo=db->CreateVAB(VAF_VEC3,mesh->vertex_count,mesh->tangent); render_obj->Set(tagent_binding,vbo); } @@ -65,7 +65,7 @@ vulkan::Renderable *CreateMeshRenderable(Database *db,vulkan::Material *mtl,cons if(bitagent_binding!=-1) { - vulkan::VAB *vbo=db->CreateVAB(FMT_RGB32F,mesh->vertex_count,mesh->bitangent); + vulkan::VAB *vbo=db->CreateVAB(VAF_VEC3,mesh->vertex_count,mesh->bitangent); render_obj->Set(bitagent_binding,vbo); } diff --git a/example/Vulkan/RectanglePrimitive.cpp b/example/Vulkan/RectanglePrimitive.cpp index 4081a421..9873abfd 100644 --- a/example/Vulkan/RectanglePrimitive.cpp +++ b/example/Vulkan/RectanglePrimitive.cpp @@ -93,11 +93,11 @@ private: void InitVBO() { - vertex_buffer =db->CreateVAB(FMT_RGBA32F,VERTEX_COUNT,vertex_data); - tex_coord_buffer=db->CreateVAB(FMT_RGBA32F,VERTEX_COUNT,tex_coord_data); + vertex_buffer =db->CreateVAB(VAF_VEC4,VERTEX_COUNT,vertex_data); + tex_coord_buffer=db->CreateVAB(VAF_VEC4,VERTEX_COUNT,tex_coord_data); - render_obj->Set("Vertex",vertex_buffer); - render_obj->Set("TexCoord",tex_coord_buffer); + render_obj->Set(VAN::Position,vertex_buffer); + render_obj->Set(VAN::TexCoord,tex_coord_buffer); } bool InitPipeline() diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 7fdb6354..3b2309ad 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -267,7 +267,17 @@ public: return(true); } -public: +public: //pipeline + + 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); + } + + vulkan::Pipeline *CreatePipeline(vulkan::MaterialInstance *mi,vulkan::PipelineData *pd,const Prim &prim=Prim::Triangles,const bool prim_restart=false) + { + return db->CreatePipeline(mi,sc_render_target,pd,prim,prim_restart); + } vulkan::Pipeline *CreatePipeline(vulkan::Material *mtl,const OSString &pipeline_name,const Prim &prim=Prim::Triangles,const bool prim_restart=false) { diff --git a/example/Vulkan/indices_rect.cpp b/example/Vulkan/indices_rect.cpp index d9f267b9..2bb23964 100644 --- a/example/Vulkan/indices_rect.cpp +++ b/example/Vulkan/indices_rect.cpp @@ -14,15 +14,12 @@ constexpr uint32_t VERTEX_COUNT=4; static Vector4f color(1,1,1,1); -constexpr float SSP=0.25; -constexpr float SSN=1-SSP; - constexpr float vertex_data[VERTEX_COUNT][2]= { - {SCREEN_WIDTH*SSP, SCREEN_HEIGHT*SSP}, - {SCREEN_WIDTH*SSN, SCREEN_HEIGHT*SSP}, - {SCREEN_WIDTH*SSP, SCREEN_HEIGHT*SSN}, - {SCREEN_WIDTH*SSN, SCREEN_HEIGHT*SSN} + {0,0}, + {SCREEN_WIDTH,0}, + {0,SCREEN_HEIGHT}, + {SCREEN_WIDTH,SCREEN_HEIGHT} }; constexpr uint32_t INDEX_COUNT=6; @@ -37,17 +34,15 @@ class TestApp:public VulkanApplicationFramework { private: - WorldMatrix wm; + Camera cam; - vulkan::Material * material =nullptr; vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr; - vulkan::Buffer * ubo_color_material =nullptr; vulkan::Pipeline * pipeline =nullptr; - vulkan::VAB *vertex_buffer =nullptr; + vulkan::VAB * vertex_buffer =nullptr; vulkan::IndexBuffer * index_buffer =nullptr; public: @@ -56,66 +51,52 @@ public: { SAFE_CLEAR(index_buffer); SAFE_CLEAR(vertex_buffer); - SAFE_CLEAR(pipeline); - SAFE_CLEAR(ubo_color_material); - SAFE_CLEAR(ubo_world_matrix); - SAFE_CLEAR(render_obj); - SAFE_CLEAR(material_instance); - SAFE_CLEAR(material); } private: bool InitMaterial() { - material=shader_manage->CreateMaterial(OS_TEXT("res/shader/OnlyPosition.vert"), - OS_TEXT("res/shader/HexGrid.frag")); - if(!material) - return(false); - - render_obj=material->CreateRenderable(VERTEX_COUNT); - material_instance=material->CreateInstance(); + material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/FragColor")); + if(!material_instance)return(false); + + pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/solid2d")); //等同上一行,为Framework重载,默认使用swapchain的render target return(true); } - + bool InitUBO() { const VkExtent2D extent=sc_render_target->GetExtent(); - wm.ortho=ortho(extent.width,extent.height); - wm.canvas_resolution.x=extent.width; - wm.canvas_resolution.y=extent.height; + cam.vp_width=cam.width=extent.width; + cam.vp_height=cam.height=extent.height; - ubo_world_matrix =device->CreateUBO(sizeof(WorldMatrix),&wm); - ubo_color_material =device->CreateUBO(sizeof(Vector4f),&color); + cam.Refresh(); + + ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&cam.matrix); + + if(!ubo_world_matrix) + return(false); + + if(!material_instance->BindUBO("world",ubo_world_matrix))return(false); + if(!material_instance->BindUBO("frag_world",ubo_world_matrix))return(false); - material_instance->BindUBO("world",ubo_world_matrix); - material_instance->BindUBO("fs_world",ubo_world_matrix); - material_instance->BindUBO("color_material",ubo_color_material); - material_instance->Update(); return(true); } - void InitVBO() - { - vertex_buffer =device->CreateVAB(FMT_RG32F,VERTEX_COUNT,vertex_data); + bool InitVBO() + { + render_obj=db->CreateRenderable(material_instance,VERTEX_COUNT); + if(!render_obj)return(false); + + vertex_buffer =device->CreateVAB(VAF_VEC2,VERTEX_COUNT,vertex_data); index_buffer =device->CreateIBO16(INDEX_COUNT,index_data); - render_obj->Set("Vertex",vertex_buffer); - render_obj->Set(index_buffer); - } + if(!render_obj->Set(VAN::Position,vertex_buffer))return(false); + if(!render_obj->Set(index_buffer))return(false); - bool InitPipeline() - { - AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,material,sc_render_target); - pipeline_creater->CloseCullFace(); - pipeline_creater->Set(Prim::Triangles); - - pipeline=pipeline_creater->Create(); - - return pipeline; + return(true); } public: @@ -131,9 +112,7 @@ public: if(!InitUBO()) return(false); - InitVBO(); - - if(!InitPipeline()) + if(!InitVBO()) return(false); BuildCommandBuffer(pipeline,material_instance,render_obj); diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index d4a8cf34..8e0bdbd9 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -48,17 +48,16 @@ class TestApp:public VulkanApplicationFramework private: - vulkan::Material * material =nullptr; vulkan::Texture2D * texture =nullptr; vulkan::Sampler * sampler =nullptr; vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; - vulkan::Buffer * ubo_world_matrix =nullptr; + vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Pipeline * pipeline =nullptr; - vulkan::VAB * vertex_buffer =nullptr; - vulkan::VAB * tex_coord_buffer =nullptr; + vulkan::VAB * vertex_buffer =nullptr; + vulkan::VAB * tex_coord_buffer =nullptr; vulkan::IndexBuffer * index_buffer =nullptr; public: @@ -68,34 +67,25 @@ public: SAFE_CLEAR(index_buffer); SAFE_CLEAR(tex_coord_buffer); SAFE_CLEAR(vertex_buffer); - SAFE_CLEAR(pipeline); - SAFE_CLEAR(ubo_world_matrix); - SAFE_CLEAR(render_obj); - SAFE_CLEAR(material_instance); - SAFE_CLEAR(sampler); SAFE_CLEAR(texture); - SAFE_CLEAR(material); } private: bool InitMaterial() { - material=shader_manage->CreateMaterial(OS_TEXT("res/shader/FlatTexture.vert"), - OS_TEXT("res/shader/FlatTexture.frag")); - if(!material) - return(false); + material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D")); + if(!material_instance)return(false); - render_obj=material->CreateRenderable(VERTEX_COUNT); - material_instance=material->CreateInstance(); + pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/solid2d")); + if(!pipeline)return(false); texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); + if(!texture)return(false); - sampler=device->CreateSampler(); + sampler=db->CreateSampler(); material_instance->BindSampler("tex",texture,sampler); - material_instance->BindUBO("world",ubo_world_matrix); - material_instance->Update(); return(true); } @@ -104,40 +94,35 @@ private: { const VkExtent2D extent=sc_render_target->GetExtent(); - cam.width=extent.width; - cam.height=extent.height; + cam.vp_width=cam.width=extent.width; + cam.vp_height=cam.height=extent.height; cam.Refresh(); - ubo_world_matrix=device->CreateUBO(sizeof(WorldMatrix),&cam.matrix); + ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&cam.matrix); if(!ubo_world_matrix) return(false); + if(!material_instance->BindUBO("world",ubo_world_matrix))return(false); + material_instance->Update(); return(true); } - void InitVBO() + bool InitVBO() { - vertex_buffer =device->CreateVAB(FMT_RG32F,VERTEX_COUNT,vertex_data); - tex_coord_buffer=device->CreateVAB(FMT_RG32F,VERTEX_COUNT,tex_coord_data); + render_obj=db->CreateRenderable(material_instance,VERTEX_COUNT); + if(!render_obj)return(false); + + vertex_buffer =device->CreateVAB(VAF_VEC2,VERTEX_COUNT,vertex_data); + tex_coord_buffer=device->CreateVAB(VAF_VEC2,VERTEX_COUNT,tex_coord_data); index_buffer =device->CreateIBO16(INDEX_COUNT,index_data); - render_obj->Set("Vertex",vertex_buffer); - render_obj->Set("TexCoord",tex_coord_buffer); - render_obj->Set(index_buffer); - } + if(!render_obj->Set(VAN::Position,vertex_buffer))return(false); + if(!render_obj->Set(VAN::TexCoord,tex_coord_buffer))return(false); + if(!render_obj->Set(index_buffer))return(false); - bool InitPipeline() - { - AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,material,sc_render_target); - pipeline_creater->CloseCullFace(); - pipeline_creater->Set(Prim::Triangles); - - pipeline=pipeline_creater->Create(); - - return pipeline; + return(true); } public: @@ -146,16 +131,14 @@ public: { if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); + + if(!InitMaterial()) + return(false); if(!InitUBO()) return(false); - if(!InitMaterial()) - return(false); - - InitVBO(); - - if(!InitPipeline()) + if(!InitVBO()) return(false); BuildCommandBuffer(pipeline,material_instance,render_obj); diff --git a/inc/hgl/graph/vulkan/VKDatabase.h b/inc/hgl/graph/vulkan/VKDatabase.h index 85655ed5..ad700a66 100644 --- a/inc/hgl/graph/vulkan/VKDatabase.h +++ b/inc/hgl/graph/vulkan/VKDatabase.h @@ -98,6 +98,8 @@ public: //Material 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); diff --git a/res b/res index 2d7cfd18..8bcb5c9e 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 2d7cfd18ea4bd4db7303f1d64502d3b862c927f2 +Subproject commit 8bcb5c9e782fbe37c735ac7757a08a568a3f9eee diff --git a/src/RenderDevice/Vulkan/VKDatabase.cpp b/src/RenderDevice/Vulkan/VKDatabase.cpp index 5c96ade8..29436547 100644 --- a/src/RenderDevice/Vulkan/VKDatabase.cpp +++ b/src/RenderDevice/Vulkan/VKDatabase.cpp @@ -70,12 +70,8 @@ MaterialInstance *Database::CreateMaterialInstance(const OSString &mtl_filename) return CreateMaterialInstance(mtl); } -Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) +Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart) { - PipelineData *pd=vulkan::GetPipelineData(pipeline_filename); - - if(!pd)return(nullptr); - pd->Set(prim,prim_restart); Pipeline *p=device->CreatePipeline(pd,mtl,rt); @@ -86,6 +82,20 @@ Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,const OSString return(p); } +Pipeline *Database::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,PipelineData *pd,const Prim &prim,const bool prim_restart) +{ + return CreatePipeline(mi->GetMaterial(),rt,pd,prim,prim_restart); +} + +Pipeline *Database::CreatePipeline(Material *mtl,RenderTarget *rt,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) +{ + PipelineData *pd=vulkan::GetPipelineData(pipeline_filename); + + if(!pd)return(nullptr); + + return CreatePipeline(mtl,rt,pd,prim,prim_restart); +} + Pipeline *Database::CreatePipeline(MaterialInstance *mi,RenderTarget *rt,const OSString &filename,const Prim &prim,const bool prim_restart) { return CreatePipeline(mi->GetMaterial(),rt,filename,prim,prim_restart);