diff --git a/aster/include/aster/core/buffer.h b/aster/include/aster/core/buffer.h index 0e8dbde..ebaeda0 100644 --- a/aster/include/aster/core/buffer.h +++ b/aster/include/aster/core/buffer.h @@ -10,13 +10,28 @@ struct Device; /// A Vulkan buffer wrapper. -struct Buffer final +struct Buffer { + enum class FlagBits : u8 + { + eNone = 0x0, + eStaging = 0x1, + eUniform = 0x2, + eStorage = 0x4, + eIndex = 0x8, + eVertex = 0x10, + eIndirect = 0x20, + }; + + using Flags = vk::Flags; + constexpr static Flags FLAGS = {}; + const Device *m_Device = nullptr; vk::Buffer m_Buffer = nullptr; VmaAllocation m_Allocation = nullptr; u8 *m_Mapped = nullptr; ///< If the buffer is host visible, it should be (and stay) mapped. usize m_Size = 0; + Flags m_Flags = {}; /// @returns True if it is a valid vulkan buffer. [[nodiscard]] bool @@ -53,3 +68,50 @@ struct Buffer final DISALLOW_COPY_AND_ASSIGN(Buffer); }; + +struct UniformBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eUniform; +}; + +struct StorageBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eStorage; +}; + +struct IndirectBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eIndirect; +}; + +struct VertexBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eVertex; +}; + +struct IndexBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eIndex; +}; + +struct StagingBuffer : Buffer +{ + constexpr static Flags FLAGS = FlagBits::eStaging; +}; + +namespace concepts +{ +template +concept AnyBuffer = std::derived_from; + +template +concept BufferInto = std::derived_from and std::derived_from and + (Cast(T::FLAGS & TInto::FLAGS) or std::same_as); + +template +concept AnyBufferRef = Deref and AnyBuffer>; + +template +concept BufferRefTo = Deref and BufferInto, TTo>; + +} // namespace concepts \ No newline at end of file diff --git a/aster/include/aster/core/image.h b/aster/include/aster/core/image.h index 7f34e9b..66bfa37 100644 --- a/aster/include/aster/core/image.h +++ b/aster/include/aster/core/image.h @@ -36,38 +36,26 @@ ToOffset3D(const vk::Extent3D &extent) struct Image { + enum class FlagBits : u8 + { + eSampled = 0x1, + eStorage = 0x2, + eCube = 0x4, + }; + + using Flags = vk::Flags; + constexpr static Flags FLAGS = {}; + const Device *m_Device = nullptr; vk::Image m_Image = nullptr; VmaAllocation m_Allocation = nullptr; vk::Extent3D m_Extent; vk::Format m_Format; u8 m_EmptyPadding_ = 0; - u8 m_Flags_ = 0; + Flags m_Flags_ = {}; u8 m_LayerCount = 0; u8 m_MipLevels = 0; - constexpr static u8 SAMPLED_BIT = 1 << 7; - constexpr static u8 STORAGE_BIT = 1 << 6; - constexpr static u8 CUBE_BIT = 1 << 5; - - [[nodiscard]] bool - IsSampled() const - { - return m_Flags_ & SAMPLED_BIT; - } - - [[nodiscard]] bool - IsStorage() const - { - return m_Flags_ & STORAGE_BIT; - } - - [[nodiscard]] bool - IsCube() const - { - return m_Flags_ & CUBE_BIT; - } - [[nodiscard]] bool IsValid() const { @@ -80,18 +68,12 @@ struct Image return m_MipLevels; } - static bool - Conforms(const Image &) - { - return true; - } - void DestroyView(vk::ImageView imageView) const; // Constructors. explicit Image(const Device *device, vk::Image image, VmaAllocation allocation, vk::Extent3D extent, - vk::Format format, u8 flags, u8 layerCount, u8 mipLevels); + vk::Format format, Flags flags, u8 layerCount, u8 mipLevels); Image(Image &&other) noexcept; Image &operator=(Image &&other) noexcept; @@ -101,106 +83,50 @@ struct Image DISALLOW_COPY_AND_ASSIGN(Image); }; -namespace concepts -{ -template -concept Image = std::derived_from; - -template -concept ImageRef = Derefencable and Image>; - -template -concept SampledImage = requires() { - { T::SAMPLED } -> std::convertible_to; -} and T::SAMPLED and Image; - -template -concept SampledImageRef = Derefencable and SampledImage>; - -template -concept ImageCube = requires() { - { T::CUBE } -> std::convertible_to; -} and T::CUBE and Image; - -template -concept ImageCubeRef = Derefencable and ImageCube>; - -template -concept StorageImage = requires() { - { T::STORAGE } -> std::convertible_to; -} and T::STORAGE and Image; - -template -concept StorageImageRef = Derefencable and StorageImage>; - -} // namespace concepts - struct Texture : Image { - constexpr static bool SAMPLED = true; - - static bool - Conforms(const Image &other) - { - return other.IsSampled(); - } + constexpr static Flags FLAGS = FlagBits::eSampled; }; struct ImageCube : Image { - constexpr static bool CUBE = true; - - static bool - Conforms(const Image &other) - { - return other.IsCube(); - } + constexpr static Flags FLAGS = FlagBits::eCube; }; struct TextureCube : Image { - constexpr static bool SAMPLED = true; - constexpr static bool CUBE = true; - - static bool - Conforms(const Image &other) - { - return other.IsSampled() && other.IsCube(); - } + constexpr static Flags FLAGS = Texture::FLAGS | ImageCube::FLAGS; }; struct StorageImage : Image { - constexpr static bool STORAGE = true; - - static bool - Conforms(const Image &other) - { - return other.IsStorage(); - } + constexpr static Flags FLAGS = FlagBits::eStorage; }; struct StorageTexture : StorageImage { - constexpr static bool SAMPLED = true; - constexpr static bool STORAGE = true; - - static bool - Conforms(const Image &other) - { - return other.IsStorage() && other.IsSampled(); - } + constexpr static Flags FLAGS = StorageImage::FLAGS | Texture::FLAGS; }; struct StorageTextureCube : StorageImage { - constexpr static bool SAMPLED = true; - constexpr static bool CUBE = true; - constexpr static bool STORAGE = true; + constexpr static Flags FLAGS = StorageImage::FLAGS | Texture::FLAGS | ImageCube::FLAGS; +}; - static bool - Conforms(const Image &other) - { - return other.IsStorage() && other.IsSampled() && other.IsCube(); - } -}; \ No newline at end of file +namespace concepts +{ + +template +concept AnyImage = std::derived_from; + +template +concept ImageInto = std::derived_from and std::derived_from and + (Cast(T::FLAGS & TInto::FLAGS) or std::same_as); + +template +concept AnyImageRef = Deref and AnyImage>; + +template +concept ImageRefTo = Deref and ImageInto, TTo>; + +} // namespace concepts \ No newline at end of file diff --git a/aster/include/aster/core/image_view.h b/aster/include/aster/core/image_view.h index 247aeed..452a8fe 100644 --- a/aster/include/aster/core/image_view.h +++ b/aster/include/aster/core/image_view.h @@ -8,7 +8,7 @@ #include "global.h" #include "image.h" -template +template struct View { using ImageType = TImage; @@ -93,31 +93,16 @@ using StorageTextureCubeView = View; namespace concepts { -template -concept View = std::derived_from>; +template +concept View = std::derived_from>; + +template +concept ViewTo = View and ImageInto; template -concept ViewRef = Derefencable and View>; +concept ViewRef = Deref and View>; -template -concept ImageView = View and Image; - -template -concept ImageViewRef = Derefencable and ImageView>; - -template -concept ImageCubeView = View and ImageCube; - -template -concept SampledImageView = View and SampledImage; - -template -concept SampledImageViewRef = Derefencable and SampledImageView>; - -template -concept StorageImageView = View and StorageImage; - -template -concept StorageImageViewRef = Derefencable and StorageImageView>; +template +concept ViewRefTo = ViewRef and ImageInto::ImageType, TTo>; } // namespace concepts \ No newline at end of file diff --git a/aster/include/aster/core/type_traits.h b/aster/include/aster/core/type_traits.h index 9ba8b88..9298a10 100644 --- a/aster/include/aster/core/type_traits.h +++ b/aster/include/aster/core/type_traits.h @@ -13,11 +13,16 @@ struct Image; namespace concepts { template -concept Derefencable = requires(T a) { +concept Deref = requires(T a) { { *a }; }; -template -using DereferencesTo = std::remove_cvref_t())>; +template +concept DerefTo = requires(TRef a) { + { *a } -> std::convertible_to; +}; + +template +using DerefType = std::remove_cvref_t())>; } // namespace concepts \ No newline at end of file diff --git a/aster/include/aster/systems/buffer_manager.h b/aster/include/aster/systems/buffer_manager.h index 344a40f..f30c444 100644 --- a/aster/include/aster/systems/buffer_manager.h +++ b/aster/include/aster/systems/buffer_manager.h @@ -10,17 +10,25 @@ namespace systems { + +template TTo, std::derived_from TFrom> +static Ref +CastBuffer(const Ref &from) +{ + if constexpr (not concepts::BufferInto) + assert(TTo::FLAGS & from->m_Flags); + return std::reinterpret_pointer_cast(from); +} + class BufferManager final { - using Handle = Ref; - const Device *m_Device = nullptr; public: explicit BufferManager(const Device *device); - [[nodiscard]] Handle CreateStorageBuffer(usize size, cstr name = nullptr); - [[nodiscard]] Handle CreateUniformBuffer(usize size, cstr name = nullptr); - [[nodiscard]] Handle CreateStagingBuffer(usize size, cstr name = nullptr); + [[nodiscard]] Ref CreateStorageBuffer(usize size, cstr name = nullptr) const; + [[nodiscard]] Ref CreateUniformBuffer(usize size, cstr name = nullptr) const; + [[nodiscard]] Ref CreateStagingBuffer(usize size, cstr name = nullptr) const; }; } // namespace systems \ No newline at end of file diff --git a/aster/include/aster/systems/commit_manager.h b/aster/include/aster/systems/commit_manager.h index 8d6a2de..c791b66 100644 --- a/aster/include/aster/systems/commit_manager.h +++ b/aster/include/aster/systems/commit_manager.h @@ -224,7 +224,7 @@ class CommitManager // Commit Storage Images ResId - CommitStorageImage(const concepts::StorageImageViewRef auto &image) + CommitStorageImage(const concepts::ViewRefTo auto &image) { return CommitStorageImage(CastView(image)); } @@ -233,19 +233,17 @@ class CommitManager // Sampled Images ResId - CommitTexture(const concepts::SampledImageViewRef auto &image, const Ref &sampler) + CommitTexture(const concepts::ViewRefTo auto &image, const Ref &sampler) { return CommitTexture(CastView(image), sampler); } ResId - CommitTexture(const concepts::SampledImageViewRef auto &image) + CommitTexture(const concepts::ViewRefTo auto &image) { return CommitTexture(CastView(image)); } - static_assert(concepts::SampledImageViewRef>); - ResId CommitTexture(const Ref &handle); ResId CommitTexture(const Ref &image, const Ref &sampler); diff --git a/aster/include/aster/systems/image_manager.h b/aster/include/aster/systems/image_manager.h index 59f83b5..ddbb616 100644 --- a/aster/include/aster/systems/image_manager.h +++ b/aster/include/aster/systems/image_manager.h @@ -11,11 +11,12 @@ namespace systems { -template TTo> +template TTo, std::derived_from TFrom> static Ref -CastImage(const concepts::ImageRef auto &from) +CastImage(const Ref &from) { - assert(TTo::Conforms(*from.get())); + if constexpr (not concepts::ImageInto) + assert(TTo::FLAGS & from->m_Flags_); return std::reinterpret_pointer_cast(from); } @@ -55,10 +56,11 @@ struct DepthStencilImageCreateInfo class ImageManager final { const Device *m_Device; + public: explicit ImageManager(const Device *device); - template + template T> [[nodiscard]] Ref CreateTexture2D(const Texture2DCreateInfo &createInfo) { @@ -66,7 +68,7 @@ class ImageManager final return CastImage(handle); } - template + template T> [[nodiscard]] Ref CreateTextureCube(const TextureCubeCreateInfo &createInfo) { diff --git a/aster/include/aster/systems/resource_manager.h b/aster/include/aster/systems/resource_manager.h index 08dbecf..1bdda7c 100644 --- a/aster/include/aster/systems/resource_manager.h +++ b/aster/include/aster/systems/resource_manager.h @@ -28,7 +28,7 @@ class ResourceManager { } - template + template T> [[nodiscard]] Ref CreateTexture2D(const Texture2DCreateInfo &createInfo) { @@ -36,7 +36,7 @@ class ResourceManager return CastView(handle); } - template + template T> [[nodiscard]] Ref CreateTextureCube(const TextureCubeCreateInfo &createInfo) { diff --git a/aster/include/aster/systems/view_manager.h b/aster/include/aster/systems/view_manager.h index be1ac2c..91a3ed2 100644 --- a/aster/include/aster/systems/view_manager.h +++ b/aster/include/aster/systems/view_manager.h @@ -13,15 +13,16 @@ namespace systems { -template +template TFrom> static Ref -CastView(const concepts::ImageViewRef auto &from) +CastView(const Ref> &from) { - assert(TTo::ImageType::Conforms(*from->m_Image.get())); + if constexpr (not concepts::ImageInto) + assert(TTo::ImageType::FLAGS & from->m_Image->m_Flags_); return std::reinterpret_pointer_cast(from); } -template +template struct ViewCreateInfo { using ImageType = TImage; @@ -91,7 +92,7 @@ class ViewManager final public: explicit ViewManager(const Device *device); - template + template Ref CreateView(const ViewCreateInfo &createInfo) { diff --git a/aster/src/aster/core/buffer.cpp b/aster/src/aster/core/buffer.cpp index 945e868..ebfefbc 100644 --- a/aster/src/aster/core/buffer.cpp +++ b/aster/src/aster/core/buffer.cpp @@ -41,6 +41,19 @@ Buffer::Buffer(const Device *device, const usize size, const vk::BufferUsageFlag m_Size = size; m_Allocation = allocation; m_Mapped = Cast(allocationInfo.pMappedData); + m_Flags = {}; + if (bufferUsage & vk::BufferUsageFlagBits::eTransferSrc) + m_Flags |= FlagBits::eStaging; + if (bufferUsage & vk::BufferUsageFlagBits::eIndexBuffer) + m_Flags |= FlagBits::eIndex; + if (bufferUsage & vk::BufferUsageFlagBits::eIndirectBuffer) + m_Flags |= FlagBits::eIndirect; + if (bufferUsage & vk::BufferUsageFlagBits::eVertexBuffer) + m_Flags |= FlagBits::eVertex; + if (bufferUsage & vk::BufferUsageFlagBits::eUniformBuffer) + m_Flags |= FlagBits::eUniform; + if (bufferUsage & vk::BufferUsageFlagBits::eStorageBuffer) + m_Flags |= FlagBits::eStorage; device->SetName(m_Buffer, name); } diff --git a/aster/src/aster/core/image.cpp b/aster/src/aster/core/image.cpp index bf77161..d78410f 100644 --- a/aster/src/aster/core/image.cpp +++ b/aster/src/aster/core/image.cpp @@ -31,7 +31,7 @@ Image::~Image() return; vmaDestroyImage(m_Device->m_Allocator, Take(m_Image), m_Allocation); - m_Flags_ = 0; + m_Flags_ = {}; } void @@ -463,7 +463,7 @@ Image::Image(Image &&other) noexcept } Image::Image(const Device *device, const vk::Image image, const VmaAllocation allocation, const vk::Extent3D extent, - const vk::Format format, const u8 flags, const u8 layerCount, const u8 mipLevels) + const vk::Format format, const Flags flags, const u8 layerCount, const u8 mipLevels) : m_Device{device} , m_Image{image} , m_Allocation{allocation} diff --git a/aster/src/aster/systems/buffer_manager.cpp b/aster/src/aster/systems/buffer_manager.cpp index 625850f..8747676 100644 --- a/aster/src/aster/systems/buffer_manager.cpp +++ b/aster/src/aster/systems/buffer_manager.cpp @@ -7,8 +7,8 @@ using namespace systems; -Ref -BufferManager::CreateStorageBuffer(const usize size, const cstr name) +Ref +BufferManager::CreateStorageBuffer(const usize size, const cstr name) const { // TODO: Storage and Index buffer are set. // This is hacky and should be improved. @@ -19,30 +19,131 @@ BufferManager::CreateStorageBuffer(const usize size, const cstr name) VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; constexpr VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO; - return std::make_shared(m_Device, size, usage, createFlags, memoryUsage, name); + return std::make_shared(Buffer{m_Device, size, usage, createFlags, memoryUsage, name}); } -Ref -BufferManager::CreateUniformBuffer(const usize size, const cstr name) +Ref +BufferManager::CreateUniformBuffer(const usize size, const cstr name) const { constexpr vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eUniformBuffer; constexpr VmaAllocationCreateFlags createFlags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; constexpr VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO; - return std::make_shared(m_Device, size, usage, createFlags, memoryUsage, name); + return std::make_shared(Buffer{m_Device, size, usage, createFlags, memoryUsage, name}); } -Ref -BufferManager::CreateStagingBuffer(const usize size, const cstr name) +Ref +BufferManager::CreateStagingBuffer(const usize size, const cstr name) const { constexpr vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eTransferSrc; constexpr VmaAllocationCreateFlags createFlags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; constexpr VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO; - return std::make_shared(m_Device, size, usage, createFlags, memoryUsage, name); + return std::make_shared(Buffer{m_Device, size, usage, createFlags, memoryUsage, name}); } +// +// void +// UniformBuffer::Init(const Device *device, const usize size, const cstr name) +//{ +// Allocate(device, size, vk::BufferUsageFlagBits::eUniformBuffer, +// VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | +// VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, +// VMA_MEMORY_USAGE_AUTO, name); +//} +// +// void +// StorageBuffer::Init(const Device *device, usize size, bool hostVisible, cstr name) +//{ +// Init(device, size, hostVisible, false, name); +//} +// +// void +// StorageBuffer::Init(const Device *device, usize size, bool hostVisible, bool deviceAddress, cstr name) +//{ +// vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eStorageBuffer; +// if (deviceAddress) +// { +// usage |= vk::BufferUsageFlagBits::eShaderDeviceAddress; +// } +// if (hostVisible) +// { +// Allocate(device, size, usage, +// VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | +// VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, +// VMA_MEMORY_USAGE_AUTO, name); +// } +// else +// { +// usage |= vk::BufferUsageFlagBits::eTransferDst; +// Allocate(device, size, usage, 0, VMA_MEMORY_USAGE_AUTO, name); +// } +//} +// +// void +// StorageIndexBuffer::Init(const Device *device, usize size, bool hostVisible, bool deviceAddress, cstr name) +//{ +// vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eStorageBuffer | vk::BufferUsageFlagBits::eIndexBuffer; +// if (deviceAddress) +// { +// usage |= vk::BufferUsageFlagBits::eShaderDeviceAddress; +// } +// if (hostVisible) +// { +// Allocate(device, size, usage, +// VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | +// VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, +// VMA_MEMORY_USAGE_AUTO, name); +// } +// else +// { +// usage |= vk::BufferUsageFlagBits::eTransferDst; +// Allocate(device, size, usage, 0, VMA_MEMORY_USAGE_AUTO, name); +// } +//} +// +// void +// IndirectBuffer::Init(const Device *device, usize size, bool hostVisible, cstr name) +//{ +// vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eStorageBuffer | vk::BufferUsageFlagBits::eIndirectBuffer | +// vk::BufferUsageFlagBits::eShaderDeviceAddress; +// if (hostVisible) +// { +// Allocate(device, size, usage, +// VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | +// VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, +// VMA_MEMORY_USAGE_AUTO, name); +// } +// else +// { +// usage |= vk::BufferUsageFlagBits::eTransferDst; +// Allocate(device, size, usage, 0, VMA_MEMORY_USAGE_AUTO, name); +// } +//} +// +// void +// VertexBuffer::Init(const Device *device, usize size, cstr name) +//{ +// Allocate(device, size, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, 0, +// VMA_MEMORY_USAGE_AUTO, name); +//} +// +// void +// IndexBuffer::Init(const Device *device, usize size, cstr name) +//{ +// Allocate(device, size, vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eTransferDst, 0, +// VMA_MEMORY_USAGE_AUTO, name); +//} +// +// void +// StagingBuffer::Init(const Device *device, usize size, cstr name) +//{ +// Allocate(device, size, vk::BufferUsageFlagBits::eTransferSrc, +// VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, +// VMA_MEMORY_USAGE_AUTO, name); +//} + BufferManager::BufferManager(const Device *device) : m_Device{device} { diff --git a/aster/src/aster/systems/image_manager.cpp b/aster/src/aster/systems/image_manager.cpp index 722944d..762d83d 100644 --- a/aster/src/aster/systems/image_manager.cpp +++ b/aster/src/aster/systems/image_manager.cpp @@ -49,11 +49,11 @@ ImageManager::CreateTexture2D(const Texture2DCreateInfo &createInfo) u8 layerCount = Cast(imageCreateInfo.arrayLayers); u8 mipLevels = Cast(imageCreateInfo.mipLevels); - u8 flags = 0; + Image::Flags flags = {}; if (createInfo.m_IsSampled) - flags |= Image::SAMPLED_BIT; + flags |= Image::FlagBits::eSampled; if (createInfo.m_IsStorage) - flags |= Image::STORAGE_BIT; + flags |= Image::FlagBits::eStorage; m_Device->SetName(image, createInfo.m_Name); @@ -80,11 +80,11 @@ ImageManager::CreateTextureCube(const TextureCubeCreateInfo &createInfo) u8 layerCount = Cast(imageCreateInfo.arrayLayers); u8 mipLevels = Cast(imageCreateInfo.mipLevels); - u8 flags = Image::CUBE_BIT; + Image::Flags flags = Image::FlagBits::eCube; if (createInfo.m_IsSampled) - flags |= Image::SAMPLED_BIT; + flags |= Image::FlagBits::eSampled; if (createInfo.m_IsStorage) - flags |= Image::STORAGE_BIT; + flags |= Image::FlagBits::eStorage; m_Device->SetName(image, createInfo.m_Name); @@ -114,8 +114,8 @@ ImageManager::CreateAttachment(const AttachmentCreateInfo &createInfo) m_Device->SetName(image, createInfo.m_Name); - return std::make_shared(m_Device, image, allocation, imageCreateInfo.extent, imageCreateInfo.format, 0, - layerCount, mipLevels); + return std::make_shared(m_Device, image, allocation, imageCreateInfo.extent, imageCreateInfo.format, + Image::Flags{}, layerCount, mipLevels); } Ref @@ -140,8 +140,8 @@ ImageManager::CreateDepthStencilImage(const DepthStencilImageCreateInfo &createI m_Device->SetName(image, createInfo.m_Name); - return std::make_shared(m_Device, image, allocation, imageCreateInfo.extent, imageCreateInfo.format, 0, - layerCount, mipLevels); + return std::make_shared(m_Device, image, allocation, imageCreateInfo.extent, imageCreateInfo.format, + Image::Flags{}, layerCount, mipLevels); } vk::ImageCreateInfo diff --git a/samples/03_model_render/asset_loader.h b/samples/03_model_render/asset_loader.h index b346147..7d7f6eb 100644 --- a/samples/03_model_render/asset_loader.h +++ b/samples/03_model_render/asset_loader.h @@ -139,7 +139,7 @@ GenerateMipMaps(vk::CommandBuffer commandBuffer, const Ref &textureView vk::ImageLayout finalLayout, vk::PipelineStageFlags2 prevStage, vk::PipelineStageFlags2 finalStage); void -GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageRef auto &texture, vk::ImageLayout initialLayout, +GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::ImageRefTo auto &texture, vk::ImageLayout initialLayout, vk::ImageLayout finalLayout, vk::PipelineStageFlags2 prevStage = vk::PipelineStageFlagBits2::eAllCommands, vk::PipelineStageFlags2 finalStage = vk::PipelineStageFlagBits2::eAllCommands) @@ -149,7 +149,7 @@ GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageRef auto } void -GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageViewRef auto &texture, +GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::ViewRefTo auto &texture, vk::ImageLayout initialLayout, vk::ImageLayout finalLayout, vk::PipelineStageFlags2 prevStage = vk::PipelineStageFlagBits2::eAllCommands, vk::PipelineStageFlags2 finalStage = vk::PipelineStageFlagBits2::eAllCommands) @@ -157,5 +157,3 @@ GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageViewRef a GenerateMipMaps(commandBuffer, systems::CastImage(texture->m_Image), initialLayout, finalLayout, prevStage, finalStage); } - -static_assert(concepts::SampledImageRef>); \ No newline at end of file