7 #include "flutter/fml/build_config.h"
8 #include "flutter/fml/logging.h"
20 if (@available(ios 13.0, tvos 13.0, macos 10.15, *)) {
21 return [device supportsFamily:MTLGPUFamilyApple2];
27 return [device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v1];
39 if (@available(ios 13.0, tvos 13.0, macOS 10.15, *)) {
40 return [device hasUnifiedMemory];
60 if (@available(macOS 10.15, iOS 13, tvOS 13, *)) {
61 if ([device supportsFamily:MTLGPUFamilyApple3] ||
62 [device supportsFamily:MTLGPUFamilyMacCatalyst1] ||
63 [device supportsFamily:MTLGPUFamilyMac1]) {
64 return {16384, 16384};
69 if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1] ||
70 [device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
71 return {16384, 16384};
75 return {16384, 16384};
82 #ifdef FML_OS_IOS_SIMULATOR
85 if (@available(macOS 10.15, iOS 13, tvOS 13, *)) {
86 return [device supportsFamily:MTLGPUFamilyApple8];
93 : device_(device), allocator_label_(
std::move(label)) {
105 AllocatorMTL::~AllocatorMTL() =
default;
107 bool AllocatorMTL::IsValid()
const {
112 bool supports_memoryless_targets,
115 case StorageMode::kHostVisible:
117 return MTLResourceStorageModeShared;
120 return MTLResourceStorageModeShared;
122 return MTLResourceStorageModeManaged;
125 case StorageMode::kDevicePrivate:
126 return MTLResourceStorageModePrivate;
127 case StorageMode::kDeviceTransient:
128 if (supports_memoryless_targets) {
130 if (@available(macOS 11.0, *)) {
131 return MTLResourceStorageModeMemoryless;
133 return MTLResourceStorageModePrivate;
136 return MTLResourceStorageModePrivate;
144 bool supports_memoryless_targets,
147 case StorageMode::kHostVisible:
149 return MTLStorageModeShared;
152 return MTLStorageModeShared;
154 return MTLStorageModeManaged;
157 case StorageMode::kDevicePrivate:
158 return MTLStorageModePrivate;
159 case StorageMode::kDeviceTransient:
160 if (supports_memoryless_targets) {
162 if (@available(macOS 11.0, *)) {
163 return MTLStorageModeMemoryless;
165 return MTLStorageModePrivate;
168 return MTLStorageModePrivate;
175 std::shared_ptr<DeviceBuffer> AllocatorMTL::OnCreateBuffer(
176 const DeviceBufferDescriptor& desc) {
178 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
180 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
182 auto buffer = [device_ newBufferWithLength:desc.size
183 options:resource_options];
187 return std::shared_ptr<DeviceBufferMTL>(
new DeviceBufferMTL(desc,
193 std::shared_ptr<Texture> AllocatorMTL::OnCreateTexture(
194 const TextureDescriptor& desc) {
201 if (!mtl_texture_desc) {
207 desc.storage_mode, supports_memoryless_targets_, supports_uma_);
209 if (@available(macOS 12.5, ios 15.0, *)) {
210 if (desc.compression_type == CompressionType::kLossy &&
212 mtl_texture_desc.compressionType = MTLTextureCompressionTypeLossy;
216 auto texture = [device_ newTextureWithDescriptor:mtl_texture_desc];
220 return std::make_shared<TextureMTL>(desc, texture);
223 uint16_t AllocatorMTL::MinimumBytesPerRow(
PixelFormat format)
const {
224 return static_cast<uint16_t
>([device_
228 ISize AllocatorMTL::GetMaxTextureSizeSupported()
const {
229 return max_texture_supported_;