From 8e5554bc541e9bee0b05720aeed7f6223ef673a1 Mon Sep 17 00:00:00 2001 From: jnyfah Date: Thu, 29 Aug 2024 12:54:23 +0100 Subject: [PATCH 1/5] Image2DBufferSpecification --- .../include/ZEngine/Hardwares/VulkanDevice.h | 8 +++++++- .../ZEngine/Rendering/Buffers/Image2DBuffer.h | 10 ++-------- .../Specifications/FormatSpecification.h | 7 +++++++ .../Specifications/TextureSpecification.h | 15 ++++++++++++++- ZEngine/src/Image2DBuffer.cpp | 18 ++++++------------ ZEngine/src/Swapchain.cpp | 2 +- ZEngine/src/Texture2D.cpp | 5 +++-- ZEngine/src/VulkanDevice.cpp | 9 ++++----- 8 files changed, 44 insertions(+), 30 deletions(-) diff --git a/ZEngine/include/ZEngine/Hardwares/VulkanDevice.h b/ZEngine/include/ZEngine/Hardwares/VulkanDevice.h index c412829f..04ac1236 100644 --- a/ZEngine/include/ZEngine/Hardwares/VulkanDevice.h +++ b/ZEngine/include/ZEngine/Hardwares/VulkanDevice.h @@ -133,6 +133,7 @@ namespace ZEngine::Hardwares uint32_t width, uint32_t height, VkImageType image_type, + VkImageViewType image_view_type, VkFormat image_format, VkImageTiling image_tiling, VkImageLayout image_initial_layout, @@ -147,7 +148,12 @@ namespace ZEngine::Hardwares static VkSampler CreateImageSampler(); static VkFormat FindSupportedFormat(const std::vector& format_collection, VkImageTiling image_tiling, VkFormatFeatureFlags feature_flags); static VkFormat FindDepthFormat(); - static VkImageView CreateImageView(VkImage image, VkFormat image_format, VkImageAspectFlagBits image_aspect_flag, uint32_t layer_count = 1U); + static VkImageView CreateImageView( + VkImage image, + VkFormat image_format, + VkImageViewType image_view_type, + VkImageAspectFlagBits image_aspect_flag, + uint32_t layer_count = 1U); static VkFramebuffer CreateFramebuffer( const std::vector& attachments, const VkRenderPass& render_pass, diff --git a/ZEngine/include/ZEngine/Rendering/Buffers/Image2DBuffer.h b/ZEngine/include/ZEngine/Rendering/Buffers/Image2DBuffer.h index 2b5c693f..33bd43fc 100644 --- a/ZEngine/include/ZEngine/Rendering/Buffers/Image2DBuffer.h +++ b/ZEngine/include/ZEngine/Rendering/Buffers/Image2DBuffer.h @@ -1,20 +1,14 @@ #pragma once #include #include +#include namespace ZEngine::Rendering::Buffers { struct Image2DBuffer : public Helpers::RefCounted { Image2DBuffer() = default; - Image2DBuffer( - uint32_t width, - uint32_t height, - VkFormat format, - VkImageUsageFlags usage_flag_bit, - VkImageAspectFlagBits image_aspect_flag_bit, - uint32_t layer_count = 1U, - VkImageCreateFlags image_create_flag_bit = 0); + Image2DBuffer(const Specifications::Image2DBufferSpecification& spec); ~Image2DBuffer(); Hardwares::BufferImage& GetBuffer(); diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h index 4cf26666..c3777031 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h @@ -112,4 +112,11 @@ namespace ZEngine::Rendering::Specifications COMPUTE }; + enum class ImageType : uint32_t + { + Flat2D, + Cubemap, + }; + + static VkImageViewType ImageViewTypeMap[] = {VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_VIEW_TYPE_CUBE}; } // namespace ZEngine::Rendering::Specifications diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h index da1f566c..8197c778 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h @@ -19,4 +19,17 @@ namespace ZEngine::Rendering::Specifications LoadOperation LoadOp = LoadOperation::CLEAR; const void* Data = nullptr; }; -} \ No newline at end of file + + struct Image2DBufferSpecification + { + uint32_t width; + uint32_t height; + ImageType image_view_type; + VkFormat image_format; + VkImageUsageFlags image_usage; + VkImageAspectFlagBits image_aspect_flag; + uint32_t layer_count = 1U; + VkImageCreateFlags image_create_flag_bit = 0; + }; + +} // namespace ZEngine::Rendering::Specifications \ No newline at end of file diff --git a/ZEngine/src/Image2DBuffer.cpp b/ZEngine/src/Image2DBuffer.cpp index 498baf12..90295fb4 100644 --- a/ZEngine/src/Image2DBuffer.cpp +++ b/ZEngine/src/Image2DBuffer.cpp @@ -3,15 +3,8 @@ namespace ZEngine::Rendering::Buffers { - Image2DBuffer::Image2DBuffer( - uint32_t width, - uint32_t height, - VkFormat format, - VkImageUsageFlags usage_flag_bit, - VkImageAspectFlagBits image_aspect_flag_bit, - uint32_t layer_count, - VkImageCreateFlags image_create_flag_bit) - : m_width(width), m_height(height) + Image2DBuffer::Image2DBuffer(const Specifications::Image2DBufferSpecification& spec) + : m_width(spec.width), m_height(spec.height) { ZENGINE_VALIDATE_ASSERT(m_width > 0, "Image width must be greater then zero") ZENGINE_VALIDATE_ASSERT(m_height > 0, "Image height must be greater then zero") @@ -20,14 +13,15 @@ namespace ZEngine::Rendering::Buffers m_width, m_height, VK_IMAGE_TYPE_2D, - format, + Specifications::ImageViewTypeMap[VALUE_FROM_SPEC_MAP(spec.image_view_type)], + spec.image_format, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_LAYOUT_UNDEFINED, - usage_flag_bit, + spec.image_usage, VK_SHARING_MODE_EXCLUSIVE, VK_SAMPLE_COUNT_1_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - image_aspect_flag_bit, layer_count, image_create_flag_bit); + spec.image_aspect_flag, spec.layer_count, spec.image_create_flag_bit); } Image2DBuffer::~Image2DBuffer() diff --git a/ZEngine/src/Swapchain.cpp b/ZEngine/src/Swapchain.cpp index 1f81abc5..6e9f74e3 100644 --- a/ZEngine/src/Swapchain.cpp +++ b/ZEngine/src/Swapchain.cpp @@ -275,7 +275,7 @@ namespace ZEngine::Rendering for (size_t i = 0; i < m_image_view_collection.size(); ++i) { - m_image_view_collection[i] = Hardwares::VulkanDevice::CreateImageView(m_image_collection[i], m_surface_format.format, VK_IMAGE_ASPECT_COLOR_BIT); + m_image_view_collection[i] = Hardwares::VulkanDevice::CreateImageView(m_image_collection[i], m_surface_format.format, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_ASPECT_COLOR_BIT); } /*Swapchain framebuffer*/ diff --git a/ZEngine/src/Texture2D.cpp b/ZEngine/src/Texture2D.cpp index 04c7948b..8ddd3087 100644 --- a/ZEngine/src/Texture2D.cpp +++ b/ZEngine/src/Texture2D.cpp @@ -183,14 +183,15 @@ namespace ZEngine::Rendering::Textures VkFormat image_format = (spec.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? Hardwares::VulkanDevice::FindDepthFormat() : Specifications::ImageFormatMap[static_cast(spec.Format)]; - texture->m_image_2d_buffer = CreateRef( + texture->m_image_2d_buffer = CreateRef(Specifications::Image2DBufferSpecification( texture->m_width, texture->m_height, + spec.IsCubemap ? Specifications::ImageType::Cubemap : Specifications::ImageType::Flat2D, image_format, VkImageUsageFlagBits(image_usage_attachment | transfert_bit | sampled_bit | storage_bit), VkImageAspectFlagBits(image_aspect), spec.LayerCount, - spec.IsCubemap ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0); + spec.IsCubemap ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0)); if (spec.PerformTransition) { diff --git a/ZEngine/src/VulkanDevice.cpp b/ZEngine/src/VulkanDevice.cpp index de21b843..365b456b 100644 --- a/ZEngine/src/VulkanDevice.cpp +++ b/ZEngine/src/VulkanDevice.cpp @@ -960,6 +960,7 @@ namespace ZEngine::Hardwares uint32_t width, uint32_t height, VkImageType image_type, + VkImageViewType image_view_type, VkFormat image_format, VkImageTiling image_tiling, VkImageLayout image_initial_layout, @@ -996,7 +997,7 @@ namespace ZEngine::Hardwares vmaCreateImage(s_vma_allocator, &image_create_info, &allocation_create_info, &(buffer_image.Handle), &(buffer_image.Allocation), nullptr) == VK_SUCCESS, "Failed to create buffer"); - buffer_image.ViewHandle = CreateImageView(buffer_image.Handle, image_format, image_aspect_flag, layer_count); + buffer_image.ViewHandle = CreateImageView(buffer_image.Handle, image_format, image_view_type, image_aspect_flag, layer_count); buffer_image.Sampler = CreateImageSampler(); return buffer_image; } @@ -1059,16 +1060,14 @@ namespace ZEngine::Hardwares {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}, VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT); } - VkImageView VulkanDevice::CreateImageView(VkImage image, VkFormat image_format, VkImageAspectFlagBits image_aspect_flag, uint32_t layer_count) + VkImageView VulkanDevice::CreateImageView(VkImage image, VkFormat image_format, VkImageViewType image_view_type, VkImageAspectFlagBits image_aspect_flag, uint32_t layer_count) { VkImageView image_view{VK_NULL_HANDLE}; VkImageViewCreateInfo image_view_create_info = {}; image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; image_view_create_info.format = image_format; image_view_create_info.image = image; - image_view_create_info.viewType = (image_format == VK_FORMAT_R32G32B32A32_SFLOAT) - ? VK_IMAGE_VIEW_TYPE_CUBE - : VK_IMAGE_VIEW_TYPE_2D; // ToDo : We should better abstract the creation of ImageView.. introduce Image2DBufferSpecification ? + image_view_create_info.viewType = image_view_type; image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_R; image_view_create_info.components.g = VK_COMPONENT_SWIZZLE_G; image_view_create_info.components.b = VK_COMPONENT_SWIZZLE_B; From c692a0d01f5572f4958e23337867cf6cace4a696 Mon Sep 17 00:00:00 2001 From: jnyfah Date: Thu, 29 Aug 2024 14:57:02 +0100 Subject: [PATCH 2/5] added Image2DBufferSpecification constructor --- .../Specifications/TextureSpecification.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h index 8197c778..9ca50382 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h @@ -1,6 +1,6 @@ #pragma once -#include #include +#include namespace ZEngine::Rendering::Specifications { @@ -30,6 +30,20 @@ namespace ZEngine::Rendering::Specifications VkImageAspectFlagBits image_aspect_flag; uint32_t layer_count = 1U; VkImageCreateFlags image_create_flag_bit = 0; + + Image2DBufferSpecification( + uint32_t w, + uint32_t h, + ImageType view_type, + VkFormat format, + VkImageUsageFlags usage, + VkImageAspectFlagBits aspect, + uint32_t layers = 1U, + VkImageCreateFlags create_flags = 0) + : width(w), height(h), image_view_type(view_type), image_format(format), image_usage(usage), image_aspect_flag(aspect), layer_count(layers), + image_create_flag_bit(create_flags) + { + } }; } // namespace ZEngine::Rendering::Specifications \ No newline at end of file From f55df0acf7ac11267440b1d9ce7039231d3589b6 Mon Sep 17 00:00:00 2001 From: jnyfah Date: Thu, 29 Aug 2024 21:17:31 +0100 Subject: [PATCH 3/5] code review --- .../Specifications/FormatSpecification.h | 76 ++++++++++++++++++- .../Specifications/TextureSpecification.h | 30 ++------ ZEngine/src/Image2DBuffer.cpp | 10 +-- ZEngine/src/Swapchain.cpp | 2 +- ZEngine/src/Texture2D.cpp | 23 +++--- 5 files changed, 98 insertions(+), 43 deletions(-) diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h index c3777031..4e9f8437 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h @@ -112,11 +112,79 @@ namespace ZEngine::Rendering::Specifications COMPUTE }; - enum class ImageType : uint32_t + enum class ImageViewType : uint32_t { - Flat2D, - Cubemap, + TYPE_1D = 0 , + TYPE_2D, + TYPE_3D, + TYPE_CUBE }; - static VkImageViewType ImageViewTypeMap[] = {VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_VIEW_TYPE_CUBE}; + static VkImageViewType ImageViewTypeMap[] = { + VK_IMAGE_VIEW_TYPE_1D, + VK_IMAGE_VIEW_TYPE_2D, + VK_IMAGE_VIEW_TYPE_3D, + VK_IMAGE_VIEW_TYPE_CUBE, + VK_IMAGE_VIEW_TYPE_1D_ARRAY, + VK_IMAGE_VIEW_TYPE_2D_ARRAY, + VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, + VK_IMAGE_VIEW_TYPE_MAX_ENUM }; + + enum class ImageCreateFlag { + SPARSE_BINDING_BIT = 0, + SPARSE_RESIDENCY_BIT, + SPARSE_ALIASED_BIT, + MUTABLE_FORMAT_BIT, + CUBE_COMPATIBLE_BIT, + ALIAS_BIT, + SPLIT_INSTANCE_BIND_REGIONS_BIT, + ARRAY_2D_COMPATIBLE_BIT, + BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, + EXTENDED_USAGE_BIT, + PROTECTED_BIT, + DISJOINT_BIT, + CORNER_SAMPLED_BIT_NV, + SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT, + SUBSAMPLED_BIT_EXT, + DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT, + MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT, + VIEW_2D_COMPATIBLE_BIT_EXT, + FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM, + VIDEO_PROFILE_INDEPENDENT_BIT_KHR, + SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR, + ARRAY_2D_COMPATIBLE_BIT_KHR, + BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, + EXTENDED_USAGE_BIT_KHR, + DISJOINT_BIT_KHR, + ALIAS_BIT_KHR, + FLAG_BITS_MAX_ENUM}; + + static VkImageCreateFlagBits ImageCreateFlagMap[]{ + VK_IMAGE_CREATE_SPARSE_BINDING_BIT, + VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, + VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, + VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, + VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, + VK_IMAGE_CREATE_ALIAS_BIT, + VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, + VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, + VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, + VK_IMAGE_CREATE_EXTENDED_USAGE_BIT, + VK_IMAGE_CREATE_PROTECTED_BIT, + VK_IMAGE_CREATE_DISJOINT_BIT, + VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, + VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT, + VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, + VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT, + VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT, + VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT, + VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM, + VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR, + VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR, + VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR, + VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, + VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR, + VK_IMAGE_CREATE_DISJOINT_BIT_KHR, + VK_IMAGE_CREATE_ALIAS_BIT_KHR, + VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM}; } // namespace ZEngine::Rendering::Specifications diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h index 9ca50382..5e564da7 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h @@ -22,28 +22,14 @@ namespace ZEngine::Rendering::Specifications struct Image2DBufferSpecification { - uint32_t width; - uint32_t height; - ImageType image_view_type; - VkFormat image_format; - VkImageUsageFlags image_usage; - VkImageAspectFlagBits image_aspect_flag; - uint32_t layer_count = 1U; - VkImageCreateFlags image_create_flag_bit = 0; - - Image2DBufferSpecification( - uint32_t w, - uint32_t h, - ImageType view_type, - VkFormat format, - VkImageUsageFlags usage, - VkImageAspectFlagBits aspect, - uint32_t layers = 1U, - VkImageCreateFlags create_flags = 0) - : width(w), height(h), image_view_type(view_type), image_format(format), image_usage(usage), image_aspect_flag(aspect), layer_count(layers), - image_create_flag_bit(create_flags) - { - } + uint32_t Width; + uint32_t Height; + ImageViewType ImageViewType; + VkFormat ImageFormat; + VkImageUsageFlags ImageUsage; + VkImageAspectFlagBits ImageAspectFlag; + uint32_t LayerCount = 1U; + ImageCreateFlag ImageCreateFlag = ImageCreateFlag::SPARSE_BINDING_BIT; }; } // namespace ZEngine::Rendering::Specifications \ No newline at end of file diff --git a/ZEngine/src/Image2DBuffer.cpp b/ZEngine/src/Image2DBuffer.cpp index 90295fb4..06e6dd04 100644 --- a/ZEngine/src/Image2DBuffer.cpp +++ b/ZEngine/src/Image2DBuffer.cpp @@ -4,7 +4,7 @@ namespace ZEngine::Rendering::Buffers { Image2DBuffer::Image2DBuffer(const Specifications::Image2DBufferSpecification& spec) - : m_width(spec.width), m_height(spec.height) + : m_width(spec.Width), m_height(spec.Height) { ZENGINE_VALIDATE_ASSERT(m_width > 0, "Image width must be greater then zero") ZENGINE_VALIDATE_ASSERT(m_height > 0, "Image height must be greater then zero") @@ -13,15 +13,15 @@ namespace ZEngine::Rendering::Buffers m_width, m_height, VK_IMAGE_TYPE_2D, - Specifications::ImageViewTypeMap[VALUE_FROM_SPEC_MAP(spec.image_view_type)], - spec.image_format, + Specifications::ImageViewTypeMap[VALUE_FROM_SPEC_MAP(spec.ImageViewType)], + spec.ImageFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_LAYOUT_UNDEFINED, - spec.image_usage, + spec.ImageUsage, VK_SHARING_MODE_EXCLUSIVE, VK_SAMPLE_COUNT_1_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - spec.image_aspect_flag, spec.layer_count, spec.image_create_flag_bit); + spec.ImageAspectFlag, spec.LayerCount, Specifications::ImageCreateFlagMap[VALUE_FROM_SPEC_MAP(spec.ImageCreateFlag)]); } Image2DBuffer::~Image2DBuffer() diff --git a/ZEngine/src/Swapchain.cpp b/ZEngine/src/Swapchain.cpp index 6e9f74e3..f586ad0c 100644 --- a/ZEngine/src/Swapchain.cpp +++ b/ZEngine/src/Swapchain.cpp @@ -275,7 +275,7 @@ namespace ZEngine::Rendering for (size_t i = 0; i < m_image_view_collection.size(); ++i) { - m_image_view_collection[i] = Hardwares::VulkanDevice::CreateImageView(m_image_collection[i], m_surface_format.format, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_ASPECT_COLOR_BIT); + m_image_view_collection[i] = Hardwares::VulkanDevice::CreateImageView(m_image_collection[i], m_surface_format.format, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT); } /*Swapchain framebuffer*/ diff --git a/ZEngine/src/Texture2D.cpp b/ZEngine/src/Texture2D.cpp index 8ddd3087..526f1e62 100644 --- a/ZEngine/src/Texture2D.cpp +++ b/ZEngine/src/Texture2D.cpp @@ -181,17 +181,18 @@ namespace ZEngine::Rendering::Textures uint32_t image_usage_attachment = (spec.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - VkFormat image_format = (spec.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? Hardwares::VulkanDevice::FindDepthFormat() - : Specifications::ImageFormatMap[static_cast(spec.Format)]; - texture->m_image_2d_buffer = CreateRef(Specifications::Image2DBufferSpecification( - texture->m_width, - texture->m_height, - spec.IsCubemap ? Specifications::ImageType::Cubemap : Specifications::ImageType::Flat2D, - image_format, - VkImageUsageFlagBits(image_usage_attachment | transfert_bit | sampled_bit | storage_bit), - VkImageAspectFlagBits(image_aspect), - spec.LayerCount, - spec.IsCubemap ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0)); + VkFormat image_format = (spec.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? Hardwares::VulkanDevice::FindDepthFormat() + : Specifications::ImageFormatMap[static_cast(spec.Format)]; + Specifications::Image2DBufferSpecification buffer_spec; + buffer_spec.Width = texture->m_width; + buffer_spec.Height = texture->m_height; + buffer_spec.ImageViewType = spec.IsCubemap ? Specifications::ImageViewType::TYPE_CUBE : Specifications::ImageViewType::TYPE_2D, buffer_spec.ImageFormat = image_format; + buffer_spec.ImageUsage = VkImageUsageFlagBits(image_usage_attachment | transfert_bit | sampled_bit | storage_bit); + buffer_spec.ImageAspectFlag = VkImageAspectFlagBits(image_aspect); + buffer_spec.LayerCount = spec.LayerCount; + buffer_spec.ImageCreateFlag = spec.IsCubemap ? Specifications::ImageCreateFlag::CUBE_COMPATIBLE_BIT : Specifications::ImageCreateFlag::SPARSE_BINDING_BIT; + + texture->m_image_2d_buffer = CreateRef(std::move(buffer_spec)); if (spec.PerformTransition) { From 3c4d5c674d3fd6188b9c8fc754f6a87b47c46dab Mon Sep 17 00:00:00 2001 From: jnyfah Date: Fri, 30 Aug 2024 18:02:36 +0100 Subject: [PATCH 4/5] code review changes --- .../Specifications/FormatSpecification.h | 62 ++++--------------- .../Specifications/TextureSpecification.h | 15 ++++- ZEngine/src/Image2DBuffer.cpp | 19 ++++-- ZEngine/src/Texture2D.cpp | 10 +-- 4 files changed, 43 insertions(+), 63 deletions(-) diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h index 4e9f8437..71ee6562 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/FormatSpecification.h @@ -114,8 +114,8 @@ namespace ZEngine::Rendering::Specifications enum class ImageViewType : uint32_t { - TYPE_1D = 0 , - TYPE_2D, + TYPE_1D = 0, + TYPE_2D, TYPE_3D, TYPE_CUBE }; @@ -128,63 +128,23 @@ namespace ZEngine::Rendering::Specifications VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, - VK_IMAGE_VIEW_TYPE_MAX_ENUM }; + }; - enum class ImageCreateFlag { - SPARSE_BINDING_BIT = 0, + enum class ImageCreateFlag + { + NONE = 0, + SPARSE_BINDING_BIT, SPARSE_RESIDENCY_BIT, SPARSE_ALIASED_BIT, MUTABLE_FORMAT_BIT, - CUBE_COMPATIBLE_BIT, - ALIAS_BIT, - SPLIT_INSTANCE_BIND_REGIONS_BIT, - ARRAY_2D_COMPATIBLE_BIT, - BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, - EXTENDED_USAGE_BIT, - PROTECTED_BIT, - DISJOINT_BIT, - CORNER_SAMPLED_BIT_NV, - SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT, - SUBSAMPLED_BIT_EXT, - DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT, - MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT, - VIEW_2D_COMPATIBLE_BIT_EXT, - FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM, - VIDEO_PROFILE_INDEPENDENT_BIT_KHR, - SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR, - ARRAY_2D_COMPATIBLE_BIT_KHR, - BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, - EXTENDED_USAGE_BIT_KHR, - DISJOINT_BIT_KHR, - ALIAS_BIT_KHR, - FLAG_BITS_MAX_ENUM}; + CUBE_COMPATIBLE_BIT + }; static VkImageCreateFlagBits ImageCreateFlagMap[]{ + VkImageCreateFlagBits(0), VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, - VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, - VK_IMAGE_CREATE_ALIAS_BIT, - VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, - VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, - VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, - VK_IMAGE_CREATE_EXTENDED_USAGE_BIT, - VK_IMAGE_CREATE_PROTECTED_BIT, - VK_IMAGE_CREATE_DISJOINT_BIT, - VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, - VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT, - VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, - VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT, - VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT, - VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT, - VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM, - VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR, - VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR, - VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR, - VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, - VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR, - VK_IMAGE_CREATE_DISJOINT_BIT_KHR, - VK_IMAGE_CREATE_ALIAS_BIT_KHR, - VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM}; + VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT}; } // namespace ZEngine::Rendering::Specifications diff --git a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h index 5e564da7..9118094c 100644 --- a/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h +++ b/ZEngine/include/ZEngine/Rendering/Specifications/TextureSpecification.h @@ -20,16 +20,25 @@ namespace ZEngine::Rendering::Specifications const void* Data = nullptr; }; + enum class ImageBufferUsageType + { + CUBEMAP = 0, + SINGLE_2D_IMAGE, + SINGLE_3D_IMAGE, + ARRAYOF_2D_IMAGE + }; + struct Image2DBufferSpecification { uint32_t Width; uint32_t Height; - ImageViewType ImageViewType; + ImageViewType ImageViewType = ImageViewType::TYPE_2D; + ImageBufferUsageType BufferUsageType; VkFormat ImageFormat; VkImageUsageFlags ImageUsage; VkImageAspectFlagBits ImageAspectFlag; - uint32_t LayerCount = 1U; - ImageCreateFlag ImageCreateFlag = ImageCreateFlag::SPARSE_BINDING_BIT; + uint32_t LayerCount = 1U; + ImageCreateFlag ImageCreateFlag = ImageCreateFlag::NONE; }; } // namespace ZEngine::Rendering::Specifications \ No newline at end of file diff --git a/ZEngine/src/Image2DBuffer.cpp b/ZEngine/src/Image2DBuffer.cpp index 06e6dd04..abf20d28 100644 --- a/ZEngine/src/Image2DBuffer.cpp +++ b/ZEngine/src/Image2DBuffer.cpp @@ -3,17 +3,26 @@ namespace ZEngine::Rendering::Buffers { - Image2DBuffer::Image2DBuffer(const Specifications::Image2DBufferSpecification& spec) - : m_width(spec.Width), m_height(spec.Height) + Image2DBuffer::Image2DBuffer(const Specifications::Image2DBufferSpecification& spec) : m_width(spec.Width), m_height(spec.Height) { ZENGINE_VALIDATE_ASSERT(m_width > 0, "Image width must be greater then zero") ZENGINE_VALIDATE_ASSERT(m_height > 0, "Image height must be greater then zero") + Specifications::ImageViewType image_view_type = Specifications::ImageViewType::TYPE_2D; + Specifications::ImageCreateFlag image_create_flag = Specifications::ImageCreateFlag::NONE; + + if (spec.BufferUsageType == Specifications::ImageBufferUsageType::CUBEMAP) + { + + image_view_type = Specifications::ImageViewType::TYPE_CUBE; + image_create_flag = Specifications::ImageCreateFlag::CUBE_COMPATIBLE_BIT; + } + m_buffer_image = Hardwares::VulkanDevice::CreateImage( m_width, m_height, VK_IMAGE_TYPE_2D, - Specifications::ImageViewTypeMap[VALUE_FROM_SPEC_MAP(spec.ImageViewType)], + Specifications::ImageViewTypeMap[VALUE_FROM_SPEC_MAP(image_view_type)], spec.ImageFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_LAYOUT_UNDEFINED, @@ -21,7 +30,9 @@ namespace ZEngine::Rendering::Buffers VK_SHARING_MODE_EXCLUSIVE, VK_SAMPLE_COUNT_1_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - spec.ImageAspectFlag, spec.LayerCount, Specifications::ImageCreateFlagMap[VALUE_FROM_SPEC_MAP(spec.ImageCreateFlag)]); + spec.ImageAspectFlag, + spec.LayerCount, + Specifications::ImageCreateFlagMap[VALUE_FROM_SPEC_MAP(image_create_flag)]); } Image2DBuffer::~Image2DBuffer() diff --git a/ZEngine/src/Texture2D.cpp b/ZEngine/src/Texture2D.cpp index 526f1e62..f1eebf7b 100644 --- a/ZEngine/src/Texture2D.cpp +++ b/ZEngine/src/Texture2D.cpp @@ -114,7 +114,7 @@ namespace ZEngine::Rendering::Textures Ref Texture2D::Create(const Specifications::TextureSpecification& spec) { - Ref texture = CreateRef(); + Ref texture = CreateRef(); texture->m_specification = spec; FillAsVulkanImage(texture, spec); return texture; @@ -184,13 +184,13 @@ namespace ZEngine::Rendering::Textures VkFormat image_format = (spec.Format == Specifications::ImageFormat::DEPTH_STENCIL_FROM_DEVICE) ? Hardwares::VulkanDevice::FindDepthFormat() : Specifications::ImageFormatMap[static_cast(spec.Format)]; Specifications::Image2DBufferSpecification buffer_spec; - buffer_spec.Width = texture->m_width; - buffer_spec.Height = texture->m_height; - buffer_spec.ImageViewType = spec.IsCubemap ? Specifications::ImageViewType::TYPE_CUBE : Specifications::ImageViewType::TYPE_2D, buffer_spec.ImageFormat = image_format; + buffer_spec.Width = texture->m_width; + buffer_spec.Height = texture->m_height; + buffer_spec.BufferUsageType = spec.IsCubemap ? Specifications::ImageBufferUsageType::CUBEMAP : Specifications::ImageBufferUsageType::SINGLE_2D_IMAGE; + buffer_spec.ImageFormat = image_format; buffer_spec.ImageUsage = VkImageUsageFlagBits(image_usage_attachment | transfert_bit | sampled_bit | storage_bit); buffer_spec.ImageAspectFlag = VkImageAspectFlagBits(image_aspect); buffer_spec.LayerCount = spec.LayerCount; - buffer_spec.ImageCreateFlag = spec.IsCubemap ? Specifications::ImageCreateFlag::CUBE_COMPATIBLE_BIT : Specifications::ImageCreateFlag::SPARSE_BINDING_BIT; texture->m_image_2d_buffer = CreateRef(std::move(buffer_spec)); From 0603095e7d8298a9c6db7ce0eafb3b4588727e2f Mon Sep 17 00:00:00 2001 From: Jean Philippe Date: Tue, 3 Sep 2024 12:49:34 +0100 Subject: [PATCH 5/5] Update ZEngine/src/Image2DBuffer.cpp --- ZEngine/src/Image2DBuffer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/ZEngine/src/Image2DBuffer.cpp b/ZEngine/src/Image2DBuffer.cpp index abf20d28..af94dc3f 100644 --- a/ZEngine/src/Image2DBuffer.cpp +++ b/ZEngine/src/Image2DBuffer.cpp @@ -13,7 +13,6 @@ namespace ZEngine::Rendering::Buffers if (spec.BufferUsageType == Specifications::ImageBufferUsageType::CUBEMAP) { - image_view_type = Specifications::ImageViewType::TYPE_CUBE; image_create_flag = Specifications::ImageCreateFlag::CUBE_COMPATIBLE_BIT; }