7 #include "flutter/fml/build_config.h"
8 #include "flutter/fml/logging.h"
19 if (@available(ios 13.0, tvos 13.0, macos 10.15, *)) {
20 return [device supportsFamily:MTLGPUFamilyApple2];
26 return [device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v1];
38 if (@available(ios 13.0, tvos 13.0, macOS 10.15, *)) {
39 return [device hasUnifiedMemory];
59 if (@available(macOS 10.15, iOS 13, tvOS 13, *)) {
60 if ([device supportsFamily:MTLGPUFamilyApple3] ||
61 [device supportsFamily:MTLGPUFamilyMacCatalyst1] ||
62 [device supportsFamily:MTLGPUFamilyMac1]) {
63 return {16384, 16384};
68 if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1] ||
69 [device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
70 return {16384, 16384};
74 return {16384, 16384};
81 #ifdef FML_OS_IOS_SIMULATOR
84 if (@available(macOS 10.15, iOS 13, tvOS 13, *)) {
85 return [device supportsFamily:MTLGPUFamilyApple8];
92 : device_(device), allocator_label_(
std::move(label)) {
104 AllocatorMTL::~AllocatorMTL() =
default;
106 bool AllocatorMTL::IsValid()
const {
111 bool supports_memoryless_targets,
114 case StorageMode::kHostVisible:
116 return MTLResourceStorageModeShared;
119 return MTLResourceStorageModeShared;
121 return MTLResourceStorageModeManaged;
124 case StorageMode::kDevicePrivate:
125 return MTLResourceStorageModePrivate;
126 case StorageMode::kDeviceTransient:
127 if (supports_memoryless_targets) {
129 if (@available(macOS 11.0, *)) {
130 return MTLResourceStorageModeMemoryless;
132 return MTLResourceStorageModePrivate;
135 return MTLResourceStorageModePrivate;
143 bool supports_memoryless_targets,
146 case StorageMode::kHostVisible:
148 return MTLStorageModeShared;
151 return MTLStorageModeShared;
153 return MTLStorageModeManaged;
156 case StorageMode::kDevicePrivate:
157 return MTLStorageModePrivate;
158 case StorageMode::kDeviceTransient:
159 if (supports_memoryless_targets) {
161 if (@available(macOS 11.0, *)) {
162 return MTLStorageModeMemoryless;
164 return MTLStorageModePrivate;
167 return MTLStorageModePrivate;
174 std::shared_ptr<DeviceBuffer> AllocatorMTL::OnCreateBuffer(
175 const DeviceBufferDescriptor& desc) {
177 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
179 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
181 auto buffer = [device_ newBufferWithLength:desc.size
182 options:resource_options];
186 return std::shared_ptr<DeviceBufferMTL>(
new DeviceBufferMTL(desc,
192 std::shared_ptr<Texture> AllocatorMTL::OnCreateTexture(
193 const TextureDescriptor& desc) {
200 if (!mtl_texture_desc) {
206 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
208 if (@available(macOS 12.5, ios 15.0, *)) {
209 if (desc.compression_type == CompressionType::kLossy &&
211 mtl_texture_desc.compressionType = MTLTextureCompressionTypeLossy;
215 auto texture = [device_ newTextureWithDescriptor:mtl_texture_desc];
219 return TextureMTL::Create(desc, texture);
222 uint16_t AllocatorMTL::MinimumBytesPerRow(
PixelFormat format)
const {
223 return static_cast<uint16_t
>([device_
227 ISize AllocatorMTL::GetMaxTextureSizeSupported()
const {
228 return max_texture_supported_;