add RenderPassTypeBy and cache
This commit is contained in:
parent
9f80a02821
commit
b5188a63ea
@ -1 +1 @@
|
|||||||
Subproject commit cf93f6e0910d96ffd8dd840209f6e65f162e1cd9
|
Subproject commit ea88b9fa13b816293530be9232f9ce5a529944ae
|
2
CMUtil
2
CMUtil
@ -1 +1 @@
|
|||||||
Subproject commit 8ce98c85a397921277cd19a91993b6724bf1d391
|
Subproject commit be9122db80512d3c046fe68b3b9948dd2078dec7
|
@ -62,6 +62,14 @@ class IndexBuffer;
|
|||||||
class GPUCmdBuffer;
|
class GPUCmdBuffer;
|
||||||
class RenderCmdBuffer;
|
class RenderCmdBuffer;
|
||||||
class TextureCmdBuffer;
|
class TextureCmdBuffer;
|
||||||
|
|
||||||
|
enum class RenderPassTypeBy
|
||||||
|
{
|
||||||
|
Simple=0,
|
||||||
|
Normal,
|
||||||
|
Verbose
|
||||||
|
};//
|
||||||
|
|
||||||
class RenderPass;
|
class RenderPass;
|
||||||
class GPUFence;
|
class GPUFence;
|
||||||
class GPUSemaphore;
|
class GPUSemaphore;
|
||||||
|
@ -211,12 +211,17 @@ public: //Command Buffer 相关
|
|||||||
RenderCmdBuffer * CreateRenderCommandBuffer();
|
RenderCmdBuffer * CreateRenderCommandBuffer();
|
||||||
TextureCmdBuffer *CreateTextureCommandBuffer();
|
TextureCmdBuffer *CreateTextureCommandBuffer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
const List<VkSubpassDescription> &subpass,
|
const List<VkSubpassDescription> &subpass,
|
||||||
const List<VkSubpassDependency> &dependency,
|
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);
|
GPUFence * CreateFence(bool);
|
||||||
GPUSemaphore * CreateGPUSemaphore();
|
GPUSemaphore * CreateGPUSemaphore();
|
||||||
@ -232,14 +237,13 @@ public:
|
|||||||
|
|
||||||
bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列
|
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);
|
RenderTarget *CreateRenderTarget( const FramebufferInfo *fbi,const uint32_t fence_count=1);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Pipeline *CreatePipeline(const InlinePipeline &,const Material *,const RenderTarget *);
|
|
||||||
Pipeline *CreatePipeline( PipelineData *, const Material *,const RenderTarget *);
|
Pipeline *CreatePipeline( PipelineData *, const Material *,const RenderTarget *);
|
||||||
|
Pipeline *CreatePipeline(const InlinePipeline &,const Material *,const RenderTarget *);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -14,10 +14,23 @@ class Pipeline
|
|||||||
|
|
||||||
bool alpha_test;
|
bool alpha_test;
|
||||||
bool alpha_blend;
|
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:
|
public:
|
||||||
|
|
||||||
Pipeline(VkDevice dev,VkPipeline p,PipelineData *pd):device(dev),pipeline(p),data(pd){}
|
|
||||||
virtual ~Pipeline();
|
virtual ~Pipeline();
|
||||||
|
|
||||||
operator VkPipeline(){return pipeline;}
|
operator VkPipeline(){return pipeline;}
|
||||||
|
@ -49,7 +49,7 @@ namespace hgl
|
|||||||
RenderTarget *rt=CreateRenderTarget(size.x,size.y,format);
|
RenderTarget *rt=CreateRenderTarget(size.x,size.y,format);
|
||||||
|
|
||||||
if(!rt)return(false);
|
if(!rt)return(false);
|
||||||
|
|
||||||
ThemeForm *tf=CreateForm(f,rt);
|
ThemeForm *tf=CreateForm(f,rt);
|
||||||
|
|
||||||
form_list.Add(f,tf);
|
form_list.Add(f,tf);
|
||||||
|
@ -119,6 +119,7 @@ SET(VK_DEVICE_SOURCE ${SG_INCLUDE_PATH}/VKDevice.h
|
|||||||
Vulkan/VKDeviceImage.cpp
|
Vulkan/VKDeviceImage.cpp
|
||||||
Vulkan/VKDeviceTexture.cpp
|
Vulkan/VKDeviceTexture.cpp
|
||||||
Vulkan/VKDeviceMaterial.cpp
|
Vulkan/VKDeviceMaterial.cpp
|
||||||
|
Vulkan/VKDevicePipeline.cpp
|
||||||
Vulkan/VKDeviceFramebuffer.cpp
|
Vulkan/VKDeviceFramebuffer.cpp
|
||||||
Vulkan/VKDeviceSwapchain.cpp
|
Vulkan/VKDeviceSwapchain.cpp
|
||||||
Vulkan/VKDeviceRenderPass.cpp
|
Vulkan/VKDeviceRenderPass.cpp
|
||||||
|
@ -234,14 +234,14 @@ namespace
|
|||||||
delete hash;
|
delete hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Map<RenderPassHASHCode,RenderPass *> RenderPassList;
|
static Map<RenderPassHASHCode,RenderPass *> RenderPassListByVerbose;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
|
RenderPass *GPUDevice::CreateRenderPass(const List<VkAttachmentDescription> &desc_list,
|
||||||
const List<VkAttachmentDescription> &desc_list,
|
|
||||||
const List<VkSubpassDescription> &subpass,
|
const List<VkSubpassDescription> &subpass,
|
||||||
const List<VkSubpassDependency> &dependency,
|
const List<VkSubpassDependency> &dependency,
|
||||||
const RenderbufferInfo *rbi)
|
const RenderbufferInfo *rbi,
|
||||||
|
const RenderPassTypeBy &type_by)
|
||||||
{
|
{
|
||||||
for(const VkFormat cf:rbi->GetColorFormatList())
|
for(const VkFormat cf:rbi->GetColorFormatList())
|
||||||
{
|
{
|
||||||
@ -269,15 +269,17 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,
|
|||||||
rp_info.pSubpasses = subpass.GetData();
|
rp_info.pSubpasses = subpass.GetData();
|
||||||
rp_info.dependencyCount = dependency.GetCount();
|
rp_info.dependencyCount = dependency.GetCount();
|
||||||
rp_info.pDependencies = dependency.GetData();
|
rp_info.pDependencies = dependency.GetData();
|
||||||
|
|
||||||
RenderPassHASHCode code;
|
RenderPassHASHCode code;
|
||||||
|
RenderPass *rp=nullptr;
|
||||||
|
|
||||||
HashRenderPass(&code,rp_info);
|
if(type_by==RenderPassTypeBy::Verbose)
|
||||||
|
{
|
||||||
|
HashRenderPass(&code,rp_info);
|
||||||
|
|
||||||
RenderPass *rp;
|
if(RenderPassListByVerbose.Get(code,rp))
|
||||||
|
return rp;
|
||||||
if(RenderPassList.Get(code,rp))
|
}
|
||||||
return rp;
|
|
||||||
|
|
||||||
VkRenderPass render_pass;
|
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);
|
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;
|
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())
|
for(const VkFormat &fmt:rbi->GetColorFormatList())
|
||||||
if(!attr->physical_device->IsColorAttachmentOptimal(fmt))
|
if(!attr->physical_device->IsColorAttachmentOptimal(fmt))
|
||||||
return(nullptr);
|
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;
|
List<VkAttachmentReference> color_ref_list;
|
||||||
VkAttachmentReference depth_ref;
|
VkAttachmentReference depth_ref;
|
||||||
List<VkAttachmentDescription> atta_desc_list;
|
List<VkAttachmentDescription> atta_desc_list;
|
||||||
@ -323,6 +355,11 @@ RenderPass *GPUDevice::CreateRenderPass(const RenderpassTypeBy &type_by,const Re
|
|||||||
|
|
||||||
CreateSubpassDependency(subpass_dependency_list,2);
|
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
|
VK_NAMESPACE_END
|
||||||
|
@ -1,17 +1,9 @@
|
|||||||
#include<hgl/graph/VKDevice.h>
|
#include<hgl/graph/VKDevice.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
RenderTarget *GPUDevice::CreateRenderTarget(Framebuffer *fb,const uint32_t fence_count)
|
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,RenderPass *rp,const uint32_t fence_count)
|
||||||
{
|
|
||||||
return(new RenderTarget(this,fb,fence_count));
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uint32_t fence_count)
|
|
||||||
{
|
{
|
||||||
if(!fbi)return(nullptr);
|
if(!fbi)return(nullptr);
|
||||||
|
|
||||||
RenderPass *rp=CreateRenderPass(RenderpassTypeBy::Format,fbi); //Renderpass内部会验证格式,所以不需要自己处理
|
|
||||||
|
|
||||||
if(!rp)return(nullptr);
|
if(!rp)return(nullptr);
|
||||||
|
|
||||||
const uint32_t color_count=fbi->GetColorCount();
|
const uint32_t color_count=fbi->GetColorCount();
|
||||||
@ -51,7 +43,17 @@ RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uin
|
|||||||
}
|
}
|
||||||
|
|
||||||
SAFE_CLEAR(depth_texture);
|
SAFE_CLEAR(depth_texture);
|
||||||
delete rp;
|
|
||||||
return nullptr;
|
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
|
VK_NAMESPACE_END
|
@ -3,19 +3,24 @@
|
|||||||
#include<hgl/graph/VKSemaphore.h>
|
#include<hgl/graph/VKSemaphore.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
struct SwapchainFormatHash
|
namespace
|
||||||
{
|
{
|
||||||
union
|
struct SwapchainFormatHash
|
||||||
{
|
{
|
||||||
struct
|
union
|
||||||
{
|
{
|
||||||
uint32 color;
|
struct
|
||||||
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())
|
SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):RenderTarget(dev,nullptr,sc->GetImageCount())
|
||||||
{
|
{
|
||||||
@ -31,9 +36,21 @@ SwapchainRenderTarget::SwapchainRenderTarget(GPUDevice *dev,Swapchain *sc):Rende
|
|||||||
Texture2D **sc_color=swapchain->GetColorTextures();
|
Texture2D **sc_color=swapchain->GetColorTextures();
|
||||||
Texture2D *sc_depth=swapchain->GetDepthTexture();
|
Texture2D *sc_depth=swapchain->GetDepthTexture();
|
||||||
|
|
||||||
SwapchainRenderbufferInfo rbi((*sc_color)->GetFormat(),sc_depth->GetFormat());
|
{
|
||||||
|
SwapchainFormatHash sfh;
|
||||||
|
|
||||||
|
sfh.color=(*sc_color)->GetFormat();
|
||||||
|
sfh.depth=sc_depth->GetFormat();
|
||||||
|
|
||||||
this->render_pass=device->CreateRenderPass(RenderpassTypeBy::Simple,&rbi);
|
if(!RenderpassListBySimple.Get(sfh.hashcode,this->render_pass))
|
||||||
|
{
|
||||||
|
SwapchainRenderbufferInfo rbi((*sc_color)->GetFormat(),sc_depth->GetFormat());
|
||||||
|
|
||||||
|
this->render_pass=device->AcquireRenderPass(&rbi,RenderPassTypeBy::Simple);
|
||||||
|
|
||||||
|
RenderpassListBySimple.Add(sfh.hashcode,this->render_pass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
swap_chain_count=swapchain->GetImageCount();
|
swap_chain_count=swapchain->GetImageCount();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user