add RenderPassTypeBy and cache

This commit is contained in:
hyzboy 2021-09-22 15:32:20 +08:00
parent 9f80a02821
commit b5188a63ea
10 changed files with 125 additions and 43 deletions

@ -1 +1 @@
Subproject commit cf93f6e0910d96ffd8dd840209f6e65f162e1cd9
Subproject commit ea88b9fa13b816293530be9232f9ce5a529944ae

2
CMUtil

@ -1 +1 @@
Subproject commit 8ce98c85a397921277cd19a91993b6724bf1d391
Subproject commit be9122db80512d3c046fe68b3b9948dd2078dec7

View File

@ -62,6 +62,14 @@ class IndexBuffer;
class GPUCmdBuffer;
class RenderCmdBuffer;
class TextureCmdBuffer;
enum class RenderPassTypeBy
{
Simple=0,
Normal,
Verbose
};//
class RenderPass;
class GPUFence;
class GPUSemaphore;

View File

@ -211,12 +211,17 @@ public: //Command Buffer 相关
RenderCmdBuffer * CreateRenderCommandBuffer();
TextureCmdBuffer *CreateTextureCommandBuffer();
private:
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
const List<VkSubpassDescription> &subpass,
const List<VkSubpassDependency> &dependency,
const RenderbufferInfo *);
const RenderbufferInfo *,
const RenderPassTypeBy &type_by=RenderPassTypeBy::Verbose);
RenderPass * CreateRenderPass( const RenderbufferInfo *);
public:
RenderPass * AcquireRenderPass( const RenderbufferInfo *,const RenderPassTypeBy &type_by=RenderPassTypeBy::Normal);
GPUFence * CreateFence(bool);
GPUSemaphore * CreateGPUSemaphore();
@ -232,14 +237,13 @@ public:
bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列
RenderTarget *CreateRenderTarget( Framebuffer *,const uint32_t fence_count=1);
RenderTarget *CreateRenderTarget( const FramebufferInfo *fbi,RenderPass *,const uint32_t fence_count=1);
RenderTarget *CreateRenderTarget( const FramebufferInfo *fbi,const uint32_t fence_count=1);
public:
Pipeline *CreatePipeline(const InlinePipeline &,const Material *,const RenderTarget *);
Pipeline *CreatePipeline( PipelineData *, const Material *,const RenderTarget *);
Pipeline *CreatePipeline(const InlinePipeline &,const Material *,const RenderTarget *);
public:

View File

@ -15,9 +15,22 @@ class Pipeline
bool alpha_test;
bool alpha_blend;
private:
friend class GPUDevice;
Pipeline(VkDevice dev,VkPipeline p,PipelineData *pd)
{
device=dev;
pipeline=p;
data=pd;
alpha_test=false;
alpha_blend=false;
}
public:
Pipeline(VkDevice dev,VkPipeline p,PipelineData *pd):device(dev),pipeline(p),data(pd){}
virtual ~Pipeline();
operator VkPipeline(){return pipeline;}

View File

@ -119,6 +119,7 @@ SET(VK_DEVICE_SOURCE ${SG_INCLUDE_PATH}/VKDevice.h
Vulkan/VKDeviceImage.cpp
Vulkan/VKDeviceTexture.cpp
Vulkan/VKDeviceMaterial.cpp
Vulkan/VKDevicePipeline.cpp
Vulkan/VKDeviceFramebuffer.cpp
Vulkan/VKDeviceSwapchain.cpp
Vulkan/VKDeviceRenderPass.cpp

View File

@ -234,14 +234,14 @@ namespace
delete hash;
}
static Map<RenderPassHASHCode,RenderPass *> RenderPassList;
static Map<RenderPassHASHCode,RenderPass *> RenderPassListByVerbose;
}
RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
const List<VkAttachmentDescription> &desc_list,
RenderPass *GPUDevice::CreateRenderPass(const List<VkAttachmentDescription> &desc_list,
const List<VkSubpassDescription> &subpass,
const List<VkSubpassDependency> &dependency,
const RenderbufferInfo *rbi)
const RenderbufferInfo *rbi,
const RenderPassTypeBy &type_by)
{
for(const VkFormat cf:rbi->GetColorFormatList())
{
@ -271,13 +271,15 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
rp_info.pDependencies = dependency.GetData();
RenderPassHASHCode code;
RenderPass *rp=nullptr;
if(type_by==RenderPassTypeBy::Verbose)
{
HashRenderPass(&code,rp_info);
RenderPass *rp;
if(RenderPassList.Get(code,rp))
if(RenderPassListByVerbose.Get(code,rp))
return rp;
}
VkRenderPass render_pass;
@ -286,17 +288,47 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
rp=new RenderPass(attr->device,render_pass,rbi->GetColorFormatList(),depth_format);
RenderPassList.Add(code,rp);
if(type_by==RenderPassTypeBy::Verbose)
RenderPassListByVerbose.Add(code,rp);
return rp;
}
RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,const RenderbufferInfo *rbi)
namespace
{
void HashRenderPass(RenderPassHASHCode *code,const RenderbufferInfo *rbi)
{
util::Hash *hash=util::CreateSHA1LEHash();
hash->Init();
for(const VkFormat &fmt:rbi->GetColorFormatList())
hash->Write(fmt);
hash->Final(&code);
delete hash;
}
static Map<RenderPassHASHCode,RenderPass *> RenderPassListByNormal;
}//namespace
RenderPass *GPUDevice::AcquireRenderPass(const RenderbufferInfo *rbi,const RenderPassTypeBy &type_by)
{
for(const VkFormat &fmt:rbi->GetColorFormatList())
if(!attr->physical_device->IsColorAttachmentOptimal(fmt))
return(nullptr);
RenderPassHASHCode code;
RenderPass *rp=nullptr;
if(type_by==RenderPassTypeBy::Normal)
{
HashRenderPass(&code,rbi);
if(RenderPassListByNormal.Get(code,rp))
return rp;
}
List<VkAttachmentReference> color_ref_list;
VkAttachmentReference depth_ref;
List<VkAttachmentDescription> atta_desc_list;
@ -323,6 +355,11 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,const Re
CreateSubpassDependency(subpass_dependency_list,2);
return CreateRenderPass(type_by,atta_desc_list,subpass_desc_list,subpass_dependency_list,rbi);
rp=CreateRenderPass(atta_desc_list,subpass_desc_list,subpass_dependency_list,rbi,type_by);
if(type_by==RenderPassTypeBy::Normal)
RenderPassListByNormal.Add(code,rp);
return rp;
}
VK_NAMESPACE_END

View File

@ -1,17 +1,9 @@
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
RenderTarget *GPUDevice::CreateRenderTarget(Framebuffer *fb,const uint32_t fence_count)
{
return(new RenderTarget(this,fb,fence_count));
}
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uint32_t fence_count)
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,RenderPass *rp,const uint32_t fence_count)
{
if(!fbi)return(nullptr);
RenderPass *rp=CreateRenderPass(RenderpassTypeBy::Format,fbi); //Renderpass内部会验证格式所以不需要自己处理
if(!rp)return(nullptr);
const uint32_t color_count=fbi->GetColorCount();
@ -51,7 +43,17 @@ RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uin
}
SAFE_CLEAR(depth_texture);
delete rp;
return nullptr;
}
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uint32_t fence_count)
{
if(!fbi)return(nullptr);
RenderPass *rp=AcquireRenderPass(fbi,RenderPassTypeBy::Normal);
if(!rp)return(nullptr);
return CreateRenderTarget(fbi,rp,fence_count);
}
VK_NAMESPACE_END

View File

@ -3,20 +3,25 @@
#include<hgl/graph/VKSemaphore.h>
VK_NAMESPACE_BEGIN
namespace
{
struct SwapchainFormatHash
{
union
{
struct
{
uint32 color;
uint32 depth;
uint32_t color;
uint32_t depth;
};
uint64 hash;
uint64 hashcode;
};
};//
static Map<uint64,RenderPass *> RenderpassListBySimple;
}//namespace
SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,sc->GetImageCount())
{
swapchain=sc;
@ -31,9 +36,21 @@ SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):Rende
Texture2D **sc_color=swapchain->GetColorTextures();
Texture2D *sc_depth=swapchain->GetDepthTexture();
{
SwapchainFormatHash sfh;
sfh.color=(*sc_color)->GetFormat();
sfh.depth=sc_depth->GetFormat();
if(!RenderpassListBySimple.Get(sfh.hashcode,this->render_pass))
{
SwapchainRenderbufferInfo rbi((*sc_color)->GetFormat(),sc_depth->GetFormat());
this->render_pass=device->CreateRenderPass(RenderpassTypeBy::Simple,&rbi);
this->render_pass=device->AcquireRenderPass(&rbi,RenderPassTypeBy::Simple);
RenderpassListBySimple.Add(sfh.hashcode,this->render_pass);
}
}
swap_chain_count=swapchain->GetImageCount();