diff --git a/aster/include/aster/core/image.h b/aster/include/aster/core/image.h index dc194a0..b1a5f3e 100644 --- a/aster/include/aster/core/image.h +++ b/aster/include/aster/core/image.h @@ -39,8 +39,8 @@ struct Image const Device *m_Device = nullptr; vk::Image m_Image = nullptr; VmaAllocation m_Allocation = nullptr; - vk::ImageView m_View = nullptr; vk::Extent3D m_Extent; + vk::Format m_Format; std::atomic m_RefCount; u8 m_EmptyPadding_ = 0; u8 m_Flags_ = 0; @@ -112,6 +112,8 @@ struct Image { return true; } + + void DestroyView(vk::ImageView imageView) const; }; namespace concepts @@ -132,8 +134,8 @@ concept SampledImageRef = Derefencable and SampledImage>; template concept ImageCube = requires() { - { T::CUBED } -> std::convertible_to; -} and T::CUBED and Image; + { T::CUBE } -> std::convertible_to; +} and T::CUBE and Image; template concept ImageCubeRef = Derefencable and ImageCube>; diff --git a/aster/include/aster/core/image_view.h b/aster/include/aster/core/image_view.h index f5454c2..258cb9f 100644 --- a/aster/include/aster/core/image_view.h +++ b/aster/include/aster/core/image_view.h @@ -13,14 +13,97 @@ struct View { using ImageType = TImage; - Ref m_Image; + const Device *m_Device; + Ref m_Image; vk::ImageView m_View = nullptr; vk::Extent3D m_Extent; std::atomic m_RefCount; - u8 m_EmptyPadding_ = 0; - u8 m_Flags_ = 0; + u8 m_BaseLayer = 0; u8 m_LayerCount = 0; - u8 m_MipLevels = 0; + u8 m_BaseMipLevel = 0; + u8 m_MipLevelCount = 0; + + [[nodiscard]] vk::Image + GetImage() const + { + return m_Image->m_Image; + } + + void + AddRef() + { + const auto rc = ++m_RefCount; + assert(rc > 0); + } + + void + Release() + { + const auto rc = --m_RefCount; + assert(rc < MaxValue); + if (rc == 0) + { + Destroy(); + } + } + + [[nodiscard]] bool + IsReferenced() const + { + return m_RefCount; + } + + [[nodiscard]] bool + IsValid() const + { + return m_Image; + } + + void + Destroy() + { + if (!IsValid()) + return; + + m_Image->DestroyView(Take(m_View)); + } }; -using ImageView = View<>; \ No newline at end of file +struct ImageView : View<> {}; +struct ImageCubeView : View {}; +struct TextureView : View {}; +struct TextureCubeView : View {}; +struct StorageImageView : View {}; +struct StorageTextureView : View {}; +struct StorageTextureCubeView : View {}; + +namespace concepts +{ +template +concept View = std::derived_from>; + +template +concept ViewRef = Derefencable 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>; + +} // namespace concepts diff --git a/aster/include/aster/core/sampler.h b/aster/include/aster/core/sampler.h index 11eae4d..3fe2c2b 100644 --- a/aster/include/aster/core/sampler.h +++ b/aster/include/aster/core/sampler.h @@ -13,11 +13,12 @@ struct Device; struct Sampler { + const Device *m_Device = nullptr; vk::Sampler m_Sampler = nullptr; std::atomic m_RefCount = 0; void Init(const Device *device, const vk::SamplerCreateInfo &samplerCreateInfo, cstr name); - void Destroy(const Device *device); + void Destroy(); void AddRef() diff --git a/aster/include/aster/systems/commit_manager.h b/aster/include/aster/systems/commit_manager.h index 82a52b2..b5ffd4d 100644 --- a/aster/include/aster/systems/commit_manager.h +++ b/aster/include/aster/systems/commit_manager.h @@ -17,6 +17,7 @@ #include "EASTL/bonus/fixed_ring_buffer.h" #include "resource.h" +#include "aster/core/image_view.h" namespace systems { @@ -226,27 +227,29 @@ class CommitManager ResId CommitBuffer(const Ref &buffer); // Commit Storage Images - ResId CommitStorageImage(const concepts::StorageImageRef auto &image) + ResId CommitStorageImage(const concepts::StorageImageViewRef auto &image) { - return CommitStorageImage(CastImage(image)); + return CommitStorageImage(CastView(image)); } - ResId CommitStorageImage(const Ref &image); + ResId CommitStorageImage(const Ref &image); // Sampled Images - ResId - CommitTexture(const concepts::SampledImageRef auto &image, const Ref &sampler) + ResId + CommitTexture(const concepts::SampledImageViewRef auto &image, const Ref &sampler) { - return CommitTexture(CastImage(image), sampler); + return CommitTexture(CastView(image), sampler); } - ResId - CommitTexture(const concepts::SampledImageRef auto &image) + ResId + CommitTexture(const concepts::SampledImageViewRef auto &image) { - return CommitTexture(CastImage(image)); + return CommitTexture(CastView(image)); } - ResId CommitTexture(const Ref &handle); - ResId CommitTexture(const Ref &image, const Ref &sampler); + static_assert(concepts::SampledImageViewRef>); + + ResId CommitTexture(const Ref &handle); + ResId CommitTexture(const Ref &image, const Ref &sampler); void Update(); @@ -256,14 +259,14 @@ class CommitManager return m_Buffers.GetHandle(id); } - Ref - FetchHandle(const ResId &id) + Ref + FetchHandle(const ResId &id) { return m_Images.GetHandle(id); } - Ref - FetchHandle(const ResId &id) + Ref + FetchHandle(const ResId &id) { return m_StorageImages.GetHandle(id); } @@ -296,8 +299,8 @@ class CommitManager constexpr static u8 STORAGE_IMAGE_BINDING_INDEX = 0x2; HandleMapper m_Buffers; - HandleMapper m_Images; - HandleMapper m_StorageImages; + HandleMapper m_Images; + HandleMapper m_StorageImages; Ref m_DefaultSampler; @@ -307,8 +310,8 @@ class CommitManager static CommitManager *m_Instance; friend ResId; - friend ResId; - friend ResId; + friend ResId; + friend ResId; void AddRef(const ResId &handle) @@ -316,12 +319,12 @@ class CommitManager m_Buffers.AddRef(handle); } void - AddRef(const ResId &handle) + AddRef(const ResId &handle) { m_Images.AddRef(handle); } void - AddRef(const ResId &handle) + AddRef(const ResId &handle) { m_StorageImages.AddRef(handle); } @@ -332,12 +335,12 @@ class CommitManager m_Buffers.Release(handle); } void - Release(const ResId &handle) + Release(const ResId &handle) { m_Images.Release(handle); } void - Release(const ResId &handle) + Release(const ResId &handle) { m_StorageImages.Release(handle); } @@ -347,14 +350,16 @@ template void ResId::AddRef() const { - CommitManager::Instance().AddRef(*this); + if (m_Index != INVALID) + CommitManager::Instance().AddRef(*this); } template void ResId::Release() const { - CommitManager::Instance().Release(*this); + if (m_Index != INVALID) + CommitManager::Instance().Release(*this); } } // namespace systems \ No newline at end of file diff --git a/aster/include/aster/systems/image_view_manager.h b/aster/include/aster/systems/image_view_manager.h index 10125a5..ea6d4fa 100644 --- a/aster/include/aster/systems/image_view_manager.h +++ b/aster/include/aster/systems/image_view_manager.h @@ -10,23 +10,95 @@ #include "aster/aster.h" #include "aster/core/image_view.h" +#include + namespace systems { -// -//template TTo> -//static Ref -//CastView(const concepts::ImageRef auto &from) -//{ -// assert(TTo::Conforms(*from.get())); -// return Recast(from.get()); -//} + +template +static Ref +CastView(const concepts::ImageViewRef auto &from) +{ + assert(TTo::ImageType::Conforms(*from->m_Image.get())); + return Recast(from.get()); +} + +template +struct ViewCreateInfo +{ + using ImageType = TImage; + + Ref m_Image; + cstr m_Name; + vk::ImageViewType m_ViewType = vk::ImageViewType::e2D; + vk::ComponentMapping m_Components = {}; + vk::ImageAspectFlags m_AspectMask = {}; + eastl::optional m_MipLevelCount = eastl::nullopt; + eastl::optional m_LayerCount = eastl::nullopt; + u8 m_BaseMipLevel = 0; + u8 m_BaseLayer = 0; + + [[nodiscard]] u8 + GetMipLevelCount() const + { + return m_MipLevelCount.value_or(m_Image->m_MipLevels - m_BaseMipLevel); + } + + [[nodiscard]] u8 + GetLayerCount() const + { + return m_LayerCount.value_or(m_Image->m_LayerCount - m_BaseLayer); + } + + explicit + operator vk::ImageViewCreateInfo() const + { + return { + .image = m_Image->m_Image, + .viewType = m_ViewType, + .format = m_Image->m_Format, + .components = m_Components, + .subresourceRange = + { + .aspectMask = m_AspectMask, + .baseMipLevel = m_BaseMipLevel, + .levelCount = GetMipLevelCount(), + .baseArrayLayer = m_BaseLayer, + .layerCount = GetLayerCount(), + }, + }; + } + + explicit + operator ViewCreateInfo<>() const + { + return { + .m_Image = CastImage(m_Image), + .m_Name = m_Name, + .m_ViewType = m_ViewType, + .m_Components = m_Components, + .m_AspectMask = m_AspectMask, + .m_MipLevelCount = m_MipLevelCount, + .m_LayerCount = m_LayerCount, + .m_BaseMipLevel = m_BaseMipLevel, + .m_BaseLayer = m_BaseLayer, + }; + } +}; class ImageViewManager final : public Manager { public: ImageViewManager(const Device *device, const u32 maxCount); + template + Ref + CreateView(const ViewCreateInfo &createInfo) + { + return CastView(CreateView(ViewCreateInfo<>(createInfo))); + } + Ref CreateView(const ViewCreateInfo<> &createInfo); }; } // namespace systems diff --git a/aster/include/aster/systems/manager.h b/aster/include/aster/systems/manager.h index 4190327..2a6b5dc 100644 --- a/aster/include/aster/systems/manager.h +++ b/aster/include/aster/systems/manager.h @@ -33,7 +33,7 @@ class Manager , m_Device{device} { u32 i = 0; - for (auto& element : m_Data) + for (auto &element : m_Data) { *Recast(&element) = ++i; } @@ -41,13 +41,9 @@ class Manager virtual ~Manager() { - for (auto& element: m_Data) + if constexpr (concepts::DeviceDestructible) { - if constexpr (concepts::SelfDestructible) - { - element.Destroy(); - } - else if constexpr (concepts::DeviceDestructible) + for (auto &element : m_Data) { element.Destroy(m_Device); } diff --git a/aster/include/aster/systems/resource_manager.h b/aster/include/aster/systems/resource_manager.h index 92a850a..ae0e780 100644 --- a/aster/include/aster/systems/resource_manager.h +++ b/aster/include/aster/systems/resource_manager.h @@ -9,21 +9,94 @@ #include "buffer_manager.h" #include "image_manager.h" +#include "image_view_manager.h" #include "sampler_manager.h" namespace systems { class ResourceManager { + + struct CombinedImageViewManager + { + ImageManager *m_ImageManager; + ImageViewManager *m_ViewManager; + + CombinedImageViewManager(ImageManager *imageManager, ImageViewManager *viewManager) + : m_ImageManager{imageManager} + , m_ViewManager{viewManager} + { + } + + template + [[nodiscard]] Ref + CreateTexture2D(const Texture2DCreateInfo &createInfo) + { + auto handle = CreateTexture2D(createInfo); + return CastView(handle); + } + + template + [[nodiscard]] Ref + CreateTextureCube(const TextureCubeCreateInfo &createInfo) + { + auto handle = CreateTextureCube(createInfo); + return CastView(handle); + } + + [[nodiscard]] Ref CreateTexture2D(const Texture2DCreateInfo &createInfo) const + { + return m_ViewManager->CreateView({ + .m_Image = CastImage(m_ImageManager->CreateTexture2D(createInfo)), + .m_Name = createInfo.m_Name, + .m_ViewType = vk::ImageViewType::e2D, + .m_AspectMask = vk::ImageAspectFlagBits::eColor, + }); + } + [[nodiscard]] Ref CreateTextureCube(const TextureCubeCreateInfo &createInfo) const + { + return m_ViewManager->CreateView({ + .m_Image = m_ImageManager->CreateTextureCube(createInfo), + .m_Name = createInfo.m_Name, + .m_ViewType = vk::ImageViewType::eCube, + .m_AspectMask = vk::ImageAspectFlagBits::eColor, + }); + } + + [[nodiscard]] Ref CreateAttachment(const AttachmentCreateInfo &createInfo) const + { + return m_ViewManager->CreateView({ + .m_Image = m_ImageManager->CreateAttachment(createInfo), + .m_Name = createInfo.m_Name, + .m_ViewType = vk::ImageViewType::e2D, + .m_AspectMask = vk::ImageAspectFlagBits::eColor, + }); + } + + [[nodiscard]] Ref CreateDepthStencilImage(const DepthStencilImageCreateInfo &createInfo) const + { + return m_ViewManager->CreateView({ + .m_Image = m_ImageManager->CreateDepthStencilImage(createInfo), + .m_Name = createInfo.m_Name, + .m_ViewType = vk::ImageViewType::e2D, + .m_AspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, + }); + } + }; + BufferManager m_Buffers; ImageManager m_Images; SamplerManager m_Samplers; + ImageViewManager m_Views; + CombinedImageViewManager m_CombinedImageViews; public: - ResourceManager(const Device *device, u32 maxBufferCount, u32 maxImageCount, u32 maxSamplerCount) + ResourceManager(const Device *device, u32 maxBufferCount, u32 maxImageCount, u32 maxSamplerCount, u32 maxViewCount) : m_Buffers{device, maxBufferCount} , m_Images{device, maxImageCount} , m_Samplers{device, maxSamplerCount} + , m_Views{device, maxViewCount} + , m_CombinedImageViews{&m_Images, &m_Views} { } @@ -39,12 +112,23 @@ class ResourceManager return m_Images; } + ImageViewManager & + Views() + { + return m_Views; + } + SamplerManager & Samplers() { return m_Samplers; } + CombinedImageViewManager &CombinedImageViews() + { + return m_CombinedImageViews; + } + ~ResourceManager() = default; PIN_MEMORY(ResourceManager); diff --git a/aster/src/aster/core/image.cpp b/aster/src/aster/core/image.cpp index ce40071..fa73cb5 100644 --- a/aster/src/aster/core/image.cpp +++ b/aster/src/aster/core/image.cpp @@ -13,10 +13,16 @@ Image::Destroy() if (!IsValid()) return; - m_Device->m_Device.destroy(m_View, nullptr); vmaDestroyImage(m_Device->m_Allocator, Take(m_Image), m_Allocation); m_Flags_ = 0; } + +void +Image::DestroyView(const vk::ImageView imageView) const +{ + m_Device->m_Device.destroy(imageView, nullptr); +} + // //void //Texture::Init(const Device *device, const vk::Extent2D extent, vk::Format imageFormat, const bool isMipMapped, diff --git a/aster/src/aster/core/sampler.cpp b/aster/src/aster/core/sampler.cpp index f656c42..416a602 100644 --- a/aster/src/aster/core/sampler.cpp +++ b/aster/src/aster/core/sampler.cpp @@ -8,17 +8,18 @@ #include "core/device.h" void -Sampler::Destroy(const Device *device) +Sampler::Destroy() { if (!IsValid()) return; - device->m_Device.destroy(Take(m_Sampler), nullptr); + m_Device->m_Device.destroy(Take(m_Sampler), nullptr); } void Sampler::Init(const Device *device, const vk::SamplerCreateInfo &samplerCreateInfo, cstr name) { + m_Device = device; const auto result = device->m_Device.createSampler(&samplerCreateInfo, nullptr, &m_Sampler); ERROR_IF(Failed(result), "Could not create a sampler {}", name ? name : "") THEN_ABORT(-1); } \ No newline at end of file diff --git a/aster/src/aster/systems/CMakeLists.txt b/aster/src/aster/systems/CMakeLists.txt index 7bafe6a..8de503c 100644 --- a/aster/src/aster/systems/CMakeLists.txt +++ b/aster/src/aster/systems/CMakeLists.txt @@ -7,5 +7,6 @@ PRIVATE "manager.cpp" "buffer_manager.cpp" "image_manager.cpp" +"image_view_manager.cpp" "sampler_manager.cpp" "commit_manager.cpp") diff --git a/aster/src/aster/systems/commit_manager.cpp b/aster/src/aster/systems/commit_manager.cpp index 96d69e6..00881d0 100644 --- a/aster/src/aster/systems/commit_manager.cpp +++ b/aster/src/aster/systems/commit_manager.cpp @@ -7,6 +7,7 @@ #include "EASTL/array.h" #include "core/device.h" +#include "core/image_view.h" #define AbortIfFailed(RESULT) \ do \ @@ -174,8 +175,8 @@ CommitManager::CommitBuffer(const Ref &buffer) return commit; } -ResId -CommitManager::CommitStorageImage(const Ref &image) +ResId +CommitManager::CommitStorageImage(const Ref &image) { auto [commit, isNew] = m_StorageImages.Create(image); if (!isNew) @@ -198,14 +199,14 @@ CommitManager::CommitStorageImage(const Ref &image) return commit; } -ResId -CommitManager::CommitTexture(const Ref &handle) +ResId +CommitManager::CommitTexture(const Ref &handle) { return CommitTexture(handle, m_DefaultSampler); } -ResId -CommitManager::CommitTexture(const Ref &image, const Ref &sampler) +ResId +CommitManager::CommitTexture(const Ref &image, const Ref &sampler) { auto [commit, isNew] = m_Images.Create(image); if (!isNew) diff --git a/aster/src/aster/systems/image_manager.cpp b/aster/src/aster/systems/image_manager.cpp index 51fde05..4b90566 100644 --- a/aster/src/aster/systems/image_manager.cpp +++ b/aster/src/aster/systems/image_manager.cpp @@ -40,30 +40,11 @@ ImageManager::CreateTexture2D(const Texture2DCreateInfo &createInfo) &allocationCreateInfo, &image, &allocation, nullptr)); ERROR_IF(Failed(result), "Could not allocate image {}. Cause: {}", createInfo.m_Name, result) THEN_ABORT(result); - vk::ImageView view; - const vk::ImageViewCreateInfo imageViewCreateInfo = { - .image = image, - .viewType = vk::ImageViewType::e2D, - .format = imageCreateInfo.format, - .components = {}, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = imageCreateInfo.mipLevels, - .baseArrayLayer = 0, - .layerCount = imageCreateInfo.arrayLayers, - }, - }; - result = m_Device->m_Device.createImageView(&imageViewCreateInfo, nullptr, &view); - ERROR_IF(Failed(result), "Could not create image view {}. Cause: {}", createInfo.m_Name, result) - THEN_ABORT(result); - auto object = Alloc(); object->m_Image = image; - object->m_View = view; object->m_Allocation = allocation; object->m_Extent = imageCreateInfo.extent; + object->m_Format = imageCreateInfo.format; object->m_LayerCount = Cast(imageCreateInfo.arrayLayers); object->m_MipLevels = Cast(imageCreateInfo.mipLevels); object->m_Flags_ = {}; @@ -92,30 +73,11 @@ ImageManager::CreateTextureCube(const TextureCubeCreateInfo &createInfo) &allocationCreateInfo, &image, &allocation, nullptr)); ERROR_IF(Failed(result), "Could not allocate image {}. Cause: {}", createInfo.m_Name, result) THEN_ABORT(result); - vk::ImageView view; - const vk::ImageViewCreateInfo imageViewCreateInfo = { - .image = image, - .viewType = vk::ImageViewType::eCube, - .format = imageCreateInfo.format, - .components = {}, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = imageCreateInfo.mipLevels, - .baseArrayLayer = 0, - .layerCount = imageCreateInfo.arrayLayers, - }, - }; - result = m_Device->m_Device.createImageView(&imageViewCreateInfo, nullptr, &view); - ERROR_IF(Failed(result), "Could not create image view {}. Cause: {}", createInfo.m_Name, result) - THEN_ABORT(result); - auto object = Alloc(); object->m_Image = image; - object->m_View = view; object->m_Allocation = allocation; object->m_Extent = imageCreateInfo.extent; + object->m_Format = imageCreateInfo.format; object->m_LayerCount = Cast(imageCreateInfo.arrayLayers); object->m_MipLevels = Cast(imageCreateInfo.mipLevels); object->m_Flags_ = Image::CUBE_BIT; @@ -144,30 +106,11 @@ ImageManager::CreateAttachment(const AttachmentCreateInfo &createInfo) &allocationCreateInfo, &image, &allocation, nullptr)); ERROR_IF(Failed(result), "Could not allocate image {}. Cause: {}", createInfo.m_Name, result) THEN_ABORT(result); - vk::ImageView view; - const vk::ImageViewCreateInfo imageViewCreateInfo = { - .image = image, - .viewType = vk::ImageViewType::e2D, - .format = imageCreateInfo.format, - .components = {}, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = imageCreateInfo.mipLevels, - .baseArrayLayer = 0, - .layerCount = imageCreateInfo.arrayLayers, - }, - }; - result = m_Device->m_Device.createImageView(&imageViewCreateInfo, nullptr, &view); - ERROR_IF(Failed(result), "Could not create image view {}. Cause: {}", createInfo.m_Name, result) - THEN_ABORT(result); - auto object = Alloc(); object->m_Image = image; - object->m_View = view; object->m_Allocation = allocation; object->m_Extent = imageCreateInfo.extent; + object->m_Format = imageCreateInfo.format; object->m_LayerCount = Cast(imageCreateInfo.arrayLayers); object->m_MipLevels = Cast(imageCreateInfo.mipLevels); @@ -191,30 +134,11 @@ ImageManager::CreateDepthStencilImage(const DepthStencilImageCreateInfo &createI &allocationCreateInfo, &image, &allocation, nullptr)); ERROR_IF(Failed(result), "Could not allocate image {}. Cause: {}", createInfo.m_Name, result) THEN_ABORT(result); - vk::ImageView view; - const vk::ImageViewCreateInfo imageViewCreateInfo = { - .image = image, - .viewType = vk::ImageViewType::e2D, - .format = imageCreateInfo.format, - .components = {}, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, - .baseMipLevel = 0, - .levelCount = imageCreateInfo.mipLevels, - .baseArrayLayer = 0, - .layerCount = imageCreateInfo.arrayLayers, - }, - }; - result = m_Device->m_Device.createImageView(&imageViewCreateInfo, nullptr, &view); - ERROR_IF(Failed(result), "Could not create image view {}. Cause: {}", createInfo.m_Name, result) - THEN_ABORT(result); - auto object = Alloc(); object->m_Image = image; - object->m_View = view; object->m_Allocation = allocation; object->m_Extent = imageCreateInfo.extent; + object->m_Format = imageCreateInfo.format; object->m_LayerCount = Cast(imageCreateInfo.arrayLayers); object->m_MipLevels = Cast(imageCreateInfo.mipLevels); diff --git a/aster/src/aster/systems/image_view_manager.cpp b/aster/src/aster/systems/image_view_manager.cpp new file mode 100644 index 0000000..8a7a4e8 --- /dev/null +++ b/aster/src/aster/systems/image_view_manager.cpp @@ -0,0 +1,47 @@ +// ============================================= +// Aster: image_view_manager.cpp +// Copyright (c) 2020-2025 Anish Bhobe +// ============================================= + +#include "systems/image_view_manager.h" + +#include "core/device.h" + +using namespace systems; + +ImageViewManager::ImageViewManager(const Device *device, const u32 maxCount) + : Manager{device, maxCount} +{ +} + +Ref +ImageViewManager::CreateView(const ViewCreateInfo<> &createInfo) +{ + const auto layerCount = createInfo.GetLayerCount(); + const auto mipCount = createInfo.GetMipLevelCount(); + ERROR_IF((createInfo.m_BaseLayer + layerCount) > createInfo.m_Image->m_LayerCount, + "Invalid Layer Access") + THEN_ABORT(-1); + ERROR_IF((createInfo.m_BaseMipLevel + mipCount) > createInfo.m_Image->m_MipLevels, + "Invalid Mip Level Access") + THEN_ABORT(-1); + + vk::ImageView view; + const auto imageViewCreateInfo = Cast(createInfo); + auto result = m_Device->m_Device.createImageView(&imageViewCreateInfo, nullptr, &view); + ERROR_IF(Failed(result), "Could not create image view {}. Cause: {}", createInfo.m_Name, result) + THEN_ABORT(result); + + m_Device->SetName(view, createInfo.m_Name); + + auto object = Alloc(); + object->m_Image = createInfo.m_Image; + object->m_View = view; + object->m_Extent = createInfo.m_Image->m_Extent; + object->m_BaseLayer = createInfo.m_BaseLayer; + object->m_LayerCount = layerCount; + object->m_BaseMipLevel = createInfo.m_BaseMipLevel; + object->m_MipLevelCount = mipCount; + + return object; +} \ No newline at end of file diff --git a/samples/02_box/box.cpp b/samples/02_box/box.cpp index 9f8bdde..4e88987 100644 --- a/samples/02_box/box.cpp +++ b/samples/02_box/box.cpp @@ -23,6 +23,8 @@ #include "aster/systems/commit_manager.h" #include "frame.h" #include "stb_image.h" +#include "aster/systems/image_view_manager.h" +#include "aster/systems/resource_manager.h" #include @@ -129,11 +131,9 @@ main(int, char **) vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0); Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"}; - systems::BufferManager bufferManager{&device, 12}; - systems::ImageManager imageManager{&device, 12}; - systems::SamplerManager samplerManager{&device, 1}; + systems::ResourceManager resourceManager{&device, 12, 12, 1, 12}; - systems::CommitManager commitManager{&device, 12, 12, 12, samplerManager.CreateSampler({})}; + systems::CommitManager commitManager{&device, 12, 12, 12, resourceManager.Samplers().CreateSampler({})}; Pipeline pipeline = CreatePipeline(&commitManager, &swapchain); @@ -211,10 +211,10 @@ main(int, char **) assert(loaded); INFO("Image {}x{} : {} channels", imageFile.m_Width, imageFile.m_Height, imageFile.m_NumChannels); - auto vbo = bufferManager.CreateStorageBuffer(vertices.size() * sizeof vertices[0], "Vertex Buffer"); + auto vbo = resourceManager.Buffers().CreateStorageBuffer(vertices.size() * sizeof vertices[0], "Vertex Buffer"); vbo->Write(0, vertices.size() * sizeof vertices[0], vertices.data()); - auto crate = imageManager + auto crate = resourceManager.CombinedImageViews() .CreateTexture2D({ .m_Format = vk::Format::eR8G8B8A8Srgb, .m_Extent = {imageFile.m_Width, imageFile.m_Height}, @@ -236,7 +236,7 @@ main(int, char **) .newLayout = vk::ImageLayout::eTransferDstOptimal, .srcQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family, - .image = crate->m_Image, + .image = crate->GetImage(), .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -260,7 +260,7 @@ main(int, char **) .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, .srcQueueFamilyIndex = queueAllocation.m_Family, .dstQueueFamilyIndex = queueAllocation.m_Family, - .image = crate->m_Image, + .image = crate->GetImage(), .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -298,7 +298,7 @@ main(int, char **) .imageOffset = {}, .imageExtent = {imageFile.m_Width, imageFile.m_Height, 1}, }; - copyBuffer.copyBufferToImage(imageStaging.m_Buffer, crate->m_Image, vk::ImageLayout::eTransferDstOptimal, 1, + copyBuffer.copyBufferToImage(imageStaging.m_Buffer, crate->GetImage(), vk::ImageLayout::eTransferDstOptimal, 1, &imageCopy); copyBuffer.pipelineBarrier2(&imageReadyToReadDependency); @@ -322,7 +322,7 @@ main(int, char **) imageStaging.Destroy(); } - auto ubo = bufferManager.CreateStorageBuffer(sizeof camera, "Camera UBO"); + auto ubo = resourceManager.Buffers().CreateStorageBuffer(sizeof camera, "Camera UBO"); ubo->Write(0, sizeof camera, &camera); // Persistent variables @@ -389,13 +389,13 @@ main(int, char **) }; FrameManager frameManager = {&device, queueAllocation.m_Family, MAX_FRAMES_IN_FLIGHT}; - eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> depthImages; + eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> depthImages; - auto initDepthImages = [&depthImages, &frameManager, &imageManager](const vk::Extent2D extent) { + auto initDepthImages = [&depthImages, &frameManager, &resourceManager](const vk::Extent2D extent) { for (u32 i = 0; i < frameManager.m_FramesInFlight; ++i) { depthImages.push_back( - imageManager.CreateDepthStencilImage({.m_Extent = extent, .m_Name = "Depth"})); + resourceManager.CombinedImageViews().CreateDepthStencilImage({.m_Extent = extent, .m_Name = "Depth"})); } }; @@ -411,13 +411,13 @@ main(int, char **) { systems::ResId m_Camera; systems::ResId m_VertexBuffer; - systems::ResId m_Texture; + systems::ResId m_Texture; }; PCB pcb = { .m_Camera = commitManager.CommitBuffer(ubo), .m_VertexBuffer = commitManager.CommitBuffer(vbo), - .m_Texture = commitManager.CommitTexture(systems::CastImage(crate)), + .m_Texture = commitManager.CommitTexture(crate), }; Time::Init(); diff --git a/samples/03_model_render/asset_loader.cpp b/samples/03_model_render/asset_loader.cpp index e12fe82..d053670 100644 --- a/samples/03_model_render/asset_loader.cpp +++ b/samples/03_model_render/asset_loader.cpp @@ -20,8 +20,8 @@ #include -#include #include +#include #if defined(LoadImage) #undef LoadImage @@ -53,7 +53,7 @@ VectorToVec3(const std::vector &vec) return {vec[0], vec[1], vec[2]}; } -Ref +Ref AssetLoader::LoadHdrImage(cstr path, cstr name) const { i32 x, y, nChannels; @@ -65,7 +65,7 @@ AssetLoader::LoadHdrImage(cstr path, cstr name) const u32 width = Cast(x); u32 height = Cast(y); - auto texture = m_ResourceManager->Images().CreateTexture2D({ + auto texture = m_ResourceManager->CombinedImageViews().CreateTexture2D({ .m_Format = vk::Format::eR32G32B32A32Sfloat, .m_Extent = {width, height}, .m_Name = path, @@ -99,7 +99,7 @@ AssetLoader::LoadHdrImage(cstr path, cstr name) const }; vk::CopyBufferToImageInfo2 stagingInfo = { .srcBuffer = stagingBuffer.m_Buffer, - .dstImage = texture->m_Image, + .dstImage = texture->GetImage(), .dstImageLayout = vk::ImageLayout::eTransferDstOptimal, .regionCount = 1, .pRegions = ©Region, @@ -113,7 +113,7 @@ AssetLoader::LoadHdrImage(cstr path, cstr name) const .newLayout = vk::ImageLayout::eTransferDstOptimal, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = texture->m_Image, + .image = texture->GetImage(), .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -138,7 +138,7 @@ AssetLoader::LoadHdrImage(cstr path, cstr name) const .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, .srcQueueFamilyIndex = m_TransferQueueIndex, .dstQueueFamilyIndex = m_GraphicsQueueIndex, - .image = texture->m_Image, + .image = texture->GetImage(), .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -369,9 +369,11 @@ GenerateMipMaps(vk::CommandBuffer commandBuffer, const Ref &texture, vk #endif } -std::tuple, Ref> -AssetLoader::LoadImageToGpu(tinygltf::Image* image, bool isSrgb) const +std::tuple, Ref> +AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const { + // TODO(Something not loading properly). + assert(image->component == 4); assert(image->height > 0 && image->width > 0); @@ -447,7 +449,6 @@ AssetLoader::LoadImageToGpu(tinygltf::Image* image, bool isSrgb) const .layerCount = 1, }, }; - ; vk::DependencyInfo postStagingDependency = { .imageMemoryBarrierCount = 1, @@ -489,7 +490,10 @@ AssetLoader::LoadImageToGpu(tinygltf::Image* image, bool isSrgb) const m_CommandBuffer.endDebugUtilsLabelEXT(); #endif - return {m_CommitManager->CommitTexture(texture), stagingBuffer}; + auto textureView = m_ResourceManager->Views().CreateView( + {.m_Image = texture, .m_Name = image->name.data(), .m_AspectMask = vk::ImageAspectFlagBits::eColor}); + + return {m_CommitManager->CommitTexture(textureView), stagingBuffer}; } Model @@ -538,15 +542,16 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name) eastl::vector> stagingBuffers; - eastl::hash_map> textureHandleMap; + eastl::hash_map> textureHandleMap; eastl::vector materials; systems::ResId materialsHandle = systems::ResId::Null(); if (!model.materials.empty()) { - auto getTextureHandle = [this, &textureHandleMap, &stagingBuffers, - &model](i32 index, const bool isSrgb) -> systems::ResId { + // TODO("Something broken on load here."); + auto getTextureHandle = [this, &textureHandleMap, &model](i32 index, + const bool isSrgb) -> systems::ResId { if (index < 0) { return systems::NullId{}; @@ -557,7 +562,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name) } auto *image = &model.images[index]; - auto [handle , staging] = LoadImageToGpu(image, isSrgb); + auto [handle, staging] = LoadImageToGpu(image, isSrgb); textureHandleMap.emplace(index, handle); return handle; }; @@ -585,10 +590,11 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name) auto materialStaging = m_ResourceManager->Buffers().CreateStagingBuffer(materialsByteSize); materialStaging->Write(0, materialsByteSize, materials.data()); - stagingBuffers.emplace_back(std::move(materialStaging)); vk::BufferCopy bufferCopy = {.srcOffset = 0, .dstOffset = 0, .size = materialsByteSize}; m_CommandBuffer.copyBuffer(materialStaging->m_Buffer, materialsBuffer->m_Buffer, 1, &bufferCopy); + + stagingBuffers.emplace_back(std::move(materialStaging)); } // TODO: Mesh reordering based on nodes AND OR meshoptimizer @@ -936,7 +942,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name) .m_NodeHandle = nodeHandle, }; - eastl::vector> textureHandles; + eastl::vector> textureHandles; textureHandles.reserve(textureHandleMap.size()); for (auto &[key, val] : textureHandleMap) @@ -949,7 +955,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name) }; } -Model::Model(systems::CommitManager *resourceManager, eastl::vector> &textureHandles, +Model::Model(systems::CommitManager *resourceManager, eastl::vector> &textureHandles, Nodes &&nodes, Ref nodeBuffer, ModelHandles &handles, Ref indexBuffer, const eastl::vector &meshPrimitives) : m_ResourceManager(resourceManager) diff --git a/samples/03_model_render/asset_loader.h b/samples/03_model_render/asset_loader.h index e3035b6..c5adf60 100644 --- a/samples/03_model_render/asset_loader.h +++ b/samples/03_model_render/asset_loader.h @@ -12,6 +12,7 @@ #include "nodes.h" #include "tiny_gltf.h" #include "aster/systems/image_manager.h" +#include "aster/systems/image_view_manager.h" #include "aster/systems/resource.h" namespace systems @@ -49,11 +50,11 @@ struct Material vec3 m_EmissionFactor; // 12 28 f32 m_MetalFactor; // 04 32 f32 m_RoughFactor; // 04 36 - systems::ResId m_AlbedoTex; // 04 40 - systems::ResId m_NormalTex; // 04 44 - systems::ResId m_MetalRoughTex; // 04 48 - systems::ResId m_OcclusionTex; // 04 52 - systems::ResId m_EmissionTex; // 04 56 + systems::ResId m_AlbedoTex; // 04 40 + systems::ResId m_NormalTex; // 04 44 + systems::ResId m_MetalRoughTex; // 04 48 + systems::ResId m_OcclusionTex; // 04 52 + systems::ResId m_EmissionTex; // 04 56 }; struct VertexData @@ -68,7 +69,7 @@ struct Model { systems::CommitManager *m_ResourceManager; - eastl::vector> m_TextureHandles; + eastl::vector> m_TextureHandles; Nodes m_Nodes; struct ModelHandles @@ -87,7 +88,7 @@ struct Model void SetModelTransform(const mat4 &transform); void Update(); - Model(systems::CommitManager *resourceManager, eastl::vector> &textureHandles, Nodes &&nodes, Ref nodeBuffer, + Model(systems::CommitManager *resourceManager, eastl::vector> &textureHandles, Nodes &&nodes, Ref nodeBuffer, ModelHandles &handles, Ref indexBuffer, const eastl::vector &meshPrimitives); ~Model() = default; @@ -109,8 +110,8 @@ struct AssetLoader u32 m_TransferQueueIndex; u32 m_GraphicsQueueIndex; - Ref LoadHdrImage(cstr path, cstr name = nullptr) const; - std::tuple, Ref> LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const; + Ref LoadHdrImage(cstr path, cstr name = nullptr) const; + std::tuple, Ref> LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const; Model LoadModelToGpu(cstr path, cstr name = nullptr); constexpr static auto ANormal = "NORMAL"; @@ -134,17 +135,28 @@ struct AssetLoader }; void -GenerateMipMaps(vk::CommandBuffer commandBuffer, const Ref &texture, vk::ImageLayout initialLayout, +GenerateMipMaps(vk::CommandBuffer commandBuffer, const Ref &textureView, vk::ImageLayout initialLayout, vk::ImageLayout finalLayout, vk::PipelineStageFlags2 prevStage, vk::PipelineStageFlags2 finalStage); -void GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageRef auto& texture, vk::ImageLayout initialLayout, - vk::ImageLayout finalLayout, - vk::PipelineStageFlags2 prevStage = vk::PipelineStageFlagBits2::eAllCommands, - vk::PipelineStageFlags2 finalStage = vk::PipelineStageFlagBits2::eAllCommands) +void +GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageRef auto &texture, vk::ImageLayout initialLayout, + vk::ImageLayout finalLayout, + vk::PipelineStageFlags2 prevStage = vk::PipelineStageFlagBits2::eAllCommands, + vk::PipelineStageFlags2 finalStage = vk::PipelineStageFlagBits2::eAllCommands) { GenerateMipMaps(commandBuffer, systems::CastImage(texture), initialLayout, finalLayout, prevStage, finalStage); } +void +GenerateMipMaps(vk::CommandBuffer commandBuffer, concepts::SampledImageViewRef auto &texture, vk::ImageLayout initialLayout, + vk::ImageLayout finalLayout, + vk::PipelineStageFlags2 prevStage = vk::PipelineStageFlagBits2::eAllCommands, + vk::PipelineStageFlags2 finalStage = vk::PipelineStageFlagBits2::eAllCommands) +{ + GenerateMipMaps(commandBuffer, systems::CastImage(texture->m_Image), initialLayout, finalLayout, prevStage, + finalStage); +} + static_assert(concepts::SampledImageRef>); \ No newline at end of file diff --git a/samples/03_model_render/ibl_helpers.cpp b/samples/03_model_render/ibl_helpers.cpp index 816c8bb..6d79274 100644 --- a/samples/03_model_render/ibl_helpers.cpp +++ b/samples/03_model_render/ibl_helpers.cpp @@ -25,13 +25,13 @@ constexpr cstr BRDF_LUT_SHADER_FILE = "shader/brdf_lut.cs.hlsl.spv"; Environment CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 cubeSide, - systems::ResId hdrEnv, const cstr name) + systems::ResId hdrEnv, const cstr name) { systems::ResourceManager *resourceManager = assetLoader->m_ResourceManager; systems::CommitManager *commitManager = assetLoader->m_CommitManager; const Device *pDevice = commitManager->m_Device; - auto skybox = resourceManager->Images().CreateTextureCube({ + auto skybox = resourceManager->CombinedImageViews().CreateTextureCube({ .m_Format = vk::Format::eR16G16B16A16Sfloat, .m_Side = cubeSide, .m_Name = "Skybox", @@ -43,7 +43,7 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 auto skyboxHandle = commitManager->CommitTexture(skybox); auto skyboxStorageHandle = commitManager->CommitStorageImage(skybox); - auto diffuseIrradiance = resourceManager->Images().CreateTextureCube({ + auto diffuseIrradiance = resourceManager->CombinedImageViews().CreateTextureCube({ .m_Format = vk::Format::eR16G16B16A16Sfloat, .m_Side = 64, .m_Name = "Diffuse Irradiance", @@ -54,7 +54,7 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 auto diffuseIrradianceHandle = commitManager->CommitTexture(diffuseIrradiance); auto diffuseIrradianceStorageHandle = commitManager->CommitStorageImage(diffuseIrradiance); - auto prefilterCube = resourceManager->Images().CreateTextureCube({ + auto prefilterCube = resourceManager->CombinedImageViews().CreateTextureCube({ .m_Format = vk::Format::eR16G16B16A16Sfloat, .m_Side = cubeSide, .m_Name = "Prefilter", @@ -64,37 +64,28 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 }); auto prefilterHandle = commitManager->CommitTexture(prefilterCube); // This stores the original view for us. constexpr u32 prefilterMipCountMax = 6; - eastl::fixed_vector, prefilterMipCountMax> prefilterStorageHandles; + eastl::fixed_vector, prefilterMipCountMax> prefilterStorageHandles; // All non-owning copies. - for (u32 mipLevel = 0; mipLevel < prefilterMipCountMax; ++mipLevel) + for (u8 mipLevel = 0; mipLevel < prefilterMipCountMax; ++mipLevel) { - vk::ImageViewCreateInfo imageViewCreateInfo = { - .image = prefilterCube->m_Image, - .viewType = vk::ImageViewType::eCube, - .format = vk::Format::eR16G16B16A16Sfloat, - .components = vk::ComponentMapping{}, - .subresourceRange = - { - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = mipLevel, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 6, - }, - }; - AbortIfFailed(pDevice->m_Device.createImageView(&imageViewCreateInfo, nullptr, &prefilterCube->m_View)); - // TODO: FIXME: This is an issue. This needs copying but we don't do that anymore. - // The views need to be separated from the images. - TODO("This is bad"); - prefilterStorageHandles.push_back(commitManager->CommitStorageImage(prefilterCube)); + auto view = resourceManager->Views().CreateView({ + .m_Image = systems::CastImage(prefilterCube->m_Image), + .m_ViewType = vk::ImageViewType::eCube, + .m_AspectMask = vk::ImageAspectFlagBits::eColor, + .m_MipLevelCount = 1, + .m_LayerCount = 6, + .m_BaseMipLevel = mipLevel, + .m_BaseLayer = 0, + }); + prefilterStorageHandles.push_back(commitManager->CommitStorageImage(view)); } - auto brdfLut = resourceManager->Images().CreateTexture2D({.m_Format = vk::Format::eR16G16Sfloat, - .m_Extent = {512, 512}, - .m_Name = "BRDF LUT", - .m_IsSampled = true, - .m_IsMipMapped = true, - .m_IsStorage = true}); + auto brdfLut = resourceManager->CombinedImageViews().CreateTexture2D({.m_Format = vk::Format::eR16G16Sfloat, + .m_Extent = {512, 512}, + .m_Name = "BRDF LUT", + .m_IsSampled = true, + .m_IsMipMapped = true, + .m_IsStorage = true}); auto brdfLutSampler = resourceManager->Samplers().CreateSampler({ .m_AddressModeU = vk::SamplerAddressMode::eClampToEdge, @@ -132,10 +123,10 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 .subresourceRange = cubeSubresRange, }; eastl::fixed_vector readyToWriteBarriers(4, readyToWriteBarrierTemplate); - readyToWriteBarriers[0].image = skybox->m_Image; - readyToWriteBarriers[1].image = diffuseIrradiance->m_Image; - readyToWriteBarriers[2].image = prefilterCube->m_Image; - readyToWriteBarriers[3].image = brdfLut->m_Image; + readyToWriteBarriers[0].image = skybox->GetImage(); + readyToWriteBarriers[1].image = diffuseIrradiance->GetImage(); + readyToWriteBarriers[2].image = prefilterCube->GetImage(); + readyToWriteBarriers[3].image = brdfLut->GetImage(); readyToWriteBarriers[3].subresourceRange = lutSubresRange; vk::DependencyInfo readyToWriteDependency = { @@ -154,16 +145,16 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 .subresourceRange = cubeSubresRange, }; auto skyboxToSampleBarrier = readyToSampleBarrierTemplate; - skyboxToSampleBarrier.image = skybox->m_Image; + skyboxToSampleBarrier.image = skybox->GetImage(); auto diffIrrToSampleBarrier = readyToSampleBarrierTemplate; - diffIrrToSampleBarrier.image = diffuseIrradiance->m_Image; + diffIrrToSampleBarrier.image = diffuseIrradiance->GetImage(); auto prefilterToSampleBarrier = readyToSampleBarrierTemplate; - prefilterToSampleBarrier.image = prefilterCube->m_Image; + prefilterToSampleBarrier.image = prefilterCube->GetImage(); auto brdfToSampleBarrier = readyToSampleBarrierTemplate; - prefilterToSampleBarrier.image = brdfLut->m_Image; + prefilterToSampleBarrier.image = brdfLut->GetImage(); prefilterToSampleBarrier.subresourceRange = lutSubresRange; vk::DependencyInfo skyboxToSampleDependency = { @@ -187,27 +178,27 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 struct SkyboxPushConstants { - systems::ResId m_HdrEnvHandle; - systems::ResId m_OutputTexture; + systems::ResId m_HdrEnvHandle; + systems::ResId m_OutputTexture; u32 m_CubeSide; }; struct DiffuseIrradiancePushConstants { - systems::ResId m_SkyboxHandle; - systems::ResId m_OutputTexture; + systems::ResId m_SkyboxHandle; + systems::ResId m_OutputTexture; u32 m_CubeSide; }; struct PrefilterPushConstants { - systems::ResId m_SkyboxHandle; - systems::ResId m_OutputTexture; + systems::ResId m_SkyboxHandle; + systems::ResId m_OutputTexture; u32 m_CubeSide; f32 m_Roughness; u32 m_EnvSide; }; struct BrdfLutPushConstants { - systems::ResId m_OutputTexture; + systems::ResId m_OutputTexture; }; #pragma region Pipeline Creation etc @@ -394,12 +385,6 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 AbortIfFailed(pDevice->m_Device.resetCommandPool(assetLoader->m_CommandPool, {})); skybox = {}; - for (auto &_ : prefilterStorageHandles) - { - StorageTextureCube st; - // TODO: This needs fixing - pDevice->m_Device.destroy(st.m_View, nullptr); - } for (auto &pipeline : pipelines) { pDevice->m_Device.destroy(pipeline, nullptr); diff --git a/samples/03_model_render/ibl_helpers.h b/samples/03_model_render/ibl_helpers.h index 7e0bdba..c878f74 100644 --- a/samples/03_model_render/ibl_helpers.h +++ b/samples/03_model_render/ibl_helpers.h @@ -8,6 +8,7 @@ #include "aster/aster.h" #include "aster/systems/resource.h" #include "aster/core/image.h" +#include "aster/core/image_view.h" struct Pipeline; struct Texture; @@ -16,11 +17,11 @@ struct AssetLoader; struct Environment { - systems::ResId m_Skybox; - systems::ResId m_Diffuse; - systems::ResId m_Prefilter; - systems::ResId m_BrdfLut; + systems::ResId m_Skybox; + systems::ResId m_Diffuse; + systems::ResId m_Prefilter; + systems::ResId m_BrdfLut; }; -Environment CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, u32 cubeSide, systems::ResId hdrEnv, +Environment CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, u32 cubeSide, systems::ResId hdrEnv, cstr name = nullptr); \ No newline at end of file diff --git a/samples/03_model_render/model_render.cpp b/samples/03_model_render/model_render.cpp index 0585552..acbca70 100644 --- a/samples/03_model_render/model_render.cpp +++ b/samples/03_model_render/model_render.cpp @@ -178,7 +178,7 @@ main(int, char **) vk::Queue graphicsQueue = device.GetQueue(queueAllocation.m_Family, 0); Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"}; - systems::ResourceManager resourceManager = {&device, 1000, 1000, 10}; + systems::ResourceManager resourceManager = {&device, 1000, 1000, 10, 1000}; systems::CommitManager commitManager = {&device, 1000, 1000, 1000, resourceManager.Samplers().CreateSampler({})}; AssetLoader assetLoader = {&resourceManager, &commitManager, graphicsQueue, queueAllocation.m_Family, @@ -383,19 +383,19 @@ main(int, char **) }; FrameManager frameManager = {&device, queueAllocation.m_Family, MAX_FRAMES_IN_FLIGHT}; - eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> depthImages; - eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> attachmentImages; + eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> depthImages; + eastl::fixed_vector, MAX_FRAMES_IN_FLIGHT> attachmentImages; for (u32 index = 0; index < frameManager.m_FramesInFlight; ++index) { auto name = fmt::format("Depth Frame{}", index); - depthImages.emplace_back(resourceManager.Images().CreateDepthStencilImage({ + depthImages.emplace_back(resourceManager.CombinedImageViews().CreateDepthStencilImage({ .m_Extent = internalResolution, .m_Name = name.c_str(), })); name = fmt::format("Attachment0 Frame{}", index); - attachmentImages.emplace_back(resourceManager.Images().CreateAttachment({ + attachmentImages.emplace_back(resourceManager.CombinedImageViews().CreateAttachment({ .m_Format = attachmentFormat, .m_Extent = internalResolution, .m_Name = name.c_str(), @@ -530,13 +530,13 @@ main(int, char **) currentAttachment->m_Extent.height != internalResolution.height) { auto name = fmt::format("Depth Frame{}", currentFrame->m_FrameIdx); - currentDepthImage = resourceManager.Images().CreateDepthStencilImage({ + currentDepthImage = resourceManager.CombinedImageViews().CreateDepthStencilImage({ .m_Extent = internalResolution, .m_Name = name.c_str(), }); name = fmt::format("Attachment0 Frame{}", currentFrame->m_FrameIdx); - currentAttachment = resourceManager.Images().CreateAttachment({ + currentAttachment = resourceManager.CombinedImageViews().CreateAttachment({ .m_Format = attachmentFormat, .m_Extent = internalResolution, .m_Name = name.c_str(), @@ -544,7 +544,7 @@ main(int, char **) } vk::ImageView currentDepthImageView = currentDepthImage->m_View; - vk::Image currentImage = currentAttachment->m_Image; + vk::Image currentImage = currentAttachment->m_Image->m_Image; vk::ImageView currentImageView = currentAttachment->m_View; preRenderBarrier.image = currentImage;