进一步简化和修正程序结构,VulkanTest可运行
This commit is contained in:
parent
e53a57fe00
commit
e96bfe9c4b
@ -3,6 +3,7 @@
|
||||
#include"VKFramebuffer.h"
|
||||
#include"VKPipeline.h"
|
||||
#include"VKBuffer.h"
|
||||
#include"VKMaterial.h"
|
||||
#include"VKRenderable.h"
|
||||
#include"VKDescriptorSets.h"
|
||||
|
||||
@ -71,10 +72,19 @@ bool CommandBuffer::Bind(Pipeline *p)
|
||||
{
|
||||
if(!p)return(false);
|
||||
|
||||
vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS,*p);
|
||||
vkCmdBindPipeline(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,*p);
|
||||
return(true);
|
||||
}
|
||||
|
||||
if(p->GetDescriptorSetCount()>0)
|
||||
vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, p->GetLayout(), 0, p->GetDescriptorSetCount(),p->GetDescriptorSets(), 0, nullptr);
|
||||
bool CommandBuffer::Bind(Material *mat)
|
||||
{
|
||||
if(!mat)
|
||||
return(false);
|
||||
|
||||
const uint32_t count=mat->GetDescriptorSetCount();
|
||||
|
||||
if(count>0)
|
||||
vkCmdBindDescriptorSets(cmd_buf,VK_PIPELINE_BIND_POINT_GRAPHICS,mat->GetPipelineLayout(),0,count,mat->GetDescriptorSets(),0,nullptr);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ VK_NAMESPACE_BEGIN
|
||||
class RenderPass;
|
||||
class Framebuffer;
|
||||
class Pipeline;
|
||||
class PipelineLayout;
|
||||
class Material;
|
||||
class Renderable;
|
||||
|
||||
class CommandBuffer
|
||||
@ -45,7 +45,7 @@ public:
|
||||
|
||||
bool Begin(RenderPass *rp,Framebuffer *fb);
|
||||
bool Bind(Pipeline *p);
|
||||
bool Bind(PipelineLayout *pl);
|
||||
bool Bind(Material *);
|
||||
bool Bind(Renderable *);
|
||||
bool End();
|
||||
|
||||
|
@ -4,60 +4,37 @@
|
||||
VK_NAMESPACE_BEGIN
|
||||
namespace
|
||||
{
|
||||
void DestroyDescriptorSetLayout(VkDevice device,List<VkDescriptorSetLayout> &dsl_list)
|
||||
void DestroyDescriptorSetLayout(VkDevice device,const int count,VkDescriptorSetLayout *dsl_list)
|
||||
{
|
||||
const int count=dsl_list.GetCount();
|
||||
if(count<=0)
|
||||
return;
|
||||
|
||||
if(count>0)
|
||||
for(int i=0;i<count;i++)
|
||||
{
|
||||
VkDescriptorSetLayout *dsl=dsl_list.GetData();
|
||||
|
||||
for(int i=0;i<count;i++)
|
||||
{
|
||||
vkDestroyDescriptorSetLayout(device,*dsl,nullptr);
|
||||
++dsl;
|
||||
}
|
||||
|
||||
dsl_list.Clear();
|
||||
vkDestroyDescriptorSetLayout(device,*dsl_list,nullptr);
|
||||
++dsl_list;
|
||||
}
|
||||
}
|
||||
}//namespace
|
||||
|
||||
DescriptorSetLayout::~DescriptorSetLayout()
|
||||
{
|
||||
// 这里注释掉是因为从来不见那里的范例有FREE过,但又有vkFreeDescriptorSets这个函数。如发现此注释,请使用工具查是否有资源泄露
|
||||
//{
|
||||
//const int count=desc_sets.GetCount();
|
||||
|
||||
//if(count>0)
|
||||
// vkFreeDescriptorSets(device->GetDevice(),device->GetDescriptorPool(),count,desc_sets.GetData());
|
||||
//}
|
||||
|
||||
DestroyDescriptorSetLayout(*device,desc_set_layout_list);
|
||||
}
|
||||
|
||||
bool DescriptorSetLayout::UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info)
|
||||
VkDescriptorSet DescriptorSetLayout::GetDescriptorSet(const uint32_t binding)
|
||||
{
|
||||
int index;
|
||||
|
||||
if(!binding_index.Get(binding,index))
|
||||
return(false);
|
||||
if(!index_by_binding.Get(binding,index))
|
||||
return(nullptr);
|
||||
|
||||
VkDescriptorSet set;
|
||||
if(!desc_sets.Get(index,set))
|
||||
return(false);
|
||||
return desc_set_list[index];
|
||||
}
|
||||
|
||||
VkWriteDescriptorSet writeDescriptorSet = {};
|
||||
DescriptorSetLayout::~DescriptorSetLayout()
|
||||
{
|
||||
//if(count>0)
|
||||
// vkFreeDescriptorSets(device->GetDevice(),device->GetDescriptorPool(),count,desc_set_list);
|
||||
|
||||
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
writeDescriptorSet.dstSet = set;
|
||||
writeDescriptorSet.descriptorCount = 1;
|
||||
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
writeDescriptorSet.pBufferInfo = buf_info;
|
||||
writeDescriptorSet.dstBinding = binding;
|
||||
|
||||
vkUpdateDescriptorSets(device->GetDevice(), 1, &writeDescriptorSet, 0, nullptr);
|
||||
return(true);
|
||||
delete[] desc_set_list;
|
||||
DestroyDescriptorSetLayout(*device,count,desc_set_layout_list);
|
||||
delete[] desc_set_layout_list;
|
||||
}
|
||||
|
||||
void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
||||
@ -71,7 +48,7 @@ void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType de
|
||||
|
||||
const int index=layout_binding_list.Add(layout_binding);
|
||||
|
||||
binding_index.Add(binding,index);
|
||||
index_by_binding.Add(binding,index);
|
||||
}
|
||||
|
||||
void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
|
||||
@ -90,7 +67,7 @@ void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t cou
|
||||
p->stageFlags = stageFlags;
|
||||
p->pImmutableSamplers = nullptr;
|
||||
|
||||
binding_index.Add(*binding,i);
|
||||
index_by_binding.Add(*binding,i);
|
||||
|
||||
++binding;
|
||||
++p;
|
||||
@ -110,29 +87,31 @@ DescriptorSetLayout *DescriptorSetLayoutCreater::Create()
|
||||
descriptor_layout.bindingCount = count;
|
||||
descriptor_layout.pBindings = layout_binding_list.GetData();
|
||||
|
||||
List<VkDescriptorSetLayout> dsl_list;
|
||||
VkDescriptorSetLayout *dsl_list=new VkDescriptorSetLayout[count];
|
||||
|
||||
dsl_list.SetCount(count);
|
||||
if(vkCreateDescriptorSetLayout(device->GetDevice(),&descriptor_layout, nullptr, dsl_list.GetData())!=VK_SUCCESS)
|
||||
if(vkCreateDescriptorSetLayout(device->GetDevice(),&descriptor_layout, nullptr, dsl_list)!=VK_SUCCESS)
|
||||
{
|
||||
delete[] dsl_list;
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
VkDescriptorSetAllocateInfo alloc_info;
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
alloc_info.pNext = nullptr;
|
||||
alloc_info.descriptorPool = device->GetDescriptorPool();
|
||||
alloc_info.descriptorSetCount = count;
|
||||
alloc_info.pSetLayouts = dsl_list.GetData();
|
||||
alloc_info.pSetLayouts = dsl_list;
|
||||
|
||||
List<VkDescriptorSet> desc_set;
|
||||
VkDescriptorSet *desc_set=new VkDescriptorSet[count];
|
||||
|
||||
desc_set.SetCount(count);
|
||||
|
||||
if(vkAllocateDescriptorSets(device->GetDevice(), &alloc_info, desc_set.GetData())!=VK_SUCCESS)
|
||||
if(vkAllocateDescriptorSets(device->GetDevice(),&alloc_info,desc_set)!=VK_SUCCESS)
|
||||
{
|
||||
DestroyDescriptorSetLayout(*device,dsl_list);
|
||||
delete[] desc_set;
|
||||
DestroyDescriptorSetLayout(*device,count,dsl_list);
|
||||
delete[] dsl_list;
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
return(new DescriptorSetLayout(device,dsl_list,desc_set,binding_index));
|
||||
return(new DescriptorSetLayout(device,count,dsl_list,desc_set,index_by_binding));
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -9,30 +9,32 @@ class Device;
|
||||
class DescriptorSetLayout
|
||||
{
|
||||
Device *device;
|
||||
List<VkDescriptorSetLayout> desc_set_layout_list;
|
||||
List<VkDescriptorSet> desc_sets;
|
||||
int count;
|
||||
VkDescriptorSetLayout *desc_set_layout_list;
|
||||
VkDescriptorSet *desc_set_list;
|
||||
Map<uint32_t,int> index_by_binding;
|
||||
|
||||
Map<uint32_t,int> binding_index;
|
||||
private:
|
||||
|
||||
friend class DescriptorSetLayoutCreater;
|
||||
|
||||
DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkDescriptorSet *desc_set,Map<uint32_t,int> &bi)
|
||||
{
|
||||
device=dev;
|
||||
count=c;
|
||||
desc_set_layout_list=dsl_list;
|
||||
desc_set_list=desc_set;
|
||||
index_by_binding=bi;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
DescriptorSetLayout(Device *dev,const List<VkDescriptorSetLayout> &dsl_list,List<VkDescriptorSet> &ds_list,
|
||||
Map<uint32_t,int> &bi)
|
||||
{
|
||||
device=dev;
|
||||
desc_set_layout_list=dsl_list;
|
||||
desc_sets=ds_list;
|
||||
binding_index=bi;
|
||||
}
|
||||
|
||||
~DescriptorSetLayout();
|
||||
|
||||
const uint32_t GetCount ()const{return desc_set_layout_list.GetCount();}
|
||||
const VkDescriptorSetLayout * GetLayouts ()const{return desc_set_layout_list.GetData();}
|
||||
|
||||
const List<VkDescriptorSet> & GetSets ()const{return desc_sets;}
|
||||
|
||||
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
|
||||
const uint32_t GetCount ()const{return count;}
|
||||
const VkDescriptorSetLayout * GetLayouts ()const{return desc_set_layout_list;}
|
||||
const VkDescriptorSet * GetDescriptorSets ()const{return desc_set_list;}
|
||||
VkDescriptorSet GetDescriptorSet (const uint32_t binding);
|
||||
};//class DescriptorSetLayout
|
||||
|
||||
/**
|
||||
@ -41,11 +43,10 @@ public:
|
||||
class DescriptorSetLayoutCreater
|
||||
{
|
||||
Device *device;
|
||||
VkDescriptorSet desc_set;
|
||||
|
||||
List<VkDescriptorSetLayoutBinding> layout_binding_list;
|
||||
|
||||
Map<uint32_t,int> binding_index;
|
||||
Map<uint32_t,int> index_by_binding;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -32,7 +32,27 @@ namespace
|
||||
|
||||
VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,void *pUserData)
|
||||
{
|
||||
std::cerr<<"validation layer: "<<pCallbackData->pMessage<<std::endl;
|
||||
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
|
||||
{
|
||||
std::cout<<"ERROR: "<<pCallbackData->pMessage<<std::endl;
|
||||
}
|
||||
else
|
||||
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
|
||||
{
|
||||
std::cout<<"WARNING: "<<pCallbackData->pMessage<<std::endl;
|
||||
}
|
||||
else
|
||||
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT)
|
||||
{
|
||||
std::cout<<"INFO: "<<pCallbackData->pMessage<<std::endl;
|
||||
}
|
||||
else
|
||||
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT)
|
||||
{
|
||||
std::cout<<"VERBOSE: "<<pCallbackData->pMessage<<std::endl;
|
||||
}
|
||||
else
|
||||
std::cerr<<"validation layer: "<<pCallbackData->pMessage<<std::endl;
|
||||
|
||||
return VK_FALSE;
|
||||
}
|
||||
@ -133,7 +153,7 @@ Instance *CreateInstance(const UTF8String &app_name)
|
||||
"VK_LAYER_LUNARG_standard_validation",
|
||||
"VK_LAYER_LUNARG_parameter_validation",
|
||||
// "VK_LAYER_LUNARG_vktrace",
|
||||
"VK_LAYER_RENDERDOC_Capture",
|
||||
// "VK_LAYER_RENDERDOC_Capture",
|
||||
|
||||
// "VK_LAYER_KHRONOS_validation",
|
||||
|
||||
|
@ -6,17 +6,19 @@
|
||||
#include"VKRenderable.h"
|
||||
#include"VKBuffer.h"
|
||||
VK_NAMESPACE_BEGIN
|
||||
Material::Material(Device *dev,ShaderModuleMap *smm)
|
||||
Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps)
|
||||
{
|
||||
device=*dev;
|
||||
shader_maps=smm;
|
||||
dsl_creater=new DescriptorSetLayoutCreater(dev);
|
||||
DescriptorSetLayoutCreater *dsl_creater=new DescriptorSetLayoutCreater(dev);
|
||||
|
||||
const int shader_count=shader_maps->GetCount();
|
||||
|
||||
shader_stage_list.SetCount(shader_count);
|
||||
VkPipelineShaderStageCreateInfo *p=shader_stage_list.GetData();
|
||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list=new List<VkPipelineShaderStageCreateInfo>;
|
||||
|
||||
shader_stage_list->SetCount(shader_count);
|
||||
|
||||
VkPipelineShaderStageCreateInfo *p=shader_stage_list->GetData();
|
||||
|
||||
VertexShaderModule *vertex_sm;
|
||||
const ShaderModule *sm;
|
||||
auto **itp=shader_maps->GetDataList();
|
||||
for(int i=0;i<shader_count;i++)
|
||||
@ -36,17 +38,62 @@ Material::Material(Device *dev,ShaderModuleMap *smm)
|
||||
dsl_creater->BindUBO(ubo_list.GetData(),ubo_list.GetCount(),sm->GetStage());
|
||||
}
|
||||
}
|
||||
|
||||
VertexAttributeBinding *vab=vertex_sm->CreateVertexAttributeBinding();
|
||||
|
||||
DescriptorSetLayout *dsl=dsl_creater->Create();
|
||||
|
||||
if(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(dev->GetDevice(), &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)==VK_SUCCESS)
|
||||
{
|
||||
return(new Material(dev,shader_maps,vertex_sm,shader_stage_list,dsl_creater,dsl,pipeline_layout,vab));
|
||||
}
|
||||
}
|
||||
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v)
|
||||
{
|
||||
device=*dev;
|
||||
shader_maps=smm;
|
||||
vertex_sm=vsm;
|
||||
shader_stage_list=psci_list;
|
||||
dsl_creater=dslc;
|
||||
desc_set_layout=dsl;
|
||||
pipeline_layout=pl;
|
||||
vab=v;
|
||||
}
|
||||
|
||||
Material::~Material()
|
||||
{
|
||||
delete vab;
|
||||
|
||||
if(pipeline_layout)
|
||||
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
|
||||
|
||||
delete desc_set_layout;
|
||||
delete dsl_creater;
|
||||
|
||||
const int count=shader_stage_list.GetCount();
|
||||
const int count=shader_stage_list->GetCount();
|
||||
|
||||
if(count>0)
|
||||
{
|
||||
VkPipelineShaderStageCreateInfo *ss=shader_stage_list.GetData();
|
||||
VkPipelineShaderStageCreateInfo *ss=shader_stage_list->GetData();
|
||||
for(int i=0;i<count;i++)
|
||||
{
|
||||
vkDestroyShaderModule(device,ss->module,nullptr);
|
||||
@ -54,6 +101,7 @@ Material::~Material()
|
||||
}
|
||||
}
|
||||
|
||||
delete shader_stage_list;
|
||||
delete shader_maps;
|
||||
}
|
||||
|
||||
@ -84,72 +132,39 @@ const int Material::GetVBOBinding(const UTF8String &name)const
|
||||
return vertex_sm->GetBinding(name);
|
||||
}
|
||||
|
||||
MaterialInstance *Material::CreateInstance()const
|
||||
const uint32_t Material::GetDescriptorSetCount()const
|
||||
{
|
||||
if(!vertex_sm)
|
||||
return(nullptr);
|
||||
|
||||
VertexAttributeBinding *vab=vertex_sm->CreateVertexAttributeBinding();
|
||||
|
||||
if(!vab)
|
||||
return(nullptr);
|
||||
|
||||
DescriptorSetLayout *dsl=dsl_creater->Create();
|
||||
|
||||
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));
|
||||
return desc_set_layout->GetCount();
|
||||
}
|
||||
|
||||
MaterialInstance::MaterialInstance(VkDevice dev,const Material *m,const VertexShaderModule *vsm,VertexAttributeBinding *v,DescriptorSetLayout *d,VkPipelineLayout pl)
|
||||
const VkDescriptorSet *Material::GetDescriptorSets()const
|
||||
{
|
||||
device=dev;
|
||||
mat=m;
|
||||
vertex_sm=vsm;
|
||||
vab=v;
|
||||
desc_set_layout=d;
|
||||
pipeline_layout=pl;
|
||||
return desc_set_layout->GetDescriptorSets();
|
||||
}
|
||||
|
||||
MaterialInstance::~MaterialInstance()
|
||||
bool Material::UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info)
|
||||
{
|
||||
if(pipeline_layout)
|
||||
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
|
||||
VkDescriptorSet set=desc_set_layout->GetDescriptorSet(binding);
|
||||
|
||||
delete desc_set_layout;
|
||||
delete vab;
|
||||
VkWriteDescriptorSet writeDescriptorSet = {};
|
||||
|
||||
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
writeDescriptorSet.dstSet = set;
|
||||
writeDescriptorSet.descriptorCount = 1;
|
||||
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
writeDescriptorSet.pBufferInfo = buf_info;
|
||||
writeDescriptorSet.dstBinding = binding;
|
||||
|
||||
vkUpdateDescriptorSets(device,1,&writeDescriptorSet,0,nullptr);
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool MaterialInstance::UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info)
|
||||
{
|
||||
return desc_set_layout->UpdateUBO(binding,buf_info);
|
||||
}
|
||||
|
||||
void MaterialInstance::Write(VkPipelineVertexInputStateCreateInfo &vis)const
|
||||
void Material::Write(VkPipelineVertexInputStateCreateInfo &vis)const
|
||||
{
|
||||
return vab->Write(vis);
|
||||
}
|
||||
|
||||
const List<VkDescriptorSet> *MaterialInstance::GetDescriptorSets()const
|
||||
{
|
||||
return &(desc_set_layout->GetSets());
|
||||
}
|
||||
|
||||
Renderable *MaterialInstance::CreateRenderable()
|
||||
Renderable *Material::CreateRenderable()
|
||||
{
|
||||
return(new Renderable(vertex_sm));
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ class ShaderModule;
|
||||
class VertexShaderModule;
|
||||
class DescriptorSetLayoutCreater;
|
||||
class DescriptorSetLayout;
|
||||
class MaterialInstance;
|
||||
class VertexAttributeBinding;
|
||||
class VertexBuffer;
|
||||
class Renderable;
|
||||
@ -27,42 +26,26 @@ class Material
|
||||
VkDevice device;
|
||||
ShaderModuleMap *shader_maps;
|
||||
VertexShaderModule *vertex_sm;
|
||||
List<VkPipelineShaderStageCreateInfo> shader_stage_list;
|
||||
|
||||
List<VkPipelineShaderStageCreateInfo> *shader_stage_list;
|
||||
DescriptorSetLayoutCreater *dsl_creater;
|
||||
DescriptorSetLayout *desc_set_layout;
|
||||
VkPipelineLayout pipeline_layout;
|
||||
VertexAttributeBinding *vab;
|
||||
|
||||
public:
|
||||
|
||||
Material(Device *dev,ShaderModuleMap *smm);
|
||||
Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v);
|
||||
~Material();
|
||||
|
||||
const int GetUBOBinding(const UTF8String &)const;
|
||||
const int GetVBOBinding(const UTF8String &)const;
|
||||
|
||||
MaterialInstance *CreateInstance()const;
|
||||
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
|
||||
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
|
||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
|
||||
|
||||
const uint32_t GetStageCount ()const{return shader_stage_list.GetCount();}
|
||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list.GetData();}
|
||||
};//class Material
|
||||
|
||||
/**
|
||||
* 材质实例<br>
|
||||
* 用于在指定Material的情况下,具体绑定UBO/TEXTURE等,提供pipeline
|
||||
*/
|
||||
class MaterialInstance
|
||||
{
|
||||
VkDevice device;
|
||||
const Material *mat; ///<这里的是对material的完全引用,不做任何修改
|
||||
const VertexShaderModule *vertex_sm;
|
||||
VertexAttributeBinding *vab;
|
||||
DescriptorSetLayout *desc_set_layout;
|
||||
|
||||
VkPipelineLayout pipeline_layout;
|
||||
|
||||
public:
|
||||
|
||||
MaterialInstance(VkDevice dev,const Material *m,const VertexShaderModule *,VertexAttributeBinding *v,DescriptorSetLayout *d,VkPipelineLayout pl);
|
||||
~MaterialInstance();
|
||||
const uint32_t GetDescriptorSetCount ()const;
|
||||
const VkDescriptorSet * GetDescriptorSets ()const;
|
||||
|
||||
bool UpdateUBO(const uint32_t binding,const VkDescriptorBufferInfo *buf_info);
|
||||
bool UpdateUBO(const UTF8String &name,const VkDescriptorBufferInfo *buf_info)
|
||||
@ -70,18 +53,12 @@ public:
|
||||
if(name.IsEmpty()||!buf_info)
|
||||
return(false);
|
||||
|
||||
return UpdateUBO(mat->GetUBOBinding(name),buf_info);
|
||||
return UpdateUBO(GetUBOBinding(name),buf_info);
|
||||
}
|
||||
|
||||
const uint32_t GetStageCount ()const{return mat->GetStageCount();}
|
||||
const VkPipelineShaderStageCreateInfo * GetStages ()const{return mat->GetStages();}
|
||||
|
||||
void Write(VkPipelineVertexInputStateCreateInfo &vis)const;
|
||||
|
||||
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
|
||||
const List<VkDescriptorSet> * GetDescriptorSets ()const;
|
||||
|
||||
Renderable *CreateRenderable();
|
||||
};//class MaterialInstance
|
||||
};//class Material
|
||||
VK_NAMESPACE_END
|
||||
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
|
||||
|
@ -9,21 +9,19 @@ Pipeline::~Pipeline()
|
||||
vkDestroyPipeline(device,pipeline,nullptr);
|
||||
}
|
||||
|
||||
PipelineCreater::PipelineCreater(Device *dev,const MaterialInstance *mi,RenderPass *rp)
|
||||
PipelineCreater::PipelineCreater(Device *dev,const Material *material,RenderPass *rp)
|
||||
{
|
||||
device=dev->GetDevice();
|
||||
extent=dev->GetExtent();
|
||||
cache=dev->GetPipelineCache();
|
||||
|
||||
material=mi;
|
||||
|
||||
//未来这里需要增加是否有vs/fs的检测
|
||||
|
||||
hgl_zero(pipelineInfo);
|
||||
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||
pipelineInfo.layout = material->GetPipelineLayout();
|
||||
pipelineInfo.stageCount=material->GetStageCount();
|
||||
pipelineInfo.pStages=material->GetStages();
|
||||
pipelineInfo.stageCount = material->GetStageCount();
|
||||
pipelineInfo.pStages = material->GetStages();
|
||||
|
||||
{
|
||||
if(!rp)
|
||||
@ -172,8 +170,6 @@ Pipeline *PipelineCreater::Create()
|
||||
if (vkCreateGraphicsPipelines(device, cache, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS)
|
||||
return(nullptr);
|
||||
|
||||
return(new Pipeline(device,graphicsPipeline,
|
||||
material->GetPipelineLayout(),
|
||||
material->GetDescriptorSets()));
|
||||
return(new Pipeline(device,graphicsPipeline));
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -7,32 +7,21 @@ VK_NAMESPACE_BEGIN
|
||||
class Device;
|
||||
class RenderPass;
|
||||
class VertexAttributeBinding;
|
||||
class MaterialInstance;
|
||||
class Material;
|
||||
|
||||
class Pipeline
|
||||
{
|
||||
VkDevice device;
|
||||
VkPipeline pipeline;
|
||||
VkPipelineLayout pipeline_layout;
|
||||
|
||||
const List<VkDescriptorSet> *desc_sets;
|
||||
|
||||
public:
|
||||
|
||||
Pipeline(VkDevice dev,VkPipeline p,VkPipelineLayout pl,const List<VkDescriptorSet> *ds){device=dev;pipeline=p;pipeline_layout=pl;desc_sets=ds;}
|
||||
Pipeline(VkDevice dev,VkPipeline p){device=dev;pipeline=p;}
|
||||
virtual ~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 Shader;
|
||||
class VertexInput;
|
||||
|
||||
class PipelineCreater
|
||||
{
|
||||
VkDevice device;
|
||||
@ -58,13 +47,9 @@ class PipelineCreater
|
||||
VkDynamicState dynamicStateEnables[VK_DYNAMIC_STATE_RANGE_SIZE];
|
||||
VkPipelineDynamicStateCreateInfo dynamicState;
|
||||
|
||||
private:
|
||||
|
||||
const MaterialInstance *material=nullptr;
|
||||
|
||||
public:
|
||||
|
||||
PipelineCreater(Device *dev,const MaterialInstance *,RenderPass *rp=nullptr);
|
||||
PipelineCreater(Device *dev,const Material *,RenderPass *rp=nullptr);
|
||||
~PipelineCreater()=default;
|
||||
|
||||
bool Set(const VkPrimitiveTopology,bool=false);
|
||||
|
@ -29,7 +29,7 @@ bool Renderable::Set(const int binding,VertexBuffer *vbo,VkDeviceSize offset)
|
||||
if(vbo->GetFormat()!=attr->format)return(false);
|
||||
if(vbo->GetStride()!=desc->stride)return(false);
|
||||
|
||||
//format信息来自于shader->MaterialInstance,实际中可以不一样。但那样需要为每一个格式产生一个同样shader的material instance,不同的格式又需要不同的pipeline,我们不支持这种行为
|
||||
//format信息来自于shader,实际中可以不一样。但那样需要为每一个格式产生一个同样shader的material instance,不同的格式又需要不同的pipeline,我们不支持这种行为
|
||||
|
||||
buf_list[binding]=*vbo;
|
||||
buf_offset[binding]=offset;
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include"VKShaderParse.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps);
|
||||
|
||||
ShaderModuleManage::~ShaderModuleManage()
|
||||
{
|
||||
const int count=shader_list.GetCount();
|
||||
@ -115,6 +117,6 @@ Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_sh
|
||||
smm->Add(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_module);
|
||||
smm->Add(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_module);
|
||||
|
||||
return(new Material(device,smm));
|
||||
return(VK_NAMESPACE::CreateMaterial(device,smm));
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -10,7 +10,7 @@ class VertexShaderModule;
|
||||
|
||||
/**
|
||||
* 顶点输入状态实例<br>
|
||||
* 本对象用于传递给MaterialInstance,用于已经确定好顶点格式的情况下,依然可修改部分设定(如instance)。
|
||||
* 本对象用于传递给Material,用于已经确定好顶点格式的情况下,依然可修改部分设定(如instance)。
|
||||
*/
|
||||
class VertexAttributeBinding
|
||||
{
|
||||
|
@ -120,7 +120,6 @@ class TestApp:public VulkanApplicationFramework
|
||||
private: //需释放数据
|
||||
|
||||
vulkan::Material * material =nullptr;
|
||||
vulkan::MaterialInstance * material_instance =nullptr;
|
||||
vulkan::Renderable * render_obj =nullptr;
|
||||
vulkan::Buffer * ubo_mvp =nullptr;
|
||||
|
||||
@ -142,7 +141,6 @@ public:
|
||||
SAFE_CLEAR(pipeline_creater);
|
||||
SAFE_CLEAR(ubo_mvp);
|
||||
SAFE_CLEAR(render_obj);
|
||||
SAFE_CLEAR(material_instance);
|
||||
SAFE_CLEAR(material);
|
||||
}
|
||||
|
||||
@ -154,11 +152,7 @@ private:
|
||||
if(!material)
|
||||
return(false);
|
||||
|
||||
material_instance=material->CreateInstance();
|
||||
if(!material_instance)
|
||||
return(false);
|
||||
|
||||
render_obj=material_instance->CreateRenderable();
|
||||
render_obj=material->CreateRenderable();
|
||||
return(true);
|
||||
}
|
||||
|
||||
@ -173,7 +167,7 @@ private:
|
||||
if(!ubo_mvp)
|
||||
return(false);
|
||||
|
||||
return material_instance->UpdateUBO("world",*ubo_mvp);
|
||||
return material->UpdateUBO("world",*ubo_mvp);
|
||||
}
|
||||
|
||||
void InitVBO()
|
||||
@ -187,7 +181,7 @@ private:
|
||||
|
||||
bool InitPipeline()
|
||||
{
|
||||
pipeline_creater=new vulkan::PipelineCreater(device,material_instance);
|
||||
pipeline_creater=new vulkan::PipelineCreater(device,material);
|
||||
pipeline_creater->SetDepthTest(false);
|
||||
pipeline_creater->SetDepthWrite(false);
|
||||
pipeline_creater->CloseCullFace();
|
||||
@ -207,6 +201,7 @@ private:
|
||||
|
||||
cmd_buf->Begin(device->GetRenderPass(),device->GetFramebuffer(0));
|
||||
cmd_buf->Bind(pipeline);
|
||||
cmd_buf->Bind(material);
|
||||
cmd_buf->Bind(render_obj);
|
||||
cmd_buf->Draw(VERTEX_COUNT);
|
||||
cmd_buf->End();
|
||||
|
Loading…
x
Reference in New Issue
Block a user