From 9b961ffe089e4ca6cf859ea8e60eb303c2a6dcc1 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 2 Jul 2019 21:52:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=A2=9C=E8=89=B2=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=B1=9E=E6=80=A7=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/graph/vulkan/VKPhysicalDevice.h | 23 +++++++++---------- .../Vulkan/VKDeviceRenderPass.cpp | 12 +++++----- src/RenderDevice/Vulkan/VKPhysicalDevice.cpp | 20 +++++----------- 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/inc/hgl/graph/vulkan/VKPhysicalDevice.h b/inc/hgl/graph/vulkan/VKPhysicalDevice.h index f139c439..a3f5af3e 100644 --- a/inc/hgl/graph/vulkan/VKPhysicalDevice.h +++ b/inc/hgl/graph/vulkan/VKPhysicalDevice.h @@ -16,12 +16,7 @@ class PhysicalDevice List layer_properties; List extension_properties; - Set optimal_color_format; - Set optimal_depth_format; - Set linear_color_format; - Set linear_depth_format; - Set buffer_color_format; - Set buffer_depth_format; + VkFormatProperties format_properties[VK_FORMAT_RANGE_SIZE]; void InitFormatSupport(); @@ -80,13 +75,17 @@ public: return fp; } + + bool IsOptimalTilingFeatures(const VkFormat format,const VkFormatFeatureFlags flag)const + { + if(formatVK_FORMAT_END_RANGE) + return(false); + + return(format_properties[format].optimalTilingFeatures&flag); + } - 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);} + bool IsColorAttachmentOptimal(const VkFormat format)const{return IsOptimalTilingFeatures(format,VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);} + bool IsDepthAttachmentOptimal(const VkFormat format)const{return IsOptimalTilingFeatures(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 2a66b78b..aad795a6 100644 --- a/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceRenderPass.cpp @@ -109,7 +109,7 @@ bool Device::CreateColorAttachment( List &ref_list,Listphysical_device->IsOptimalColorFormat(*cf)) + if(!attr->physical_device->IsColorAttachmentOptimal(*cf)) return(false); ++cf; @@ -143,7 +143,7 @@ bool Device::CreateColorAttachment( List &ref_list,List &ref_list,List &desc_list,const VkFormat &depth_format,const VkImageLayout depth_final_layout) { - if(!attr->physical_device->IsOptimalDepthFormat(depth_format)) + if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format)) return(false); { @@ -184,14 +184,14 @@ RenderPass *Device::CreateRenderPass( const List &des for(uint i=0;iphysical_device->IsOptimalColorFormat(*cf)) + if(!attr->physical_device->IsColorAttachmentOptimal(*cf)) return(false); ++cf; } } - if(!attr->physical_device->IsOptimalDepthFormat(depth_format)) + if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format)) return(false); VkRenderPassCreateInfo rp_info; @@ -214,10 +214,10 @@ RenderPass *Device::CreateRenderPass( const List &des RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout) { - if(!attr->physical_device->IsOptimalColorFormat(color_format)) + if(!attr->physical_device->IsColorAttachmentOptimal(color_format)) return(false); - if(!attr->physical_device->IsOptimalDepthFormat(depth_format)) + if(!attr->physical_device->IsDepthAttachmentOptimal(depth_format)) return(false); List ref_list; diff --git a/src/RenderDevice/Vulkan/VKPhysicalDevice.cpp b/src/RenderDevice/Vulkan/VKPhysicalDevice.cpp index 0204c4e1..b423e3ec 100644 --- a/src/RenderDevice/Vulkan/VKPhysicalDevice.cpp +++ b/src/RenderDevice/Vulkan/VKPhysicalDevice.cpp @@ -96,21 +96,13 @@ const bool PhysicalDevice::CheckMemoryType(uint32_t typeBits,VkMemoryPropertyFla void PhysicalDevice::InitFormatSupport() { - VkFormatProperties formatProps; + VkFormatProperties *fp=format_properties; 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); + vkGetPhysicalDeviceFormatProperties(physical_device,(VkFormat)i,fp); + + ++fp; } } @@ -128,7 +120,7 @@ VkFormat PhysicalDevice::GetDepthFormat(bool lower_to_high)const for (auto& format : depthFormats) { - if(IsOptimalDepthFormat(format)) + if(IsDepthAttachmentOptimal(format)) { if(lower_to_high) return format; @@ -153,7 +145,7 @@ VkFormat PhysicalDevice::GetDepthStencilFormat(bool lower_to_high)const for (auto& format : depthStencilFormats) { - if(IsOptimalDepthFormat(format)) + if(IsDepthAttachmentOptimal(format)) { if(lower_to_high) return format;