| 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
Bytes | DebugGetHeapUsage () const override
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()

Bytes impeller::AllocatorVK::DebugGetHeapUsage | ( |  | ) | const
| override virtual

Reimplemented from impeller::Allocator.

Definition at line 543 of file allocator_vk.cc.

543 {
544 auto count = memory_properties_.memoryHeapCount;
545 std::vector<VmaBudget> budgets(count);
546 vmaGetHeapBudgets(allocator_.get(), budgets.data());
547 size_t total_usage = 0;
548 for (auto i = 0u; i < count; i++) {
549 const VmaBudget& budget = budgets[i];
550 total_usage += budget.usage;
551 }
552 return Bytes{static_cast<double>(total_usage)};
553 }

## ◆ 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 178 of file allocator_vk.cc.

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

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 204 of file allocator_vk.cc.

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

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:414
impeller::TextureUsage::kRenderTarget
@ kRenderTarget
impeller::StorageMode::kHostVisible
@ kHostVisible
impeller::StorageMode::kDeviceTransient
@ kDeviceTransient
impeller::StorageMode::kDevicePrivate
@ kDevicePrivate
impeller::TextureUsage::kShaderRead
@ kShaderRead
impeller::Bytes
AllocationSize< 1u > Bytes
Definition: allocation_size.h:151