测试用例创建Renderpass成功
This commit is contained in:
parent
4032baac39
commit
301aaaef56
@ -26,6 +26,11 @@ struct AtomsphereData
|
|||||||
|
|
||||||
using Texture2DPointer=vulkan::Texture2D *;
|
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
|
class TestApp:public CameraAppFramework
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -79,15 +84,57 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
const VkFormat GetCandidateFormat(const VkFormat *fmt_list,const uint count)
|
||||||
|
{
|
||||||
|
auto pd=device->GetPhysicalDevice();
|
||||||
|
|
||||||
|
for(uint i=0;i<count;i++)
|
||||||
|
if(pd->IsColorAttachmentOptimal(fmt_list[i]))
|
||||||
|
return fmt_list[i];
|
||||||
|
|
||||||
|
for(uint i=0;i<count;i++)
|
||||||
|
if(pd->IsColorAttachmentLinear(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()
|
bool InitGBuffer()
|
||||||
{
|
{
|
||||||
gbuffer.width=power_to_2(SCREEN_WIDTH);
|
gbuffer.width=1024;
|
||||||
gbuffer.height=power_to_2(SCREEN_HEIGHT);
|
gbuffer.height=1024;
|
||||||
|
|
||||||
gbuffer.position=device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height);
|
//根据候选格式表选择格式
|
||||||
gbuffer.color =device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height);
|
const VkFormat position_format =GetCandidateFormat(position_candidate_format, sizeof(position_candidate_format));
|
||||||
gbuffer.normal =device->CreateTexture2DColor(FMT_RGB32F, gbuffer.width,gbuffer.height);
|
const VkFormat color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format));
|
||||||
gbuffer.depth =device->CreateTexture2DDepth(FMT_D32F, gbuffer.width,gbuffer.height);
|
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++)
|
for(uint i=0;i<3;i++)
|
||||||
{
|
{
|
||||||
@ -118,7 +165,7 @@ private:
|
|||||||
if(!gbuffer.renderpass)
|
if(!gbuffer.renderpass)
|
||||||
return(false);
|
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)
|
if(!gbuffer.framebuffer)
|
||||||
return(false);
|
return(false);
|
||||||
@ -220,6 +267,9 @@ public:
|
|||||||
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
|
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
if(!InitGBuffer())
|
||||||
|
return(false);
|
||||||
|
|
||||||
if(!InitMaterial())
|
if(!InitMaterial())
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
@ -82,6 +82,12 @@ public:
|
|||||||
|
|
||||||
bool IsColorAttachmentOptimal(const VkFormat format)const{return OptimalSupport(format,VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);}
|
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 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 GetDepthFormat(bool lower_to_high=true)const;
|
||||||
VkFormat GetDepthStencilFormat(bool lower_to_high=true)const;
|
VkFormat GetDepthStencilFormat(bool lower_to_high=true)const;
|
||||||
|
@ -5,59 +5,53 @@
|
|||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
void Device::CreateSubpassDependency(List<VkSubpassDependency> &subpass_dependency_list,const uint32_t count) const
|
void Device::CreateSubpassDependency(List<VkSubpassDependency> &subpass_dependency_list,const uint32_t count) const
|
||||||
{
|
{
|
||||||
if(count==1)
|
if(count<=0)return;
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
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
|
else
|
||||||
{
|
{
|
||||||
for(uint32_t i=0;i<count;i++)
|
dependency->dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
{
|
dependency->dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
VkSubpassDependency dependency;
|
|
||||||
|
|
||||||
if(i==0)
|
++dependency;
|
||||||
|
|
||||||
|
for(uint32_t i=1;i<count;i++)
|
||||||
|
{
|
||||||
|
dependency->srcSubpass = i-1;
|
||||||
|
dependency->srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
|
||||||
|
if(i==count-1)
|
||||||
{
|
{
|
||||||
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
dependency->dstSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
dependency.dstSubpass = 0;
|
dependency->dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
dependency->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
dependency->dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
|
||||||
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dependency.srcSubpass = i-1;
|
dependency->dstSubpass = i;
|
||||||
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
dependency->dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||||
|
dependency->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
if(i==count-1)
|
dependency->dstAccessMask = VK_ACCESS_SHADER_READ_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.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;
|
dependency->dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
||||||
|
|
||||||
subpass_dependency_list.Add(dependency);
|
++dependency;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,8 +180,14 @@ void Device::CreateSubpassDescription(VkSubpassDescription &sd,const List<VkAtta
|
|||||||
sd.pDepthStencilAttachment =nullptr;
|
sd.pDepthStencilAttachment =nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
sd.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
sd.flags =0;
|
||||||
sd.pColorAttachments = ref_list.GetData();
|
sd.pipelineBindPoint =VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
sd.inputAttachmentCount =0;
|
||||||
|
sd.pInputAttachments =nullptr;
|
||||||
|
sd.pColorAttachments =ref_list.GetData();
|
||||||
|
sd.pResolveAttachments =nullptr;
|
||||||
|
sd.preserveAttachmentCount =0;
|
||||||
|
sd.pPreserveAttachments =nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
@ -203,14 +203,16 @@ RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &des
|
|||||||
|
|
||||||
for(int i=0;i<color_format.GetCount();i++)
|
for(int i=0;i<color_format.GetCount();i++)
|
||||||
{
|
{
|
||||||
if(!attr->physical_device->IsColorAttachmentOptimal(*cf))
|
if(!attr->physical_device->IsColorAttachmentOptimal(*cf)
|
||||||
|
&&!attr->physical_device->IsColorAttachmentLinear(*cf))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
++cf;
|
++cf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format))
|
if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format)
|
||||||
|
&&!attr->physical_device->IsDepthAttachmentLinear(depth_format))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
VkRenderPassCreateInfo rp_info;
|
VkRenderPassCreateInfo rp_info;
|
||||||
@ -251,7 +253,7 @@ RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format
|
|||||||
List<VkSubpassDescription> subpass_desc_list;
|
List<VkSubpassDescription> subpass_desc_list;
|
||||||
|
|
||||||
VkSubpassDescription subpass;
|
VkSubpassDescription subpass;
|
||||||
|
|
||||||
subpass.flags = 0;
|
subpass.flags = 0;
|
||||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
subpass.inputAttachmentCount = 0;
|
subpass.inputAttachmentCount = 0;
|
||||||
|
@ -77,7 +77,7 @@ Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List<ImageView *> &col
|
|||||||
return CreateFramebuffer(dev,rp,color.GetData(),color.GetCount(),depth);
|
return CreateFramebuffer(dev,rp,color.GetData(),color.GetCount(),depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List<ImageView *> image_view_list)
|
Framebuffer *CreateFramebuffer(Device *dev,RenderPass *rp,List<ImageView *> &image_view_list)
|
||||||
{
|
{
|
||||||
const int count=image_view_list.GetCount();
|
const int count=image_view_list.GetCount();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user