58constexpr bool flags_present(T provided_flags, T required_flags) {
59 return (provided_flags & required_flags) == required_flags;
62uint32_t get_memory_type(
63 uint32_t memory_type_bits,
64 vk::MemoryPropertyFlags requested_properties, vk::MemoryPropertyFlags optional_properties,
65 vk::PhysicalDevice gpu)
67 uint32_t possible_memory_type = UINT32_MAX;
68 auto supported_properties = gpu.getMemoryProperties();
69 for (uint32_t i = 0; i < supported_properties.memoryTypeCount; i++) {
71 bool is_type_usable = (1u << i) & memory_type_bits;
72 auto& mem_type = supported_properties.memoryTypes[i];
73 if (flags_present(mem_type.propertyFlags, requested_properties) && is_type_usable) {
74 if (flags_present(mem_type.propertyFlags, optional_properties)) {
77 possible_memory_type = i;
80 if (possible_memory_type != UINT32_MAX) {
81 return possible_memory_type;
83 throw VulkanError{
"No available memory for transfer images found."};
99 vk::FenceCreateInfo fence_info{};
104 vk::Extent2D size, vk::Format format, vk::ImageUsageFlags
usage,
107 vk::ImageTiling tiling;
108 vk::MemoryPropertyFlags requested_properties;
109 vk::MemoryPropertyFlags optional_properties;
111 using MemBits = vk::MemoryPropertyFlagBits;
113 tiling = vk::ImageTiling::eLinear;
114 requested_properties = MemBits::eHostVisible | MemBits::eHostCoherent;
115 optional_properties = MemBits::eHostCached;
118 tiling = vk::ImageTiling::eOptimal;
119 requested_properties = {};
120 optional_properties = MemBits::eDeviceLocal;
127 vk::MemoryPropertyFlags requested_properties, vk::MemoryPropertyFlags optional_properties)
131 this->
access = initial_access;
133 vk::ImageLayout::ePreinitialized :
134 vk::ImageLayout::eUndefined;
135 this->
view =
nullptr;
138 vk::ImageCreateInfo image_info{};
140 .setImageType(vk::ImageType::e2D)
141 .setExtent(vk::Extent3D{
size, 1 })
148 .setSharingMode(vk::SharingMode::eExclusive)
149 .setSamples(vk::SampleCountFlagBits::e1);
150 image = device.createImage(image_info);
152 vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(
image);
155 uint32_t memory_type = get_memory_type(memory_requirements.memoryTypeBits,
156 requested_properties, optional_properties, context.
get_gpu());
158 vk::MemoryAllocateInfo allocInfo{
byte_size , memory_type };
159 memory = device.allocateMemory(allocInfo);
167 vk::ImageViewCreateInfo view_info =
169 view_info.setImage(
image);
171 vk::SamplerYcbcrConversionInfo yCbCr_info{ conversion };
172 view_info.setPNext(conversion ? &yCbCr_info :
nullptr);
173 view = device.createImageView(view_info);
179 device.destroy(
view);
181 device.destroy(
image);
185 device.freeMemory(
memory);
199 if (void_ptr ==
nullptr) {
200 throw VulkanError{
"Image memory cannot be mapped."};
202 ptr =
reinterpret_cast<unsigned char*
>(void_ptr);
204 vk::ImageSubresource subresource{ vk::ImageAspectFlagBits::eColor, 0, 0 };
211 vk::ImageLayout new_layout, vk::AccessFlags new_access_mask,
212 uint32_t src_queue_family_index, uint32_t dst_queue_family_index)
214 vk::ImageMemoryBarrier memory_barrier{};
218 .setNewLayout(new_layout)
220 .setDstAccessMask(new_access_mask)
221 .setSrcQueueFamilyIndex(src_queue_family_index)
222 .setDstQueueFamilyIndex(dst_queue_family_index);
223 memory_barrier.subresourceRange
224 .setAspectMask(vk::ImageAspectFlagBits::eColor)
230 return memory_barrier;
237 img.set_process_function(
nullptr);
void destroy(vk::Device device)
void init(VulkanContext &context, vk::Extent2D size, vk::Format format, vk::ImageUsageFlags usage, vk::AccessFlags initial_access, InitialImageData preinitialised, MemoryLocation memory_location)
vk::ImageMemoryBarrier create_memory_barrier(vk::ImageLayout new_layout, vk::AccessFlags new_access_mask, uint32_t src_queue_family_index=VK_QUEUE_FAMILY_IGNORED, uint32_t dst_queue_family_index=VK_QUEUE_FAMILY_IGNORED)
vk::ImageView get_image_view(vk::Device device, vk::SamplerYcbcrConversion conversion)
void recreate(VulkanContext &context, vulkan_display::ImageDescription description)
vk::Fence is_available_fence
static constexpr uint32_t NO_ID
void init(vk::Device device, uint32_t id)
vulkan_display::ImageDescription image_description
PreprocessFunction preprocess_fun
void destroy(vk::Device device)
vk::PhysicalDevice get_gpu()
vk::Extent2D get_buffer_size(const vulkan_display::ImageDescription &description)
vk::ImageViewCreateInfo default_image_view_create_info(vk::Format format)