From 5df8466cc8522a25ac660878d809f5282b138380 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 18 Sep 2020 11:45:52 +0800 Subject: [PATCH] upgrade the PipelineCreater, it don't need use RenderTarge when construct. --- example/Vulkan/Atomsphere.cpp | 4 ++-- inc/hgl/graph/vulkan/VKPipeline.h | 9 ++++---- src/RenderDevice/Vulkan/VKPipeline.cpp | 32 ++++++++++---------------- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/example/Vulkan/Atomsphere.cpp b/example/Vulkan/Atomsphere.cpp index 697ad512..f857e9e0 100644 --- a/example/Vulkan/Atomsphere.cpp +++ b/example/Vulkan/Atomsphere.cpp @@ -87,12 +87,12 @@ private: bool InitPipeline() { AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,material,sc_render_target); + pipeline_creater=new vulkan::PipelineCreater(device,material); pipeline_creater->SetDepthTest(true); pipeline_creater->SetDepthWrite(true); pipeline_creater->SetCullMode(VK_CULL_MODE_NONE); pipeline_creater->Set(Prim::Triangles); - pipeline_solid=pipeline_creater->Create(); + pipeline_solid=pipeline_creater->Create(sc_render_target); if(!pipeline_solid) return(false); diff --git a/inc/hgl/graph/vulkan/VKPipeline.h b/inc/hgl/graph/vulkan/VKPipeline.h index 23aada8f..77d5d385 100644 --- a/inc/hgl/graph/vulkan/VKPipeline.h +++ b/inc/hgl/graph/vulkan/VKPipeline.h @@ -40,7 +40,6 @@ constexpr size_t VK_DYNAMIC_STATE_RANGE_SIZE=VK_DYNAMIC_STATE_END_RANGE-VK_DYNAM class PipelineCreater { VkDevice device; - VkExtent2D extent; VkPipelineCache cache; VkGraphicsPipelineCreateInfo pipelineInfo; @@ -55,7 +54,7 @@ class PipelineCreater VkRect2D scissor; VkPipelineViewportStateCreateInfo viewportState; - void InitViewportState(); + void InitViewportState(const VkExtent2D &); VkPipelineRasterizationStateCreateInfo rasterizer; @@ -77,8 +76,8 @@ class PipelineCreater public: - PipelineCreater(Device *dev,const Material *,const RenderTarget *); - PipelineCreater(Device *dev,const Material *,const RenderTarget *,uchar *data,uint size); + PipelineCreater(Device *dev,const Material *,const uint32_t color_attachment_count=1); + PipelineCreater(Device *dev,const Material *,uchar *data,uint size); ~PipelineCreater()=default; bool Set(const Prim prim,bool=false); @@ -193,7 +192,7 @@ public: bool SaveToStream(io::DataOutputStream *dos); bool LoadFromMemory(uchar *,uint); - Pipeline *Create(); + Pipeline *Create(const RenderTarget *); };//class PipelineCreater VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_PIPELINE_INCLUDE diff --git a/src/RenderDevice/Vulkan/VKPipeline.cpp b/src/RenderDevice/Vulkan/VKPipeline.cpp index 54e1de5c..c30d89b3 100644 --- a/src/RenderDevice/Vulkan/VKPipeline.cpp +++ b/src/RenderDevice/Vulkan/VKPipeline.cpp @@ -27,7 +27,7 @@ void PipelineCreater::InitVertexInputState(const Material *material) } } -void PipelineCreater::InitViewportState() +void PipelineCreater::InitViewportState(const VkExtent2D &extent) { viewport.x = 0.0f; viewport.y = 0.0f; @@ -70,10 +70,9 @@ void PipelineCreater::InitDynamicState() //为什么一定要把ext放在这里,因为如果不放在这里,总是会让人遗忘它的重要性 -PipelineCreater::PipelineCreater(Device *dev,const Material *material,const RenderTarget *rt) +PipelineCreater::PipelineCreater(Device *dev,const Material *material,const uint32_t color_attachment_count) { device=dev->GetDevice(); - extent=rt->GetExtent(); cache=dev->GetPipelineCache(); //未来这里需要增加是否有vs/fs的检测 @@ -89,8 +88,6 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,const Rend pipelineInfo.pTessellationState=&tessellation; - InitViewportState(); - rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterizer.pNext = nullptr; rasterizer.flags = 0; @@ -151,7 +148,7 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,const Rend cba.srcAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; cba.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - colorBlendAttachments.Add(cba,rt->GetColorCount()); //这个需要和subpass中的color attachment数量相等,所以添加多份 + colorBlendAttachments.Add(cba,color_attachment_count); //这个需要和subpass中的color attachment数量相等,所以添加多份 alpha_blend=false; @@ -172,10 +169,6 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,const Rend InitDynamicState(); pipelineInfo.layout = material->GetPipelineLayout(); - { - pipelineInfo.renderPass = rt->GetRenderPass(); - pipelineInfo.subpass = 0; //subpass由于还不知道有什么用,所以暂时写0,待知道功用后,需改进 - } { pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; @@ -183,21 +176,17 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,const Rend } } -PipelineCreater::PipelineCreater(Device *dev,const Material *material,const RenderTarget *rt,uchar *data,uint size) +PipelineCreater::PipelineCreater(Device *dev,const Material *material,uchar *data,uint size) { LoadFromMemory(data,size); device=dev->GetDevice(); - extent=rt->GetExtent(); cache=dev->GetPipelineCache(); InitVertexInputState(material); pipelineInfo.pInputAssemblyState=&inputAssembly; pipelineInfo.pTessellationState =&tessellation; - - InitViewportState(); - pipelineInfo.pRasterizationState=&rasterizer; pipelineInfo.pMultisampleState =&multisampling; pipelineInfo.pDepthStencilState =&depthStencilState; @@ -206,10 +195,6 @@ PipelineCreater::PipelineCreater(Device *dev,const Material *material,const Rend InitDynamicState(); pipelineInfo.layout = material->GetPipelineLayout(); - { - pipelineInfo.renderPass = rt->GetRenderPass(); - pipelineInfo.subpass = 0; //subpass由于还不知道有什么用,所以暂时写0,待知道功用后,需改进 - } { pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; @@ -232,10 +217,17 @@ bool PipelineCreater::Set(const Prim topology,bool restart) return(true); } -Pipeline *PipelineCreater::Create() +Pipeline *PipelineCreater::Create(const RenderTarget *rt) { VkPipeline graphicsPipeline; + InitViewportState(rt->GetExtent()); + + { + pipelineInfo.renderPass = rt->GetRenderPass(); + pipelineInfo.subpass = 0; //subpass由于还不知道有什么用,所以暂时写0,待知道功用后,需改进 + } + if (vkCreateGraphicsPipelines(device, cache, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) return(nullptr);