From 301aaaef56c006ab2d0a08e64224307487b382f8 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 5 Jul 2019 19:56:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E5=88=9B?= =?UTF-8?q?=E5=BB=BARenderpass=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/Deferred.cpp | 64 +++++++++++-- inc/hgl/graph/vulkan/VKPhysicalDevice.h | 6 ++ .../Vulkan/VKDeviceRenderPass.cpp | 96 ++++++++++--------- src/RenderDevice/Vulkan/VKFramebuffer.cpp | 2 +- 4 files changed, 113 insertions(+), 55 deletions(-) diff --git a/example/Vulkan/Deferred.cpp b/example/Vulkan/Deferred.cpp index b6659944..d131ee23 100644 --- a/example/Vulkan/Deferred.cpp +++ b/example/Vulkan/Deferred.cpp @@ -26,6 +26,11 @@ struct AtomsphereData using Texture2DPointer=vulkan::Texture2D *; +constexpr VkFormat position_candidate_format[]={FMT_RGBA32F,FMT_RGBA16F}; +constexpr VkFormat color_candidate_format []={FMT_RGBA32F,FMT_RGBA16F,FMT_RGB16UN,FMT_RGB16SN,FMT_RGBA8UN,FMT_RGBA8SN,FMT_RGBA8U,FMT_RGB565,FMT_BGR565}; +constexpr VkFormat normal_candidate_format []={FMT_RGBA32F,FMT_RGBA16F}; +constexpr VkFormat depth_candidate_format []={FMT_D32F,FMT_D32F_S8U,FMT_X8_D24,FMT_D24UN_S8U,FMT_D16UN,FMT_D16UN_S8U}; + class TestApp:public CameraAppFramework { private: @@ -79,15 +84,57 @@ private: private: + const VkFormat GetCandidateFormat(const VkFormat *fmt_list,const uint count) + { + auto pd=device->GetPhysicalDevice(); + + for(uint i=0;iIsColorAttachmentOptimal(fmt_list[i])) + return fmt_list[i]; + + for(uint i=0;iIsColorAttachmentLinear(fmt_list[i])) + return fmt_list[i]; + + return FMT_UNDEFINED; + } + + const VkFormat GetDepthCandidateFormat() + { + auto pd=device->GetPhysicalDevice(); + + for(VkFormat fmt:depth_candidate_format) + if(pd->IsDepthAttachmentOptimal(fmt)) + return fmt; + + for(VkFormat fmt:depth_candidate_format) + if(pd->IsDepthAttachmentLinear(fmt)) + return fmt; + + return FMT_UNDEFINED; + } + bool InitGBuffer() { - gbuffer.width=power_to_2(SCREEN_WIDTH); - gbuffer.height=power_to_2(SCREEN_HEIGHT); + gbuffer.width=1024; + gbuffer.height=1024; - gbuffer.position=device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height); - gbuffer.color =device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height); - gbuffer.normal =device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height); - gbuffer.depth =device->CreateTexture2DDepth(FMT_D32F, gbuffer.width,gbuffer.height); + //根据候选格式表选择格式 + const VkFormat position_format =GetCandidateFormat(position_candidate_format, sizeof(position_candidate_format)); + const VkFormat color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format)); + const VkFormat normal_format =GetCandidateFormat(normal_candidate_format, sizeof(normal_candidate_format)); + const VkFormat depth_format =GetDepthCandidateFormat(); + + if(position_format ==FMT_UNDEFINED + ||color_format ==FMT_UNDEFINED + ||normal_format ==FMT_UNDEFINED + ||depth_format ==FMT_UNDEFINED) + return(false); + + gbuffer.position=device->CreateTexture2DColor(position_format, gbuffer.width,gbuffer.height); + gbuffer.color =device->CreateTexture2DColor(color_format, gbuffer.width,gbuffer.height); + gbuffer.normal =device->CreateTexture2DColor(normal_format, gbuffer.width,gbuffer.height); + gbuffer.depth =device->CreateTexture2DDepth(depth_format, gbuffer.width,gbuffer.height); for(uint i=0;i<3;i++) { @@ -118,7 +165,7 @@ private: if(!gbuffer.renderpass) return(false); - gbuffer.framebuffer=vulkan::CreateFramebuffer(device,gbuffer.renderpass,gbuffer.image_view_list); + gbuffer.framebuffer=vulkan::CreateFramebuffer(device,gbuffer.renderpass,gbuffer.image_view_list,gbuffer.depth->GetImageView()); if(!gbuffer.framebuffer) return(false); @@ -220,6 +267,9 @@ public: if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); + if(!InitGBuffer()) + return(false); + if(!InitMaterial()) return(false); diff --git a/inc/hgl/graph/vulkan/VKPhysicalDevice.h b/inc/hgl/graph/vulkan/VKPhysicalDevice.h index 2ec19e3e..e4e2f521 100644 --- a/inc/hgl/graph/vulkan/VKPhysicalDevice.h +++ b/inc/hgl/graph/vulkan/VKPhysicalDevice.h @@ -82,6 +82,12 @@ public: bool IsColorAttachmentOptimal(const VkFormat format)const{return OptimalSupport(format,VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);} bool IsDepthAttachmentOptimal(const VkFormat format)const{return OptimalSupport(format,VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);} + + bool IsColorAttachmentLinear(const VkFormat format)const{return LinearSupport(format,VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);} + bool IsDepthAttachmentLinear(const VkFormat format)const{return LinearSupport(format,VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);} + + bool IsColorAttachmentBuffer(const VkFormat format)const{return BufferSupport(format,VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);} + bool IsDepthAttachmentBuffer(const VkFormat format)const{return BufferSupport(format,VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);} VkFormat GetDepthFormat(bool lower_to_high=true)const; VkFormat GetDepthStencilFormat(bool lower_to_high=true)const; diff --git a/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp b/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp index a9de3e80..98fc72f1 100644 --- a/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp @@ -5,59 +5,53 @@ VK_NAMESPACE_BEGIN void Device::CreateSubpassDependency(List &subpass_dependency_list,const uint32_t count) const { - if(count==1) - { - VkSubpassDependency dependency; - - dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstSubpass = 0; - dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; - dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + if(count<=0)return; - subpass_dependency_list.Add(dependency); + subpass_dependency_list.SetCount(count); + + VkSubpassDependency *dependency=subpass_dependency_list.GetData(); + + dependency->srcSubpass = VK_SUBPASS_EXTERNAL; + dependency->dstSubpass = 0; + dependency->srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependency->srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + dependency->dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + + if(count==1) + { + dependency->dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependency->dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; } else { - for(uint32_t i=0;idstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency->dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - if(i==0) + ++dependency; + + for(uint32_t i=1;isrcSubpass = i-1; + dependency->srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + + if(i==count-1) { - dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstSubpass = 0; - dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency->dstSubpass = VK_SUBPASS_EXTERNAL; + dependency->dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependency->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency->dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; } else { - dependency.srcSubpass = i-1; - dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - - if(i==count-1) - { - dependency.dstSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; - } - else - { - dependency.dstSubpass = i; - dependency.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependency.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - } + dependency->dstSubpass = i; + dependency->dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + dependency->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency->dstAccessMask = VK_ACCESS_SHADER_READ_BIT; } - dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; - - subpass_dependency_list.Add(dependency); + dependency->dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + + ++dependency; } } } @@ -186,8 +180,14 @@ void Device::CreateSubpassDescription(VkSubpassDescription &sd,const List &desc_list, @@ -203,14 +203,16 @@ RenderPass *Device::CreateRenderPass( const List &des for(int i=0;iphysical_device->IsColorAttachmentOptimal(*cf)) + if(!attr->physical_device->IsColorAttachmentOptimal(*cf) + &&!attr->physical_device->IsColorAttachmentLinear(*cf)) return(false); ++cf; } } - if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format)) + if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format) + &&!attr->physical_device->IsDepthAttachmentLinear(depth_format)) return(false); VkRenderPassCreateInfo rp_info; @@ -251,7 +253,7 @@ RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format List subpass_desc_list; VkSubpassDescription subpass; - + subpass.flags = 0; subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass.inputAttachmentCount = 0; diff --git a/src/RenderDevice/Vulkan/VKFramebuffer.cpp b/src/RenderDevice/Vulkan/VKFramebuffer.cpp index bbd187be..9f075e5f 100644 --- a/src/RenderDevice/Vulkan/VKFramebuffer.cpp +++ b/src/RenderDevice/Vulkan/VKFramebuffer.cpp @@ -77,7 +77,7 @@ Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List &col return CreateFramebuffer(dev,rp,color.GetData(),color.GetCount(),depth); } -Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List image_view_list) +Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List &image_view_list) { const int count=image_view_list.GetCount();