新的 CreateColorAttachment/CreateDepthAttachment
This commit is contained in:
parent
395102da6f
commit
65805cd6cc
@ -175,8 +175,8 @@ public: //Command Buffer 相关
|
|||||||
const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
const VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||||
const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
// 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);
|
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);
|
||||||
// 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);
|
bool CreateDepthAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const VkFormat &depth_format,const VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||||
|
|
||||||
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
RenderPass * CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
const List<VkSubpassDescription> &subpass,
|
const List<VkSubpassDescription> &subpass,
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include<hgl/graph/vulkan/VK.h>
|
#include<hgl/graph/vulkan/VK.h>
|
||||||
#include<hgl/type/BaseString.h>
|
#include<hgl/type/BaseString.h>
|
||||||
|
#include<hgl/type/Set.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
class PhysicalDevice
|
class PhysicalDevice
|
||||||
@ -15,6 +16,15 @@ class PhysicalDevice
|
|||||||
List<VkLayerProperties> layer_properties;
|
List<VkLayerProperties> layer_properties;
|
||||||
List<VkExtensionProperties> extension_properties;
|
List<VkExtensionProperties> extension_properties;
|
||||||
|
|
||||||
|
Set<VkFormat> optimal_color_format;
|
||||||
|
Set<VkFormat> optimal_depth_format;
|
||||||
|
Set<VkFormat> linear_color_format;
|
||||||
|
Set<VkFormat> linear_depth_format;
|
||||||
|
Set<VkFormat> buffer_color_format;
|
||||||
|
Set<VkFormat> buffer_depth_format;
|
||||||
|
|
||||||
|
void InitFormatSupport();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
PhysicalDevice(VkInstance,VkPhysicalDevice);
|
PhysicalDevice(VkInstance,VkPhysicalDevice);
|
||||||
@ -71,9 +81,14 @@ public:
|
|||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsOptimalColorFormat(const VkFormat format)const{return optimal_color_format.IsMember(format);}
|
||||||
|
bool IsOptimalDepthFormat(const VkFormat format)const{return optimal_depth_format.IsMember(format);}
|
||||||
|
bool IsLinearColorFormat(const VkFormat format)const{return linear_color_format.IsMember(format);}
|
||||||
|
bool IsLinearDepthFormat(const VkFormat format)const{return linear_depth_format.IsMember(format);}
|
||||||
|
bool IsBufferColorFormat(const VkFormat format)const{return buffer_color_format.IsMember(format);}
|
||||||
|
bool IsBufferDepthFormat(const VkFormat format)const{return buffer_depth_format.IsMember(format);}
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
bool CheckDepthFormat(const VkFormat)const;
|
|
||||||
};//class PhysicalDevice
|
};//class PhysicalDevice
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
@ -64,9 +64,6 @@ void Device::CreateSubpassDependency(List<VkSubpassDependency> &subpass_dependen
|
|||||||
|
|
||||||
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)
|
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();
|
uint atta_count=color_format.GetCount();
|
||||||
|
|
||||||
desc_list.SetCount(atta_count+1);
|
desc_list.SetCount(atta_count+1);
|
||||||
@ -106,6 +103,74 @@ bool Device::CreateAttachment(List<VkAttachmentReference> &ref_list,List<VkAttac
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Device::CreateColorAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const List<VkFormat> &color_format,const VkImageLayout color_final_layout)
|
||||||
|
{
|
||||||
|
const VkFormat *cf=color_format.GetData();
|
||||||
|
|
||||||
|
for(uint i=0;i<color_format.GetCount();i++)
|
||||||
|
{
|
||||||
|
if(!attr->physical_device->IsOptimalColorFormat(*cf))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
++cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref_list.SetCount(color_format.GetCount());
|
||||||
|
VkAttachmentReference *ref=ref_list.GetData();
|
||||||
|
|
||||||
|
desc_list.SetCount(color_format.GetCount());
|
||||||
|
VkAttachmentDescription *desc=desc_list.GetData();
|
||||||
|
|
||||||
|
for(uint i=0;i<color_format.GetCount();i++)
|
||||||
|
{
|
||||||
|
desc->flags = 0;
|
||||||
|
desc->samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
desc->loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; //LOAD_OP_CLEAR代表LOAD时清空内容
|
||||||
|
desc->storeOp = VK_ATTACHMENT_STORE_OP_STORE; //STORE_OP_STROE代表SOTRE时储存内容
|
||||||
|
desc->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; //DONT CARE表示不在意
|
||||||
|
desc->stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
desc->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //代表不关心初始布局
|
||||||
|
desc->finalLayout = color_final_layout;
|
||||||
|
++desc;
|
||||||
|
|
||||||
|
ref->attachment = i;
|
||||||
|
ref->layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
++ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Device::CreateDepthAttachment( List<VkAttachmentReference> &ref_list,List<VkAttachmentDescription> &desc_list,const VkFormat &depth_format,const VkImageLayout depth_final_layout)
|
||||||
|
{
|
||||||
|
if(!attr->physical_device->IsOptimalDepthFormat(depth_format))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
{
|
||||||
|
ref_list.SetCount(1);
|
||||||
|
VkAttachmentReference *ref=ref_list.GetData();
|
||||||
|
|
||||||
|
ref->attachment=0;
|
||||||
|
ref->layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
desc_list.SetCount(1);
|
||||||
|
VkAttachmentDescription *desc=desc_list.GetData();
|
||||||
|
|
||||||
|
desc->flags = 0;
|
||||||
|
desc->samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
desc->loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; //LOAD_OP_CLEAR代表LOAD时清空内容
|
||||||
|
desc->storeOp = VK_ATTACHMENT_STORE_OP_STORE; //STORE_OP_STROE代表SOTRE时储存内容
|
||||||
|
desc->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; //DONT CARE表示不在意
|
||||||
|
desc->stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
desc->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //代表不关心初始布局
|
||||||
|
desc->finalLayout = depth_final_layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &desc_list,
|
||||||
const List<VkSubpassDescription> &subpass,
|
const List<VkSubpassDescription> &subpass,
|
||||||
const List<VkSubpassDependency> &dependency,
|
const List<VkSubpassDependency> &dependency,
|
||||||
@ -114,6 +179,20 @@ RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &des
|
|||||||
const VkImageLayout color_final_layout,
|
const VkImageLayout color_final_layout,
|
||||||
const VkImageLayout depth_final_layout)
|
const VkImageLayout depth_final_layout)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
const VkFormat *cf=color_format.GetData();
|
||||||
|
|
||||||
|
for(uint i=0;i<color_format.GetCount();i++)
|
||||||
|
{
|
||||||
|
if(!attr->physical_device->IsOptimalColorFormat(*cf))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
++cf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!attr->physical_device->IsOptimalDepthFormat(depth_format))
|
||||||
|
return(false);
|
||||||
|
|
||||||
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;
|
||||||
@ -135,6 +214,12 @@ RenderPass *Device::CreateRenderPass( const List<VkAttachmentDescription> &des
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
if(!attr->physical_device->IsOptimalColorFormat(color_format))
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
if(!attr->physical_device->IsOptimalDepthFormat(depth_format))
|
||||||
|
return(false);
|
||||||
|
|
||||||
List<VkAttachmentReference> ref_list;
|
List<VkAttachmentReference> ref_list;
|
||||||
List<VkAttachmentDescription> desc_list;
|
List<VkAttachmentDescription> desc_list;
|
||||||
|
|
||||||
|
@ -56,6 +56,8 @@ PhysicalDevice::PhysicalDevice(VkInstance inst,VkPhysicalDevice pd)
|
|||||||
|
|
||||||
hgl_zero(driver_properties);
|
hgl_zero(driver_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InitFormatSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t PhysicalDevice::GetExtensionSpecVersion(const UTF8String &name)const
|
const uint32_t PhysicalDevice::GetExtensionSpecVersion(const UTF8String &name)const
|
||||||
@ -91,6 +93,27 @@ const bool PhysicalDevice::CheckMemoryType(uint32_t typeBits,VkMemoryPropertyFla
|
|||||||
// No memory types matched, return failure
|
// No memory types matched, return failure
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicalDevice::InitFormatSupport()
|
||||||
|
{
|
||||||
|
VkFormatProperties formatProps;
|
||||||
|
|
||||||
|
for(uint32 i=VK_FORMAT_BEGIN_RANGE;i<=VK_FORMAT_END_RANGE;i++)
|
||||||
|
{
|
||||||
|
hgl_zero(formatProps);
|
||||||
|
|
||||||
|
vkGetPhysicalDeviceFormatProperties(physical_device,(VkFormat)i,&formatProps);
|
||||||
|
|
||||||
|
if(formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT )optimal_color_format.Add((VkFormat)i);
|
||||||
|
if(formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT )linear_color_format.Add((VkFormat)i);
|
||||||
|
if(formatProps.bufferFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT )buffer_color_format.Add((VkFormat)i);
|
||||||
|
|
||||||
|
if(formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)optimal_depth_format.Add((VkFormat)i);
|
||||||
|
if(formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)linear_depth_format.Add((VkFormat)i);
|
||||||
|
if(formatProps.bufferFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)buffer_depth_format.Add((VkFormat)i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VkFormat PhysicalDevice::GetDepthFormat(bool lower_to_high)const
|
VkFormat PhysicalDevice::GetDepthFormat(bool lower_to_high)const
|
||||||
{
|
{
|
||||||
constexpr VkFormat depthFormats[] =
|
constexpr VkFormat depthFormats[] =
|
||||||
@ -105,11 +128,7 @@ VkFormat PhysicalDevice::GetDepthFormat(bool lower_to_high)const
|
|||||||
|
|
||||||
for (auto& format : depthFormats)
|
for (auto& format : depthFormats)
|
||||||
{
|
{
|
||||||
VkFormatProperties formatProps;
|
if(IsOptimalDepthFormat(format))
|
||||||
|
|
||||||
vkGetPhysicalDeviceFormatProperties(physical_device, format, &formatProps);
|
|
||||||
|
|
||||||
if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
|
|
||||||
{
|
{
|
||||||
if(lower_to_high)
|
if(lower_to_high)
|
||||||
return format;
|
return format;
|
||||||
@ -134,11 +153,7 @@ VkFormat PhysicalDevice::GetDepthStencilFormat(bool lower_to_high)const
|
|||||||
|
|
||||||
for (auto& format : depthStencilFormats)
|
for (auto& format : depthStencilFormats)
|
||||||
{
|
{
|
||||||
VkFormatProperties formatProps;
|
if(IsOptimalDepthFormat(format))
|
||||||
|
|
||||||
vkGetPhysicalDeviceFormatProperties(physical_device, format, &formatProps);
|
|
||||||
|
|
||||||
if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
|
|
||||||
{
|
{
|
||||||
if(lower_to_high)
|
if(lower_to_high)
|
||||||
return format;
|
return format;
|
||||||
@ -149,31 +164,4 @@ VkFormat PhysicalDevice::GetDepthStencilFormat(bool lower_to_high)const
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PhysicalDevice::CheckDepthFormat(const VkFormat)const
|
|
||||||
{
|
|
||||||
constexpr VkFormat depthFormats[] =
|
|
||||||
{
|
|
||||||
VK_FORMAT_D16_UNORM,
|
|
||||||
VK_FORMAT_X8_D24_UNORM_PACK32,
|
|
||||||
VK_FORMAT_D32_SFLOAT,
|
|
||||||
VK_FORMAT_D16_UNORM_S8_UINT,
|
|
||||||
VK_FORMAT_D24_UNORM_S8_UINT,
|
|
||||||
VK_FORMAT_D32_SFLOAT_S8_UINT,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkFormat result=VK_FORMAT_UNDEFINED;
|
|
||||||
|
|
||||||
for (auto& format : depthFormats)
|
|
||||||
{
|
|
||||||
VkFormatProperties formatProps;
|
|
||||||
|
|
||||||
vkGetPhysicalDeviceFormatProperties(physical_device, format, &formatProps);
|
|
||||||
|
|
||||||
if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
|
|
||||||
return(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
Loading…
x
Reference in New Issue
Block a user