From d897613c4d36441db23139812bc402295a1867f9 Mon Sep 17 00:00:00 2001 From: HuYingzhuo Date: Tue, 16 Apr 2019 14:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0GetStrideByFormat=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/CMakeLists.txt | 1 + example/Vulkan/RenderSurface.cpp | 2 +- example/Vulkan/VK.h | 2 +- example/Vulkan/VKFormat.cpp | 208 +++++++++++++++++++++++++++++++ 4 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 example/Vulkan/VKFormat.cpp diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index e9e5851f..8c269134 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -7,6 +7,7 @@ ENDIF() SET(VULKAN_TEST_SOURCE_FILES main.cpp ${RENDER_WINDOW_SOURCE} + VkFormat.cpp VKInstance.cpp VKPhysicalDevice.cpp VKCommandBuffer.cpp diff --git a/example/Vulkan/RenderSurface.cpp b/example/Vulkan/RenderSurface.cpp index b6c15d24..2c0f8298 100644 --- a/example/Vulkan/RenderSurface.cpp +++ b/example/Vulkan/RenderSurface.cpp @@ -57,7 +57,7 @@ VertexBuffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkFormat { VulkanBuffer vb; - const uint32_t stride=GetStrideForFormat(format); + const uint32_t stride=GetStrideByFormat(format); const VkDeviceSize size=stride*count; if(!CreateVulkanBuffer(vb,rsa,buf_usage,size,sharing_mode)) diff --git a/example/Vulkan/VK.h b/example/Vulkan/VK.h index 6db8151d..67391505 100644 --- a/example/Vulkan/VK.h +++ b/example/Vulkan/VK.h @@ -11,7 +11,7 @@ VK_NAMESPACE_BEGIN using CharPointerList=hgl::List; -uint32_t GetStrideForFormat(const VkFormat &); +uint32_t GetStrideByFormat(const VkFormat &); inline void debug_out(const hgl::List &layer_properties) { diff --git a/example/Vulkan/VKFormat.cpp b/example/Vulkan/VKFormat.cpp new file mode 100644 index 00000000..2803cd02 --- /dev/null +++ b/example/Vulkan/VKFormat.cpp @@ -0,0 +1,208 @@ +#include"VK.h" + +VK_NAMESPACE_BEGIN + +namespace +{ + struct StrideByFormat + { + VkFormat format; //格式,此值保留仅为参考 + uint32_t bytes; + }; + + constexpr StrideByFormat stride_list[]= + { + {VK_FORMAT_UNDEFINED, 0}, + + {VK_FORMAT_R4G4_UNORM_PACK8, 1}, + + {VK_FORMAT_R4G4B4A4_UNORM_PACK16, 2}, + {VK_FORMAT_B4G4R4A4_UNORM_PACK16, 2}, + {VK_FORMAT_R5G6B5_UNORM_PACK16, 2}, + {VK_FORMAT_B5G6R5_UNORM_PACK16, 2}, + {VK_FORMAT_R5G5B5A1_UNORM_PACK16, 2}, + {VK_FORMAT_B5G5R5A1_UNORM_PACK16, 2}, + {VK_FORMAT_A1R5G5B5_UNORM_PACK16, 2}, + + {VK_FORMAT_R8_UNORM, 1}, + {VK_FORMAT_R8_SNORM, 1}, + {VK_FORMAT_R8_USCALED, 1}, + {VK_FORMAT_R8_SSCALED, 1}, + {VK_FORMAT_R8_UINT, 1}, + {VK_FORMAT_R8_SINT, 1}, + {VK_FORMAT_R8_SRGB, 1}, + + {VK_FORMAT_R8G8_UNORM, 2}, + {VK_FORMAT_R8G8_SNORM, 2}, + {VK_FORMAT_R8G8_USCALED, 2}, + {VK_FORMAT_R8G8_SSCALED, 2}, + {VK_FORMAT_R8G8_UINT, 2}, + {VK_FORMAT_R8G8_SINT, 2}, + {VK_FORMAT_R8G8_SRGB, 2}, + + {VK_FORMAT_R8G8B8_UNORM, 3}, + {VK_FORMAT_R8G8B8_SNORM, 3}, + {VK_FORMAT_R8G8B8_USCALED, 3}, + {VK_FORMAT_R8G8B8_SSCALED, 3}, + {VK_FORMAT_R8G8B8_UINT, 3}, + {VK_FORMAT_R8G8B8_SINT, 3}, + {VK_FORMAT_R8G8B8_SRGB, 3}, + {VK_FORMAT_B8G8R8_UNORM, 3}, + {VK_FORMAT_B8G8R8_SNORM, 3}, + {VK_FORMAT_B8G8R8_USCALED, 3}, + {VK_FORMAT_B8G8R8_SSCALED, 3}, + {VK_FORMAT_B8G8R8_UINT, 3}, + {VK_FORMAT_B8G8R8_SINT, 3}, + {VK_FORMAT_B8G8R8_SRGB, 3}, + + {VK_FORMAT_R8G8B8A8_UNORM, 4}, + {VK_FORMAT_R8G8B8A8_SNORM, 4}, + {VK_FORMAT_R8G8B8A8_USCALED, 4}, + {VK_FORMAT_R8G8B8A8_SSCALED, 4}, + {VK_FORMAT_R8G8B8A8_UINT, 4}, + {VK_FORMAT_R8G8B8A8_SINT, 4}, + {VK_FORMAT_R8G8B8A8_SRGB, 4}, + {VK_FORMAT_B8G8R8A8_UNORM, 4}, + {VK_FORMAT_B8G8R8A8_SNORM, 4}, + {VK_FORMAT_B8G8R8A8_USCALED, 4}, + {VK_FORMAT_B8G8R8A8_SSCALED, 4}, + {VK_FORMAT_B8G8R8A8_UINT, 4}, + {VK_FORMAT_B8G8R8A8_SINT, 4}, + {VK_FORMAT_B8G8R8A8_SRGB, 4}, + {VK_FORMAT_A8B8G8R8_UNORM_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_SNORM_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_USCALED_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_SSCALED_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_UINT_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_SINT_PACK32, 4}, + {VK_FORMAT_A8B8G8R8_SRGB_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_UNORM_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_SNORM_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_USCALED_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_SSCALED_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_UINT_PACK32, 4}, + {VK_FORMAT_A2R10G10B10_SINT_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_UNORM_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_SNORM_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_USCALED_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_SSCALED_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_UINT_PACK32, 4}, + {VK_FORMAT_A2B10G10R10_SINT_PACK32, 4}, + + {VK_FORMAT_R16_UNORM, 2}, + {VK_FORMAT_R16_SNORM, 2}, + {VK_FORMAT_R16_USCALED, 2}, + {VK_FORMAT_R16_SSCALED, 2}, + {VK_FORMAT_R16_UINT, 2}, + {VK_FORMAT_R16_SINT, 2}, + {VK_FORMAT_R16_SFLOAT, 2}, + + {VK_FORMAT_R16G16_UNORM, 4}, + {VK_FORMAT_R16G16_SNORM, 4}, + {VK_FORMAT_R16G16_USCALED, 4}, + {VK_FORMAT_R16G16_SSCALED, 4}, + {VK_FORMAT_R16G16_UINT, 4}, + {VK_FORMAT_R16G16_SINT, 4}, + {VK_FORMAT_R16G16_SFLOAT, 4}, + + {VK_FORMAT_R16G16B16_UNORM, 6}, + {VK_FORMAT_R16G16B16_SNORM, 6}, + {VK_FORMAT_R16G16B16_USCALED, 6}, + {VK_FORMAT_R16G16B16_SSCALED, 6}, + {VK_FORMAT_R16G16B16_UINT, 6}, + {VK_FORMAT_R16G16B16_SINT, 6}, + {VK_FORMAT_R16G16B16_SFLOAT, 6}, + + {VK_FORMAT_R16G16B16A16_UNORM, 8}, + {VK_FORMAT_R16G16B16A16_SNORM, 8}, + {VK_FORMAT_R16G16B16A16_USCALED, 8}, + {VK_FORMAT_R16G16B16A16_SSCALED, 8}, + {VK_FORMAT_R16G16B16A16_UINT, 8}, + {VK_FORMAT_R16G16B16A16_SINT, 8}, + {VK_FORMAT_R16G16B16A16_SFLOAT, 8}, + + {VK_FORMAT_R32_UINT, 4}, + {VK_FORMAT_R32_SINT, 4}, + {VK_FORMAT_R32_SFLOAT, 4}, + + {VK_FORMAT_R32G32_UINT, 8}, + {VK_FORMAT_R32G32_SINT, 8}, + {VK_FORMAT_R32G32_SFLOAT, 8}, + + {VK_FORMAT_R32G32B32_UINT, 12}, + {VK_FORMAT_R32G32B32_SINT, 12}, + {VK_FORMAT_R32G32B32_SFLOAT, 12}, + + {VK_FORMAT_R32G32B32A32_UINT, 16}, + {VK_FORMAT_R32G32B32A32_SINT, 16}, + {VK_FORMAT_R32G32B32A32_SFLOAT, 16}, + + {VK_FORMAT_R64_UINT, 8}, + {VK_FORMAT_R64_SINT, 8}, + {VK_FORMAT_R64_SFLOAT, 8}, + + {VK_FORMAT_R64G64_UINT, 16}, + {VK_FORMAT_R64G64_SINT, 16}, + {VK_FORMAT_R64G64_SFLOAT, 16}, + + {VK_FORMAT_R64G64B64_UINT, 24}, + {VK_FORMAT_R64G64B64_SINT, 24}, + {VK_FORMAT_R64G64B64_SFLOAT, 24}, + + {VK_FORMAT_R64G64B64A64_UINT, 32}, + {VK_FORMAT_R64G64B64A64_SINT, 32}, + {VK_FORMAT_R64G64B64A64_SFLOAT, 32}, + + {VK_FORMAT_B10G11R11_UFLOAT_PACK32, 4}, + {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, 4}, + + {VK_FORMAT_D16_UNORM, 2}, + {VK_FORMAT_X8_D24_UNORM_PACK32, 4}, + {VK_FORMAT_D32_SFLOAT, 4}, + {VK_FORMAT_S8_UINT, 1}, + {VK_FORMAT_D16_UNORM_S8_UINT, 3}, + {VK_FORMAT_D24_UNORM_S8_UINT, 4}, + {VK_FORMAT_D32_SFLOAT_S8_UINT, 5} + }; + + constexpr uint32_t STRIDE_FORMAT_COUNT=sizeof(stride_list)/sizeof(StrideByFormat); +}//namespace + +uint32_t GetStrideByFormat(const VkFormat &format) +{ + if(format<=VK_FORMAT_UNDEFINED||format>=STRIDE_FORMAT_COUNT)return(0); + + return stride_list[format].bytes; + + //if(format<=VK_FORMAT_UNDEFINED + // ||format>=VK_FORMAT_BC1_RGB_UNORM_BLOCK)return 0; + + //if(format==VK_FORMAT_R4G4_UNORM_PACK8)return 1; + //if(format<=VK_FORMAT_A1R5G5B5_UNORM_PACK16)return 2; + //if(format<=VK_FORMAT_R8_SRGB)return 1; + //if(format<=VK_FORMAT_R8G8_SRGB)return 2; + //if(format<=VK_FORMAT_B8G8R8_SRGB)return 3; + //if(format<=VK_FORMAT_A2B10G10R10_SINT_PACK32)return 4; + //if(format<=VK_FORMAT_R16_SFLOAT)return 2; + //if(format<=VK_FORMAT_R16G16_SFLOAT)return 4; + //if(format<=VK_FORMAT_R16G16B16_SFLOAT)return 6; + //if(format<=VK_FORMAT_R16G16B16A16_SFLOAT)return 8; + //if(format<=VK_FORMAT_R32_SFLOAT)return 4; + //if(format<=VK_FORMAT_R32G32_SFLOAT)return 8; + //if(format<=VK_FORMAT_R32G32B32_SFLOAT)return 12; + //if(format<=VK_FORMAT_R32G32B32A32_SFLOAT)return 16; + //if(format<=VK_FORMAT_R64_SFLOAT)return 8; + //if(format<=VK_FORMAT_R64G64_SFLOAT)return 16; + //if(format<=VK_FORMAT_R64G64B64_SFLOAT)return 24; + //if(format<=VK_FORMAT_R64G64B64A64_SFLOAT)return 32; + //if(format<=VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)return 4; + //if(format==VK_FORMAT_D16_UNORM)return 2; + //if(format<=VK_FORMAT_D32_SFLOAT)return 4; + //if(format==VK_FORMAT_S8_UINT)return 1; + //if(format==VK_FORMAT_D16_UNORM_S8_UINT)return 3; + //if(format==VK_FORMAT_D24_UNORM_S8_UINT)return 4; + //if(format==VK_FORMAT_D32_SFLOAT_S8_UINT)return 5; + + //return(0); +} +VK_NAMESPACE_END