From 963526ac28e503a9b114365bb3266e70c318378d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 15 Jan 2021 21:20:33 +0100 Subject: [PATCH] Vk: expose image aspects enum. Yes, I had to make the enum mapping table in the previous commit because I didn't remember anymore if I exposed this already or not. The API surface is *huge*. --- doc/vulkan-mapping.dox | 2 +- src/Magnum/Vk/Image.h | 27 +++++++++++++++++++++++++++ src/Magnum/Vk/ImageView.cpp | 12 ++++++------ src/Magnum/Vk/ImageViewCreateInfo.h | 8 +++----- src/Magnum/Vk/Vk.h | 2 ++ 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/doc/vulkan-mapping.dox b/doc/vulkan-mapping.dox index ac82f606f..2b7501770 100644 --- a/doc/vulkan-mapping.dox +++ b/doc/vulkan-mapping.dox @@ -861,7 +861,7 @@ Vulkan enum | Matching API Vulkan enum | Matching API --------------------------------------- | ------------ -@type_vk{ImageAspectFlagBits}, \n @type_vk{ImageAspectFlags} | | +@type_vk{ImageAspectFlagBits}, \n @type_vk{ImageAspectFlags} | @ref ImageAspect, \n @ref ImageAspects @type_vk{ImageCreateFlagBits}, \n @type_vk{ImageCreateFlags} | @ref ImageCreateInfo::Flag, \n @ref ImageCreateInfo::Flags @type_vk{ImageLayout} | @ref ImageLayout @type_vk{ImageTiling} | | diff --git a/src/Magnum/Vk/Image.h b/src/Magnum/Vk/Image.h index 7e8d01502..84945e9af 100644 --- a/src/Magnum/Vk/Image.h +++ b/src/Magnum/Vk/Image.h @@ -148,6 +148,33 @@ enum class ImageLayout: Int { @vk_extension{KHR,separate_depth_stencil_layouts} (1.2) */ }; +/** +@brief Image aspect +@m_since_latest + +Wraps @type_vk_keyword{ImageAspectFlagBits}. +@see @ref ImageAspects, @ref ImageViewCreateInfo::ImageViewCreateInfo() +@m_enum_values_as_keywords +*/ +enum class ImageAspect: UnsignedInt { + Color = VK_IMAGE_ASPECT_COLOR_BIT, /**< Color */ + Depth = VK_IMAGE_ASPECT_DEPTH_BIT, /**< Depth */ + Stencil = VK_IMAGE_ASPECT_STENCIL_BIT /**< Stencil */ + + /** @todo metadata (sparse?), YCbCr properties */ +}; + +/** +@brief Image aspects +@m_since_latest + +Type-safe wrapper for @type_vk_keyword{ImageAspectFlags}. +@see @ref ImageViewCreateInfo::ImageViewCreateInfo() +*/ +typedef Containers::EnumSet ImageAspects; + +CORRADE_ENUMSET_OPERATORS(ImageAspects) + /** @brief Image @m_since_latest diff --git a/src/Magnum/Vk/ImageView.cpp b/src/Magnum/Vk/ImageView.cpp index e4a4a4d43..9618ea9c6 100644 --- a/src/Magnum/Vk/ImageView.cpp +++ b/src/Magnum/Vk/ImageView.cpp @@ -37,21 +37,21 @@ namespace { /* Vulkan, it would kill you if 0 was a valid default, right?! ffs */ /** @todo this might be useful elsewhere as well */ -VkImageAspectFlags aspectFor(const PixelFormat format) { +ImageAspects aspectFor(const PixelFormat format) { if(format == PixelFormat::Depth16UnormStencil8UI || format == PixelFormat::Depth24UnormStencil8UI || format == PixelFormat::Depth32FStencil8UI) - return VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT; + return ImageAspect::Depth|ImageAspect::Stencil; if(format == PixelFormat::Depth16Unorm || format == PixelFormat::Depth24Unorm || format == PixelFormat::Depth32F) - return VK_IMAGE_ASPECT_DEPTH_BIT; + return ImageAspect::Depth; if(format == PixelFormat::Stencil8UI) - return VK_IMAGE_ASPECT_STENCIL_BIT; + return ImageAspect::Stencil; /** @todo planar formats */ - return VK_IMAGE_ASPECT_COLOR_BIT; + return ImageAspect::Color; } } @@ -62,7 +62,7 @@ ImageViewCreateInfo::ImageViewCreateInfo(const VkImageViewType type, const VkIma _info.image = image; _info.viewType = type; _info.format = VkFormat(format); - _info.subresourceRange.aspectMask = aspectFor(format); + _info.subresourceRange.aspectMask = VkImageAspectFlags(aspectFor(format)); _info.subresourceRange.baseMipLevel = levelOffset; _info.subresourceRange.levelCount = levelCount; _info.subresourceRange.baseArrayLayer = layerOffset; diff --git a/src/Magnum/Vk/ImageViewCreateInfo.h b/src/Magnum/Vk/ImageViewCreateInfo.h index b23d9c615..3cde5a186 100644 --- a/src/Magnum/Vk/ImageViewCreateInfo.h +++ b/src/Magnum/Vk/ImageViewCreateInfo.h @@ -90,11 +90,9 @@ class MAGNUM_VK_EXPORT ImageViewCreateInfo { * - `image` * - `viewType` to @p type * - `format` - * - `subresourceRange.aspectMask` to - * @val_vk{IMAGE_ASPECT_DEPTH_BIT,ImageAspectFlagBits} / - * @val_vk{IMAGE_ASPECT_STENCIL_BIT,ImageAspectFlagBits} if - * @p format is depth / stencil or both and - * @val_vk{IMAGE_ASPECT_COLOR_BIT,ImageAspectFlagBits} otherwise + * - `subresourceRange.aspectMask` to @ref ImageAspect::Depth / + * @ref ImageAspect::Stencil if @p format is depth / stencil or + * both and @ref ImageAspect::Color otherwise * - `subresourceRange.levelOffset` to @p levelOffset * - `subresourceRange.levelCount` to @p levelCount * - `subresourceRange.baseArrayLayer` to @p layerOffset diff --git a/src/Magnum/Vk/Vk.h b/src/Magnum/Vk/Vk.h index ebe4900c1..226c3a362 100644 --- a/src/Magnum/Vk/Vk.h +++ b/src/Magnum/Vk/Vk.h @@ -61,6 +61,8 @@ class FramebufferCreateInfo; enum class HandleFlag: UnsignedByte; typedef Containers::EnumSet HandleFlags; class Image; +enum class ImageAspect: UnsignedInt; +typedef Containers::EnumSet ImageAspects; enum class ImageLayout: Int; class ImageCreateInfo; /* Not forward-declaring ImageCreateInfo1D etc right now, I see no need */