拆分独立的CreateSubpassDependency,CreateAttachment函数
This commit is contained in:
parent
ea0616d41d
commit
395102da6f
@ -165,15 +165,31 @@ public: //material相关
|
|||||||
public: //Command Buffer 相关
|
public: //Command Buffer 相关
|
||||||
|
|
||||||
CommandBuffer * CreateCommandBuffer();
|
CommandBuffer * CreateCommandBuffer();
|
||||||
|
|
||||||
|
void CreateSubpassDependency(List<VkSubpassDependency> &dependency,const uint32_t count);
|
||||||
|
|
||||||
RenderPass * CreateRenderPass( List<VkSubpassDescription> &subpass,
|
bool CreateAttachment( List<VkAttachmentReference> &ref_list,
|
||||||
List<VkFormat> color_format,VkFormat depth_format,
|
List<VkAttachmentDescription> &desc_list,
|
||||||
VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
const List<VkFormat> &color_format,
|
||||||
VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
const VkFormat depth_format,
|
||||||
|
const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
|
const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
RenderPass * CreateRenderPass( VkFormat color_format,VkFormat depth_format,
|
// bool CreateColorAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const List<VkFormat> &color_format,const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
// bool CreateDepthAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const List<VkFormat> &depth_format,const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
|
||||||
|
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
|
const List<VkSubpassDescription> &subpass,
|
||||||
|
const List<VkSubpassDependency> &dependency,
|
||||||
|
const List<VkFormat> &color_format,
|
||||||
|
const VkFormat depth_format,
|
||||||
|
const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
|
const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
|
RenderPass * CreateRenderPass( const VkFormat color_format,
|
||||||
|
const VkFormat depth_format,
|
||||||
|
const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||||
|
const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
Fence * CreateFence(bool);
|
Fence * CreateFence(bool);
|
||||||
Semaphore * CreateSem();
|
Semaphore * CreateSem();
|
||||||
|
@ -3,113 +3,127 @@
|
|||||||
#include<hgl/graph/vulkan/VKRenderPass.h>
|
#include<hgl/graph/vulkan/VKRenderPass.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
RenderPass *Device::CreateRenderPass(List<VkSubpassDescription> &subpass,List<VkFormat> color_format,VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout)
|
void Device::CreateSubpassDependency(List<VkSubpassDependency> &subpass_dependency_list,const uint32_t count)
|
||||||
{
|
{
|
||||||
int depth=-1;
|
if(count==1)
|
||||||
uint atta_count=color_format.GetCount();
|
|
||||||
|
|
||||||
if(attr->physical_device->CheckDepthFormat(depth_format))
|
|
||||||
{
|
{
|
||||||
depth=atta_count++;
|
VkSubpassDependency dependency;
|
||||||
}
|
|
||||||
|
|
||||||
SharedArray<VkAttachmentDescription> attachments=new VkAttachmentDescription[atta_count];
|
|
||||||
SharedArray<VkAttachmentReference> color_references=new VkAttachmentReference[color_format.GetCount()];
|
|
||||||
|
|
||||||
for(uint i=0;i<atta_count;i++)
|
|
||||||
{
|
|
||||||
attachments[i].flags = 0;
|
|
||||||
attachments[i].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; //LOAD_OP_CLEAR代表LOAD时清空内容
|
|
||||||
attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE; //STORE_OP_STROE代表SOTRE时储存内容
|
|
||||||
attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; //DONT CARE表示不在意
|
|
||||||
attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachments[i].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //代表不关心初始布局
|
|
||||||
}
|
|
||||||
|
|
||||||
const VkFormat *cf=color_format.GetData();
|
|
||||||
for(int i=0;i<color_format.GetCount();i++)
|
|
||||||
{
|
|
||||||
attachments[i].finalLayout = color_final_layout;
|
|
||||||
attachments[i].format = *cf;
|
|
||||||
++cf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(depth!=-1)
|
|
||||||
{
|
|
||||||
attachments[depth].finalLayout = depth_final_layout;
|
|
||||||
attachments[depth].format = depth_format;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint32_t subpass_count=subpass.GetCount();
|
|
||||||
uint32_t dependency_count;
|
|
||||||
|
|
||||||
SharedArray<VkSubpassDependency> dependency;
|
|
||||||
|
|
||||||
if(subpass_count==1)
|
|
||||||
{
|
|
||||||
dependency_count=1;
|
|
||||||
dependency=new VkSubpassDependency[dependency_count];
|
|
||||||
|
|
||||||
dependency[0].srcSubpass = VK_SUBPASS_EXTERNAL;
|
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
dependency[0].dstSubpass = 0;
|
dependency.dstSubpass = 0;
|
||||||
dependency[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency[0].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
dependency[0].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
dependency[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
||||||
|
|
||||||
|
subpass_dependency_list.Add(dependency);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dependency_count=subpass_count+1;
|
for(uint32_t i=0;i<count;i++)
|
||||||
|
{
|
||||||
|
VkSubpassDependency dependency;
|
||||||
|
|
||||||
dependency=new VkSubpassDependency[dependency_count];
|
|
||||||
|
|
||||||
for(uint32_t i=0;i<subpass_count+1;i++)
|
|
||||||
{
|
|
||||||
if(i==0)
|
if(i==0)
|
||||||
{
|
{
|
||||||
dependency[i].srcSubpass = VK_SUBPASS_EXTERNAL;
|
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
dependency[i].dstSubpass = 0;
|
dependency.dstSubpass = 0;
|
||||||
dependency[i].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency[i].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
dependency[i].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
dependency[i].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dependency[i].srcSubpass = i-1;
|
dependency.srcSubpass = i-1;
|
||||||
dependency[i].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
|
||||||
if(i==subpass_count)
|
if(i==count-1)
|
||||||
{
|
{
|
||||||
dependency[i].dstSubpass = VK_SUBPASS_EXTERNAL;
|
dependency.dstSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
dependency[i].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency[i].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
dependency[i].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dependency[i].dstSubpass = i;
|
dependency.dstSubpass = i;
|
||||||
dependency[i].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
dependency.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||||
dependency[i].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
dependency[i].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
dependency.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependency[i].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
||||||
|
|
||||||
|
subpass_dependency_list.Add(dependency);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Device::CreateAttachment(List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const List<VkFormat> &color_format,const VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout)
|
||||||
|
{
|
||||||
|
if(!attr->physical_device->CheckDepthFormat(depth_format))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
uint atta_count=color_format.GetCount();
|
||||||
|
|
||||||
|
desc_list.SetCount(atta_count+1);
|
||||||
|
VkAttachmentDescription *desc=desc_list.GetData();
|
||||||
|
|
||||||
|
ref_list.SetCount(atta_count+1);
|
||||||
|
VkAttachmentReference *ref=ref_list.GetData();
|
||||||
|
|
||||||
|
for(uint i=0;i<atta_count+1;i++)
|
||||||
|
{
|
||||||
|
desc[i].flags = 0;
|
||||||
|
desc[i].samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
desc[i].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; //LOAD_OP_CLEAR代表LOAD时清空内容
|
||||||
|
desc[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE; //STORE_OP_STROE代表SOTRE时储存内容
|
||||||
|
desc[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; //DONT CARE表示不在意
|
||||||
|
desc[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
desc[i].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //代表不关心初始布局
|
||||||
|
}
|
||||||
|
|
||||||
|
const VkFormat *cf=color_format.GetData();
|
||||||
|
for(int i=0;i<atta_count;i++)
|
||||||
|
{
|
||||||
|
desc[i].finalLayout = color_final_layout;
|
||||||
|
desc[i].format = *cf;
|
||||||
|
++cf;
|
||||||
|
|
||||||
|
ref[i].attachment = i;
|
||||||
|
ref[i].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc[atta_count].finalLayout = depth_final_layout;
|
||||||
|
desc[atta_count].format = depth_format;
|
||||||
|
|
||||||
|
ref[atta_count].attachment = atta_count;
|
||||||
|
ref[atta_count].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
|
const List<VkSubpassDescription> &subpass,
|
||||||
|
const List<VkSubpassDependency> &dependency,
|
||||||
|
const List<VkFormat> &color_format,
|
||||||
|
const VkFormat depth_format,
|
||||||
|
const VkImageLayout color_final_layout,
|
||||||
|
const VkImageLayout depth_final_layout)
|
||||||
|
{
|
||||||
|
|
||||||
VkRenderPassCreateInfo rp_info;
|
VkRenderPassCreateInfo rp_info;
|
||||||
rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
rp_info.pNext = nullptr;
|
rp_info.pNext = nullptr;
|
||||||
rp_info.attachmentCount = atta_count;
|
rp_info.attachmentCount = desc_list.GetCount();
|
||||||
rp_info.pAttachments = attachments;
|
rp_info.pAttachments = desc_list.GetData();
|
||||||
rp_info.subpassCount = subpass.GetCount();
|
rp_info.subpassCount = subpass.GetCount();
|
||||||
rp_info.pSubpasses = subpass.GetData();
|
rp_info.pSubpasses = subpass.GetData();
|
||||||
rp_info.dependencyCount = dependency_count;
|
rp_info.dependencyCount = dependency.GetCount();
|
||||||
rp_info.pDependencies = dependency;
|
rp_info.pDependencies = dependency.GetData();
|
||||||
|
|
||||||
VkRenderPass render_pass;
|
VkRenderPass render_pass;
|
||||||
|
|
||||||
@ -121,8 +135,14 @@ RenderPass *Device::CreateRenderPass(List<VkSubpassDescription> &subpass,List<Vk
|
|||||||
|
|
||||||
RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout)
|
RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout)
|
||||||
{
|
{
|
||||||
VkAttachmentReference color_atta_ref={0,VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
|
List<VkAttachmentReference> ref_list;
|
||||||
VkAttachmentReference depth_atta_ref={1,VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
|
List<VkAttachmentDescription> desc_list;
|
||||||
|
|
||||||
|
List<VkFormat> color_format_list;
|
||||||
|
|
||||||
|
color_format_list.Add(color_format);
|
||||||
|
|
||||||
|
CreateAttachment(ref_list,desc_list,color_format_list,depth_format,color_final_layout,depth_final_layout);
|
||||||
|
|
||||||
List<VkSubpassDescription> subpass_desc_list;
|
List<VkSubpassDescription> subpass_desc_list;
|
||||||
|
|
||||||
@ -133,18 +153,18 @@ RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format
|
|||||||
subpass.inputAttachmentCount = 0;
|
subpass.inputAttachmentCount = 0;
|
||||||
subpass.pInputAttachments = nullptr;
|
subpass.pInputAttachments = nullptr;
|
||||||
subpass.colorAttachmentCount = 1;
|
subpass.colorAttachmentCount = 1;
|
||||||
subpass.pColorAttachments = &color_atta_ref;
|
subpass.pColorAttachments = ref_list.GetData();
|
||||||
subpass.pResolveAttachments = nullptr;
|
subpass.pResolveAttachments = nullptr;
|
||||||
subpass.pDepthStencilAttachment = &depth_atta_ref;
|
subpass.pDepthStencilAttachment = ref_list.GetData()+1;
|
||||||
subpass.preserveAttachmentCount = 0;
|
subpass.preserveAttachmentCount = 0;
|
||||||
subpass.pPreserveAttachments = nullptr;
|
subpass.pPreserveAttachments = nullptr;
|
||||||
|
|
||||||
subpass_desc_list.Add(subpass);
|
subpass_desc_list.Add(subpass);
|
||||||
|
|
||||||
List<VkFormat> color_format_list;
|
List<VkSubpassDependency> subpass_dependency_list;
|
||||||
|
|
||||||
color_format_list.Add(color_format);
|
CreateSubpassDependency(subpass_dependency_list,1);
|
||||||
|
|
||||||
return CreateRenderPass(subpass_desc_list,color_format_list,depth_format,color_final_layout,depth_final_layout);
|
return CreateRenderPass(desc_list,subpass_desc_list,subpass_dependency_list,color_format_list,depth_format,color_final_layout,depth_final_layout);
|
||||||
}
|
}
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
Loading…
x
Reference in New Issue
Block a user