测试用例创建Renderpass成功
This commit is contained in:
parent
4032baac39
commit
301aaaef56
@ -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;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()
|
||||
{
|
||||
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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -5,59 +5,53 @@
|
||||
VK_NAMESPACE_BEGIN
|
||||
void Device::CreateSubpassDependency(List<VkSubpassDependency> &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;i<count;i++)
|
||||
{
|
||||
VkSubpassDependency dependency;
|
||||
dependency->dstStageMask = 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;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 = 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<VkAtta
|
||||
sd.pDepthStencilAttachment =nullptr;
|
||||
}
|
||||
|
||||
sd.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||
sd.pColorAttachments = ref_list.GetData();
|
||||
sd.flags =0;
|
||||
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,
|
||||
@ -203,14 +203,16 @@ RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &des
|
||||
|
||||
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);
|
||||
|
||||
++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<VkSubpassDescription> subpass_desc_list;
|
||||
|
||||
VkSubpassDescription subpass;
|
||||
|
||||
|
||||
subpass.flags = 0;
|
||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||
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);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user