resort source code files of pipeline
This commit is contained in:
48
src/SceneGraph/Vulkan/VKDevicePipeline.cpp
Normal file
48
src/SceneGraph/Vulkan/VKDevicePipeline.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#include<hgl/graph/VKPipeline.h>
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include<hgl/graph/VKRenderPass.h>
|
||||
#include<hgl/graph/VKRenderTarget.h>
|
||||
#include<hgl/graph/VKFramebuffer.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
Pipeline *GPUDevice::CreatePipeline(PipelineData *data,const Material *material,const RenderTarget *rt)
|
||||
{
|
||||
VkPipeline graphicsPipeline;
|
||||
|
||||
data->InitVertexInputState( material->GetStageCount(),
|
||||
material->GetStages(),
|
||||
material->GetVertexAttrCount(),
|
||||
material->GetVertexBindingList(),
|
||||
material->GetVertexAttributeList());
|
||||
|
||||
data->InitViewportState(rt->GetExtent());
|
||||
|
||||
data->SetColorAttachments(rt->GetColorCount());
|
||||
|
||||
data->pipeline_info.layout = material->GetPipelineLayout();
|
||||
|
||||
{
|
||||
data->pipeline_info.renderPass = rt->GetVkRenderPass();
|
||||
data->pipeline_info.subpass = 0; //subpass<73><73><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ʲô<CAB2>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱд0<D0B4><30><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>
|
||||
}
|
||||
|
||||
if (vkCreateGraphicsPipelines( attr->device,
|
||||
attr->pipeline_cache,
|
||||
1,&data->pipeline_info,
|
||||
nullptr,
|
||||
&graphicsPipeline) != VK_SUCCESS)
|
||||
return(nullptr);
|
||||
|
||||
return(new Pipeline(attr->device,graphicsPipeline,data));
|
||||
}
|
||||
|
||||
Pipeline *GPUDevice::CreatePipeline(const InlinePipeline &ip,const Material *mtl,const RenderTarget *rt)
|
||||
{
|
||||
PipelineData *pd=GetPipelineData(ip);
|
||||
|
||||
if(!pd)return(nullptr);
|
||||
|
||||
return this->CreatePipeline(pd,mtl,rt);
|
||||
}
|
||||
VK_NAMESPACE_END
|
@@ -1,6 +1,7 @@
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKPhysicalDevice.h>
|
||||
#include<hgl/graph/VKRenderPass.h>
|
||||
#include<hgl/util/hash/Hash.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
//void CreateSubpassDependency(VkSubpassDependency *dependency)
|
||||
@@ -192,7 +193,52 @@ bool CreateDepthAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachm
|
||||
return(true);
|
||||
}
|
||||
|
||||
RenderPass *GPUDevice::CreateRenderPass(const List<VkAttachmentDescription> &desc_list,
|
||||
namespace
|
||||
{
|
||||
using RenderPassHASHCode=util::HashCodeSHA1LE;
|
||||
|
||||
void HashRenderPass(RenderPassHASHCode *code,const VkRenderPassCreateInfo &rpci)
|
||||
{
|
||||
util::Hash *hash=util::CreateSHA1LEHash();
|
||||
|
||||
hash->Init();
|
||||
|
||||
// hash->Write(rpci.attachmentCount);
|
||||
hash->Write(rpci.pAttachments,rpci.attachmentCount);
|
||||
// hash->Write(rpci.subpassCount);
|
||||
{
|
||||
const VkSubpassDescription *sd=rpci.pSubpasses;
|
||||
|
||||
for(uint32_t i=0;i<rpci.subpassCount;i++)
|
||||
{
|
||||
hash->Write(sd->pipelineBindPoint);
|
||||
hash->Write(sd->pInputAttachments,sd->inputAttachmentCount);
|
||||
hash->Write(sd->pColorAttachments,sd->colorAttachmentCount);
|
||||
|
||||
if(sd->pResolveAttachments)
|
||||
hash->Write(*sd->pResolveAttachments);
|
||||
|
||||
if(sd->pDepthStencilAttachment)
|
||||
hash->Write(*sd->pDepthStencilAttachment);
|
||||
|
||||
hash->Write(sd->pPreserveAttachments,sd->preserveAttachmentCount);
|
||||
|
||||
++sd;
|
||||
}
|
||||
}
|
||||
|
||||
hash->Write(rpci.pDependencies,rpci.dependencyCount);
|
||||
|
||||
hash->Final(code);
|
||||
|
||||
delete hash;
|
||||
}
|
||||
|
||||
static Map<RenderPassHASHCode,RenderPass *> RenderPassList;
|
||||
}
|
||||
|
||||
RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
|
||||
const List<VkAttachmentDescription> &desc_list,
|
||||
const List<VkSubpassDescription> &subpass,
|
||||
const List<VkSubpassDependency> &dependency,
|
||||
const RenderbufferInfo *rbi)
|
||||
@@ -224,15 +270,28 @@ RenderPass *GPUDevice::CreateRenderPass(const List<VkAttachmentDescription> &des
|
||||
rp_info.dependencyCount = dependency.GetCount();
|
||||
rp_info.pDependencies = dependency.GetData();
|
||||
|
||||
RenderPassHASHCode code;
|
||||
|
||||
HashRenderPass(&code,rp_info);
|
||||
|
||||
RenderPass *rp;
|
||||
|
||||
if(RenderPassList.Get(code,rp))
|
||||
return rp;
|
||||
|
||||
VkRenderPass render_pass;
|
||||
|
||||
if(vkCreateRenderPass(attr->device,&rp_info,nullptr,&render_pass)!=VK_SUCCESS)
|
||||
return(nullptr);
|
||||
|
||||
return(new RenderPass(attr->device,render_pass,rbi->GetColorFormatList(),depth_format));
|
||||
rp=new RenderPass(attr->device,render_pass,rbi->GetColorFormatList(),depth_format);
|
||||
|
||||
RenderPassList.Add(code,rp);
|
||||
|
||||
return rp;
|
||||
}
|
||||
|
||||
RenderPass *GPUDevice::CreateRenderPass(const RenderbufferInfo *rbi)
|
||||
RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,const RenderbufferInfo *rbi)
|
||||
{
|
||||
for(const VkFormat &fmt:rbi->GetColorFormatList())
|
||||
if(!attr->physical_device->IsColorAttachmentOptimal(fmt))
|
||||
@@ -264,6 +323,6 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderbufferInfo *rbi)
|
||||
|
||||
CreateSubpassDependency(subpass_dependency_list,2);
|
||||
|
||||
return CreateRenderPass(atta_desc_list,subpass_desc_list,subpass_dependency_list,rbi);
|
||||
return CreateRenderPass(type_by,atta_desc_list,subpass_desc_list,subpass_dependency_list,rbi);
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@@ -10,7 +10,7 @@ RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uin
|
||||
{
|
||||
if(!fbi)return(nullptr);
|
||||
|
||||
RenderPass *rp=CreateRenderPass(fbi); //Renderpass内部会验证格式,所以不需要自己处理
|
||||
RenderPass *rp=CreateRenderPass(RenderpassTypeBy::Format,fbi); //Renderpass内部会验证格式,所以不需要自己处理
|
||||
|
||||
if(!rp)return(nullptr);
|
||||
|
||||
|
@@ -1,58 +1,8 @@
|
||||
#include<hgl/graph/VKPipeline.h>
|
||||
#include<hgl/graph/VKDevice.h>
|
||||
#include<hgl/graph/VKMaterial.h>
|
||||
#include<hgl/graph/VKRenderPass.h>
|
||||
#include<hgl/graph/VKRenderTarget.h>
|
||||
#include<hgl/graph/VKFramebuffer.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
Pipeline::~Pipeline()
|
||||
{
|
||||
vkDestroyPipeline(device,pipeline,nullptr);
|
||||
}
|
||||
|
||||
Pipeline *CreatePipeline(VkDevice device,VkPipelineCache pipeline_cache,PipelineData *data,const Material *material,const RenderTarget *rt)
|
||||
{
|
||||
VkPipeline graphicsPipeline;
|
||||
|
||||
data->InitVertexInputState( material->GetStageCount(),
|
||||
material->GetStages(),
|
||||
material->GetVertexAttrCount(),
|
||||
material->GetVertexBindingList(),
|
||||
material->GetVertexAttributeList());
|
||||
|
||||
data->InitViewportState(rt->GetExtent());
|
||||
|
||||
data->SetColorAttachments(rt->GetColorCount());
|
||||
|
||||
data->pipeline_info.layout = material->GetPipelineLayout();
|
||||
|
||||
{
|
||||
data->pipeline_info.renderPass = rt->GetVkRenderPass();
|
||||
data->pipeline_info.subpass = 0; //subpass由于还不知道有什么用,所以暂时写0,待知道功用后,需改进
|
||||
}
|
||||
|
||||
if (vkCreateGraphicsPipelines( device,
|
||||
pipeline_cache,
|
||||
1,&data->pipeline_info,
|
||||
nullptr,
|
||||
&graphicsPipeline) != VK_SUCCESS)
|
||||
return(nullptr);
|
||||
|
||||
return(new Pipeline(device,graphicsPipeline,data));
|
||||
}
|
||||
|
||||
Pipeline *GPUDevice::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 *GPUDevice::CreatePipeline(PipelineData *pd,const Material *mtl,const RenderTarget *rt)
|
||||
{
|
||||
return VK_NAMESPACE::CreatePipeline(attr->device,attr->pipeline_cache,pd,mtl,rt);
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@@ -3,6 +3,20 @@
|
||||
#include<hgl/graph/VKSemaphore.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
struct SwapchainFormatHash
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32 color;
|
||||
uint32 depth;
|
||||
};
|
||||
|
||||
uint64 hash;
|
||||
};
|
||||
};//
|
||||
|
||||
SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,sc->GetImageCount())
|
||||
{
|
||||
swapchain=sc;
|
||||
@@ -19,7 +33,7 @@ SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):Rende
|
||||
|
||||
SwapchainRenderbufferInfo rbi((*sc_color)->GetFormat(),sc_depth->GetFormat());
|
||||
|
||||
this->render_pass=device->CreateRenderPass(&rbi);
|
||||
this->render_pass=device->CreateRenderPass(RenderpassTypeBy::Simple,&rbi);
|
||||
|
||||
swap_chain_count=swapchain->GetImageCount();
|
||||
|
||||
|
Reference in New Issue
Block a user