删除PipelineLayout类,数据并入Pipeline类

This commit is contained in:
HuYingzhuo 2019-04-28 17:47:58 +08:00
parent 20f2aa7277
commit 9d8da06a3e
10 changed files with 65 additions and 132 deletions

View File

@ -19,7 +19,6 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp
VKDeviceBuffer.cpp VKDeviceBuffer.cpp
VKBuffer.cpp VKBuffer.cpp
VKDescriptorSets.cpp VKDescriptorSets.cpp
VKPipelineLayout.cpp
VKRenderPass.cpp VKRenderPass.cpp
VKShaderModule.cpp VKShaderModule.cpp
VKShaderModuleManage.cpp VKShaderModuleManage.cpp
@ -45,7 +44,6 @@ SET(VULKAN_TEST_HEADER_FILES AssetsManage.h
VKDevice.h VKDevice.h
VKBuffer.h VKBuffer.h
VKDescriptorSets.h VKDescriptorSets.h
VKPipelineLayout.h
VKRenderPass.h VKRenderPass.h
VKShaderModule.h VKShaderModule.h
VKShaderModuleManage.h VKShaderModuleManage.h

View File

@ -2,7 +2,6 @@
#include"VKRenderPass.h" #include"VKRenderPass.h"
#include"VKFramebuffer.h" #include"VKFramebuffer.h"
#include"VKPipeline.h" #include"VKPipeline.h"
#include"VKPipelineLayout.h"
#include"VKBuffer.h" #include"VKBuffer.h"
#include"VKRenderable.h" #include"VKRenderable.h"
#include"VKDescriptorSets.h" #include"VKDescriptorSets.h"
@ -72,15 +71,10 @@ bool CommandBuffer::Bind(Pipeline *p)
{ {
if(!p)return(false); if(!p)return(false);
vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, *p); if(p->GetDescriptorSetCount()>0)
return(true); vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, p->GetLayout(), 0, p->GetDescriptorSetCount(),p->GetDescriptorSets(), 0, nullptr);
}
bool CommandBuffer::Bind(PipelineLayout *pl) vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS,*p);
{
if(!pl)return(false);
if(pl->GetDescriptorSetCount()>0)
vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pl, 0, pl->GetDescriptorSetCount(),pl->GetDescriptorSets(), 0, nullptr);
return(true); return(true);
} }

View File

@ -96,19 +96,40 @@ MaterialInstance *Material::CreateInstance()const
DescriptorSetLayout *dsl=dsl_creater->Create(); DescriptorSetLayout *dsl=dsl_creater->Create();
return(new MaterialInstance(this,vertex_sm,vab,dsl)); const uint32_t layout_count=dsl->GetCount();
const VkDescriptorSetLayout *layouts=(layout_count>0?dsl->GetLayouts():nullptr);
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pPipelineLayoutCreateInfo.pNext = nullptr;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
pPipelineLayoutCreateInfo.setLayoutCount = layout_count;
pPipelineLayoutCreateInfo.pSetLayouts = layouts;
VkPipelineLayout pipeline_layout;
if(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)!=VK_SUCCESS)
return(nullptr);
return(new MaterialInstance(device,this,vertex_sm,vab,dsl,pipeline_layout));
} }
MaterialInstance::MaterialInstance(const Material *m,const VertexShaderModule *vsm,VertexAttributeBinding *v,DescriptorSetLayout *d) MaterialInstance::MaterialInstance(VkDevice dev,const Material *m,const VertexShaderModule *vsm,VertexAttributeBinding *v,DescriptorSetLayout *d,VkPipelineLayout pl)
{ {
device=dev;
mat=m; mat=m;
vertex_sm=vsm; vertex_sm=vsm;
vab=v; vab=v;
desc_set_layout=d; desc_set_layout=d;
pipeline_layout=pl;
} }
MaterialInstance::~MaterialInstance() MaterialInstance::~MaterialInstance()
{ {
if(pipeline_layout)
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
delete desc_set_layout; delete desc_set_layout;
delete vab; delete vab;
} }
@ -123,6 +144,11 @@ void MaterialInstance::Write(VkPipelineVertexInputStateCreateInfo &vis)const
return vab->Write(vis); return vab->Write(vis);
} }
const List<VkDescriptorSet> *MaterialInstance::GetDescriptorSets()const
{
return &(desc_set_layout->GetSets());
}
Renderable *MaterialInstance::CreateRenderable() Renderable *MaterialInstance::CreateRenderable()
{ {
return(new Renderable(vertex_sm)); return(new Renderable(vertex_sm));

View File

@ -14,6 +14,7 @@ class MaterialInstance;
class VertexAttributeBinding; class VertexAttributeBinding;
class VertexBuffer; class VertexBuffer;
class Renderable; class Renderable;
class PipelineLayout;
using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>; using ShaderModuleMap=hgl::Map<VkShaderStageFlagBits,const ShaderModule *>;
@ -50,14 +51,17 @@ public:
*/ */
class MaterialInstance class MaterialInstance
{ {
VkDevice device;
const Material *mat; ///<这里的是对material的完全引用不做任何修改 const Material *mat; ///<这里的是对material的完全引用不做任何修改
const VertexShaderModule *vertex_sm; const VertexShaderModule *vertex_sm;
VertexAttributeBinding *vab; VertexAttributeBinding *vab;
DescriptorSetLayout *desc_set_layout; DescriptorSetLayout *desc_set_layout;
VkPipelineLayout pipeline_layout;
public: public:
MaterialInstance(const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d); MaterialInstance(VkDevice dev,const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d,VkPipelineLayout pl);
~MaterialInstance(); ~MaterialInstance();
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info); bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
@ -69,14 +73,13 @@ public:
return UpdateUBO(mat->GetUBOBinding(name),buf_info); return UpdateUBO(mat->GetUBOBinding(name),buf_info);
} }
const VertexShaderModule * GetVertexShader ()const{return vertex_sm;}
const uint32_t GetStageCount ()const{return mat->GetStageCount();} const uint32_t GetStageCount ()const{return mat->GetStageCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();} const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();}
void Write(VkPipelineVertexInputStateCreateInfo &vis)const; void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
DescriptorSetLayout * GetDSL(){return desc_set_layout;} const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
const List<VkDescriptorSet> * GetDescriptorSets ()const;
Renderable *CreateRenderable(); Renderable *CreateRenderable();
};//class MaterialInstance };//class MaterialInstance

View File

@ -9,14 +9,21 @@ Pipeline::~Pipeline()
vkDestroyPipeline(device,pipeline,nullptr); vkDestroyPipeline(device,pipeline,nullptr);
} }
PipelineCreater::PipelineCreater(Device *dev,RenderPass *rp) PipelineCreater::PipelineCreater(Device *dev,const MaterialInstance *mi,RenderPass *rp)
{ {
device=dev->GetDevice(); device=dev->GetDevice();
extent=dev->GetExtent(); extent=dev->GetExtent();
cache=dev->GetPipelineCache(); cache=dev->GetPipelineCache();
material=mi;
//未来这里需要增加是否有vs/fs的检测
hgl_zero(pipelineInfo); hgl_zero(pipelineInfo);
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.layout = material->GetPipelineLayout();
pipelineInfo.stageCount=material->GetStageCount();
pipelineInfo.pStages=material->GetStages();
{ {
if(!rp) if(!rp)
@ -31,11 +38,7 @@ PipelineCreater::PipelineCreater(Device *dev,RenderPass *rp)
vis_create_info.pNext = nullptr; vis_create_info.pNext = nullptr;
vis_create_info.flags = 0; vis_create_info.flags = 0;
vis_create_info.vertexBindingDescriptionCount = 0; material->Write(vis_create_info);
vis_create_info.pVertexBindingDescriptions = nullptr;
vis_create_info.vertexAttributeDescriptionCount = 0;
vis_create_info.pVertexAttributeDescriptions = nullptr;
pipelineInfo.pVertexInputState=&vis_create_info; pipelineInfo.pVertexInputState=&vis_create_info;
} }
@ -147,20 +150,6 @@ PipelineCreater::PipelineCreater(Device *dev,RenderPass *rp)
pipelineInfo.basePipelineIndex = 0; pipelineInfo.basePipelineIndex = 0;
} }
bool PipelineCreater::Set(const MaterialInstance *mi)
{
if(!mi)return(false);
//未来这里需要增加是否有vs/fs的检测
pipelineInfo.stageCount=mi->GetStageCount();
pipelineInfo.pStages=mi->GetStages();
mi->Write(vis_create_info);
return(true);
}
bool PipelineCreater::Set(const VkPrimitiveTopology topology,bool restart) bool PipelineCreater::Set(const VkPrimitiveTopology topology,bool restart)
{ {
if(topology<VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE||topology>VK_PRIMITIVE_TOPOLOGY_END_RANGE) if(topology<VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE||topology>VK_PRIMITIVE_TOPOLOGY_END_RANGE)
@ -176,14 +165,6 @@ bool PipelineCreater::Set(const VkPrimitiveTopology topology,bool restart)
return(true); return(true);
} }
bool PipelineCreater::Set(VkPipelineLayout pl)
{
if(!pl)return(false);
pipelineInfo.layout = pl;
return(true);
}
Pipeline *PipelineCreater::Create() Pipeline *PipelineCreater::Create()
{ {
VkPipeline graphicsPipeline; VkPipeline graphicsPipeline;
@ -191,6 +172,8 @@ Pipeline *PipelineCreater::Create()
if (vkCreateGraphicsPipelines(device, cache, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) if (vkCreateGraphicsPipelines(device, cache, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS)
return(nullptr); return(nullptr);
return(new Pipeline(device,graphicsPipeline)); return(new Pipeline(device,graphicsPipeline,
material->GetPipelineLayout(),
material->GetDescriptorSets()));
} }
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -13,13 +13,21 @@ class Pipeline
{ {
VkDevice device; VkDevice device;
VkPipeline pipeline; VkPipeline pipeline;
VkPipelineLayout pipeline_layout;
const List<VkDescriptorSet> *desc_sets;
public: public:
Pipeline(VkDevice dev,VkPipeline p){device=dev;pipeline=p;} Pipeline(VkDevice dev,VkPipeline p,VkPipelineLayout pl,const List<VkDescriptorSet> *ds){device=dev;pipeline=p;pipeline_layout=pl;desc_sets=ds;}
virtual ~Pipeline(); virtual ~Pipeline();
operator VkPipeline(){return pipeline;} operator VkPipeline(){return pipeline;}
VkPipelineLayout GetLayout(){return pipeline_layout;}
const uint32_t GetDescriptorSetCount()const{return desc_sets->GetCount();}
const VkDescriptorSet * GetDescriptorSets()const{return desc_sets->GetData();}
};//class GraphicsPipeline };//class GraphicsPipeline
class Shader; class Shader;
@ -52,17 +60,14 @@ class PipelineCreater
private: private:
const Shader * shader =nullptr; const MaterialInstance *material=nullptr;
const VertexInput * vertex_input=nullptr;
public: public:
PipelineCreater(Device *dev,RenderPass *rp=nullptr); PipelineCreater(Device *dev,const MaterialInstance *,RenderPass *rp=nullptr);
~PipelineCreater()=default; ~PipelineCreater()=default;
bool Set(const MaterialInstance *);
bool Set(const VkPrimitiveTopology,bool=false); bool Set(const VkPrimitiveTopology,bool=false);
bool Set(VkPipelineLayout pl);
void SetViewport( float x,float y,float w,float h){viewport.x=x;viewport.y=y;viewport.width=w;viewport.height=h;} void SetViewport( float x,float y,float w,float h){viewport.x=x;viewport.y=y;viewport.width=w;viewport.height=h;}
void SetDepthRange( float min_depth,float max_depth){viewport.minDepth=min_depth;viewport.maxDepth=max_depth;} void SetDepthRange( float min_depth,float max_depth){viewport.minDepth=min_depth;viewport.maxDepth=max_depth;}

View File

@ -1,31 +0,0 @@
#include"VKPipelineLayout.h"
#include"VKDescriptorSets.h"
VK_NAMESPACE_BEGIN
PipelineLayout::~PipelineLayout()
{
if(layout)
vkDestroyPipelineLayout(device,layout,nullptr);
}
PipelineLayout *CreatePipelineLayout(VkDevice dev,const DescriptorSetLayout *dsl)
{
const uint32_t layout_count=(dsl?dsl->GetCount():0);
const VkDescriptorSetLayout *layouts=(layout_count>0?dsl->GetLayouts():nullptr);
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pPipelineLayoutCreateInfo.pNext = nullptr;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
pPipelineLayoutCreateInfo.setLayoutCount = layout_count;
pPipelineLayoutCreateInfo.pSetLayouts = layouts;
VkPipelineLayout pipeline_layout;
if(vkCreatePipelineLayout(dev, &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)!=VK_SUCCESS)
return(nullptr);
return(new PipelineLayout(dev,pipeline_layout,dsl->GetSets()));
}
VK_NAMESPACE_END

View File

@ -1,32 +0,0 @@
#ifndef HGL_GRAPH_VULKAN_PIPELINE_LAYOUT_INCLUDE
#define HGL_GRAPH_VULKAN_PIPELINE_LAYOUT_INCLUDE
#include"VK.h"
#include"VKDescriptorSets.h"
VK_NAMESPACE_BEGIN
class PipelineLayout
{
VkDevice device;
VkPipelineLayout layout;
List<VkDescriptorSet> desc_sets;
private:
friend PipelineLayout *CreatePipelineLayout(VkDevice dev,const DescriptorSetLayout *dsl);
PipelineLayout(VkDevice dev,VkPipelineLayout pl,const List<VkDescriptorSet> &ds){device=dev;layout=pl;desc_sets=ds;}
public:
~PipelineLayout();
operator VkPipelineLayout (){return layout;}
const uint32_t GetDescriptorSetCount ()const{return desc_sets.GetCount();}
const VkDescriptorSet * GetDescriptorSets ()const{return desc_sets.GetData();}
};//class PipelineLayout
PipelineLayout *CreatePipelineLayout(VkDevice dev,const DescriptorSetLayout *dsl);
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_PIPELINE_LAYOUT_INCLUDE

View File

@ -70,8 +70,6 @@ bool VertexAttributeBinding::SetOffset(const uint index,const uint32_t offset)
void VertexAttributeBinding::Write(VkPipelineVertexInputStateCreateInfo &vis_create_info) const void VertexAttributeBinding::Write(VkPipelineVertexInputStateCreateInfo &vis_create_info) const
{ {
vis_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
const uint32_t count=vsm->GetAttrCount(); const uint32_t count=vsm->GetAttrCount();
vis_create_info.vertexBindingDescriptionCount = count; vis_create_info.vertexBindingDescriptionCount = count;

View File

@ -9,7 +9,6 @@
#include"VKRenderable.h" #include"VKRenderable.h"
#include"VKDescriptorSets.h" #include"VKDescriptorSets.h"
#include"VKRenderPass.h" #include"VKRenderPass.h"
#include"VKPipelineLayout.h"
#include"VKPipeline.h" #include"VKPipeline.h"
#include"VKCommandBuffer.h" #include"VKCommandBuffer.h"
#include"VKFormat.h" #include"VKFormat.h"
@ -131,24 +130,16 @@ int main(int,char **)
vulkan::MaterialInstance *mi=material->CreateInstance(); vulkan::MaterialInstance *mi=material->CreateInstance();
vulkan::Renderable *render_obj=mi->CreateRenderable(); vulkan::Renderable *render_obj=mi->CreateRenderable();
vulkan::Buffer *ubo=CreateUBO(device);
vulkan::PipelineCreater pc(device);
mi->UpdateUBO("world",*ubo);
CreateVertexBuffer(device,render_obj); CreateVertexBuffer(device,render_obj);
vulkan::PipelineLayout *pl=CreatePipelineLayout(*device,mi->GetDSL()); vulkan::Buffer *ubo=CreateUBO(device);
mi->UpdateUBO("world",*ubo);
vulkan::PipelineCreater pc(device,mi);
pc.SetDepthTest(false); pc.SetDepthTest(false);
pc.SetDepthWrite(false); pc.SetDepthWrite(false);
pc.CloseCullFace(); pc.CloseCullFace();
pc.Set(mi);
pc.Set(PRIM_TRIANGLES); pc.Set(PRIM_TRIANGLES);
pc.Set(*pl);
vulkan::Pipeline *pipeline=pc.Create(); vulkan::Pipeline *pipeline=pc.Create();
@ -161,7 +152,6 @@ int main(int,char **)
cmd_buf->Begin(device->GetRenderPass(),device->GetFramebuffer(0)); cmd_buf->Begin(device->GetRenderPass(),device->GetFramebuffer(0));
cmd_buf->Bind(pipeline); cmd_buf->Bind(pipeline);
cmd_buf->Bind(pl);
cmd_buf->Bind(render_obj); cmd_buf->Bind(render_obj);
cmd_buf->Draw(VERTEX_COUNT); cmd_buf->Draw(VERTEX_COUNT);
cmd_buf->End(); cmd_buf->End();
@ -177,7 +167,6 @@ int main(int,char **)
delete pipeline; delete pipeline;
delete pl;
delete ubo; delete ubo;
delete mi; delete mi;