Files
Vulkan-Samples/framework/core/hpp_image.h
T
2025-09-04 10:54:47 +08:00

167 lines
5.0 KiB
C++

/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 the "License";
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "builder_base.h"
#include "core/allocated.h"
#include "core/vulkan_resource.h"
#include <unordered_set>
namespace vkb
{
namespace core
{
class HPPDevice;
class HPPImageView;
class HPPImage;
using HPPImagePtr = std::unique_ptr<HPPImage>;
struct HPPImageBuilder : public vkb::allocated::BuilderBaseCpp<HPPImageBuilder, vk::ImageCreateInfo>
{
private:
using Parent = vkb::allocated::BuilderBaseCpp<HPPImageBuilder, vk::ImageCreateInfo>;
public:
HPPImageBuilder(vk::Extent3D const &extent) : // Better reasonable defaults than vk::ImageCreateInfo default ctor
Parent(vk::ImageCreateInfo{.imageType = vk::ImageType::e2D, .format = vk::Format::eR8G8B8A8Unorm, .extent = extent, .mipLevels = 1, .arrayLayers = 1})
{
}
HPPImageBuilder(vk::Extent2D const &extent) :
HPPImageBuilder(vk::Extent3D{extent.width, extent.height, 1})
{
}
HPPImageBuilder(uint32_t width, uint32_t height = 1, uint32_t depth = 1) :
HPPImageBuilder(vk::Extent3D{width, height, depth})
{
}
HPPImageBuilder &with_format(vk::Format format)
{
create_info.format = format;
return *this;
}
HPPImageBuilder &with_image_type(vk::ImageType type)
{
create_info.imageType = type;
return *this;
}
HPPImageBuilder &with_array_layers(uint32_t layers)
{
create_info.arrayLayers = layers;
return *this;
}
HPPImageBuilder &with_mip_levels(uint32_t levels)
{
create_info.mipLevels = levels;
return *this;
}
HPPImageBuilder &with_sample_count(vk::SampleCountFlagBits sample_count)
{
create_info.samples = sample_count;
return *this;
}
HPPImageBuilder &with_tiling(vk::ImageTiling tiling)
{
create_info.tiling = tiling;
return *this;
}
HPPImageBuilder &with_usage(vk::ImageUsageFlags usage)
{
create_info.usage = usage;
return *this;
}
HPPImageBuilder &with_flags(vk::ImageCreateFlags flags)
{
create_info.flags = flags;
return *this;
}
HPPImage build(vkb::core::DeviceCpp &device) const;
HPPImagePtr build_unique(vkb::core::DeviceCpp &device) const;
};
class HPPImage : public vkb::allocated::AllocatedCpp<vk::Image>
{
public:
HPPImage(vkb::core::DeviceCpp &device,
vk::Image handle,
const vk::Extent3D &extent,
vk::Format format,
vk::ImageUsageFlags image_usage,
vk::SampleCountFlagBits sample_count = vk::SampleCountFlagBits::e1);
//[[deprecated("Use the HPPImageBuilder ctor instead")]]
HPPImage(vkb::core::DeviceCpp &device,
const vk::Extent3D &extent,
vk::Format format,
vk::ImageUsageFlags image_usage,
VmaMemoryUsage memory_usage = VMA_MEMORY_USAGE_AUTO,
vk::SampleCountFlagBits sample_count = vk::SampleCountFlagBits::e1,
uint32_t mip_levels = 1,
uint32_t array_layers = 1,
vk::ImageTiling tiling = vk::ImageTiling::eOptimal,
vk::ImageCreateFlags flags = {},
uint32_t num_queue_families = 0,
const uint32_t *queue_families = nullptr);
HPPImage(vkb::core::DeviceCpp &device,
HPPImageBuilder const &builder);
HPPImage(const HPPImage &) = delete;
HPPImage(HPPImage &&other) noexcept;
~HPPImage();
HPPImage &operator=(const HPPImage &) = delete;
HPPImage &operator=(HPPImage &&) = delete;
/**
* @brief Maps vulkan memory to an host visible address
* @return Pointer to host visible memory
*/
uint8_t *map();
vk::ImageType get_type() const;
const vk::Extent3D &get_extent() const;
vk::Format get_format() const;
vk::SampleCountFlagBits get_sample_count() const;
vk::ImageUsageFlags get_usage() const;
vk::ImageTiling get_tiling() const;
vk::ImageSubresource get_subresource() const;
uint32_t get_array_layer_count() const;
std::unordered_set<vkb::core::HPPImageView *> &get_views();
private:
vk::ImageCreateInfo create_info;
vk::ImageSubresource subresource;
std::unordered_set<vkb::core::HPPImageView *> views; /// HPPImage views referring to this image
};
} // namespace core
} // namespace vkb