| Flutter Impeller |

Public Member Functions | Static Public Member Functions | Friends | List of all members
impeller::AllocatorVK Class Referencefinal

`#include <allocator_vk.h>`

Inheritance diagram for impeller::AllocatorVK:

## Public Member Functions
| ~AllocatorVK () override
size_t | DebugGetHeapUsage () const
Public Member Functions inherited from impeller::Allocator
virtual | ~Allocator ()
bool | IsValid () const
std::shared_ptr< DeviceBuffer > | CreateBuffer (const DeviceBufferDescriptor &desc)
std::shared_ptr< Texture > | CreateTexture (const TextureDescriptor &desc)
virtual uint16_t | MinimumBytesPerRow (PixelFormat format) const
| Minimum value for `row_bytes` on a Texture. The row bytes parameter of that method must be aligned to this value. More...
std::shared_ptr< DeviceBuffer > | CreateBufferWithCopy (const uint8_t *buffer, size_t length)
std::shared_ptr< DeviceBuffer > | CreateBufferWithCopy (const fml::Mapping &mapping)

## Static Public Member Functions
static int32_t | FindMemoryTypeIndex (uint32_t memory_type_bits_requirement, vk::PhysicalDeviceMemoryProperties &memory_properties)
| Select a matching memory type for the given [memory_type_bits_requirement], or -1 if none is found. More...
static vk::ImageUsageFlags | ToVKImageUsageFlags (PixelFormat format, TextureUsageMask usage, StorageMode mode, bool supports_memoryless_textures)

## Friends
class | ContextVK

## Additional Inherited Members
Protected Member Functions inherited from impeller::Allocator
| Allocator ()

## Detailed Description

Definition at line 19 of file allocator_vk.h.

## Constructor & Destructor Documentation

## ◆ ~AllocatorVK()

impeller::AllocatorVK::~AllocatorVK | ( |  | ) |
| override default

## Member Function Documentation

## ◆ DebugGetHeapUsage()

size_t impeller::AllocatorVK::DebugGetHeapUsage | ( |  | ) | const

Definition at line 512 of file allocator_vk.cc.

512 {
513 auto count = memory_properties_.memoryHeapCount;
514 std::vector<VmaBudget> budgets(count);
515 vmaGetHeapBudgets(allocator_.get(), budgets.data());
516 size_t total_usage = 0;
517 for (auto i = 0u; i < count; i++) {
518 const VmaBudget& budget = budgets[i];
519 total_usage += budget.usage;
520 }
521 // Convert bytes to MB.
522 total_usage *= 1e-6;
523 return total_usage;
524 }

## ◆ FindMemoryTypeIndex()

int32_t impeller::AllocatorVK::FindMemoryTypeIndex | ( | uint32_t | memory_type_bits_requirement,
|  | vk::PhysicalDeviceMemoryProperties & | memory_properties
| ) |  |
| static

Select a matching memory type for the given [memory_type_bits_requirement], or -1 if none is found.

This only returns memory types with deviceLocal allocations.

Definition at line 173 of file allocator_vk.cc.

175 {
176 int32_t type_index = -1;
177 vk::MemoryPropertyFlagBits required_properties =
178 vk::MemoryPropertyFlagBits::eDeviceLocal;
179
180 const uint32_t memory_count = memory_properties.memoryTypeCount;
181 for (uint32_t memory_index = 0; memory_index < memory_count; ++memory_index) {
182 const uint32_t memory_type_bits = (1 << memory_index);
183 const bool is_required_memory_type =
184 memory_type_bits_requirement & memory_type_bits;
185
186 const auto properties =
187 memory_properties.memoryTypes[memory_index].propertyFlags;
188 const bool has_required_properties =
189 (properties & required_properties) == required_properties;
190
191 if (is_required_memory_type && has_required_properties) {
192 return static_cast<int32_t>(memory_index);
193 }
194 }
195
196 return type_index;
197 }

Referenced by impeller::ImportVKDeviceMemoryFromAndroidHarwareBuffer(), and impeller::testing::TEST().

## ◆ ToVKImageUsageFlags()

vk::ImageUsageFlags impeller::AllocatorVK::ToVKImageUsageFlags | ( | PixelFormat | format,
|  | TextureUsageMask | usage,
|  | StorageMode | mode,
|  | bool | supports_memoryless_textures
| ) |  |
| static

Definition at line 199 of file allocator_vk.cc.

203 {
204 vk::ImageUsageFlags vk_usage;
205
206 switch (mode) {
207 case StorageMode::kHostVisible:
208 case StorageMode::kDevicePrivate:
209 break;
210 case StorageMode::kDeviceTransient:
211 if (supports_memoryless_textures) {
212 vk_usage |= vk::ImageUsageFlagBits::eTransientAttachment;
213 }
214 break;
215 }
216
217 if (usage & TextureUsage::kRenderTarget) {
218 if (PixelFormatIsDepthStencil(format)) {
219 vk_usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
220 } else {
221 vk_usage |= vk::ImageUsageFlagBits::eColorAttachment;
222 vk_usage |= vk::ImageUsageFlagBits::eInputAttachment;
223 }
224 }
225
226 if (usage & TextureUsage::kShaderRead) {
227 vk_usage |= vk::ImageUsageFlagBits::eSampled;
228 }
229
230 if (usage & TextureUsage::kShaderWrite) {
231 vk_usage |= vk::ImageUsageFlagBits::eStorage;
232 }
233
234 if (mode != StorageMode::kDeviceTransient) {
235 // Add transfer usage flags to support blit passes only if image isn't
236 // device transient.
237 vk_usage |= vk::ImageUsageFlagBits::eTransferSrc |
238 vk::ImageUsageFlagBits::eTransferDst;
239 }
240
241 return vk_usage;
242 }

References impeller::PixelFormatIsDepthStencil().

Referenced by impeller::testing::TEST().

## Friends And Related Function Documentation

## ◆ ContextVK

friend class ContextVK
| friend

Definition at line 43 of file allocator_vk.h.

The documentation for this class was generated from the following files:

- impeller/renderer/backend/vulkan/allocator_vk.h
- impeller/renderer/backend/vulkan/allocator_vk.cc

impeller::TextureUsage::kShaderWrite
@ kShaderWrite
impeller::PixelFormatIsDepthStencil
constexpr bool PixelFormatIsDepthStencil(PixelFormat format)
Definition: formats_vk.h:392
impeller::TextureUsage::kRenderTarget
@ kRenderTarget
impeller::StorageMode::kHostVisible
@ kHostVisible
impeller::StorageMode::kDeviceTransient
@ kDeviceTransient
impeller::StorageMode::kDevicePrivate
@ kDevicePrivate
impeller::TextureUsage::kShaderRead
@ kShaderRead