1*c8dee2aaSAndroid Build Coastguard Worker/* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlSharedContext.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/BackendTexture.h" 11*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/TextureInfo.h" 12*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/Caps.h" 13*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/GlobalCache.h" 14*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/Log.h" 15*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlCommandBuffer.h" 16*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlResourceProvider.h" 17*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/mtl/MtlTexture.h" 18*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/mtl/MtlMemoryAllocatorImpl.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Workernamespace skgpu::graphite { 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Workersk_sp<skgpu::graphite::SharedContext> MtlSharedContext::Make(const MtlBackendContext& context, 23*c8dee2aaSAndroid Build Coastguard Worker const ContextOptions& options) { 24*c8dee2aaSAndroid Build Coastguard Worker if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) { 25*c8dee2aaSAndroid Build Coastguard Worker // no warning needed 26*c8dee2aaSAndroid Build Coastguard Worker } else { 27*c8dee2aaSAndroid Build Coastguard Worker SKGPU_LOG_E("Skia's Graphite backend no longer supports this OS version."); 28*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_BUILD_FOR_IOS 29*c8dee2aaSAndroid Build Coastguard Worker SKGPU_LOG_E("Minimum supported version is iOS/tvOS 13.0."); 30*c8dee2aaSAndroid Build Coastguard Worker#else 31*c8dee2aaSAndroid Build Coastguard Worker SKGPU_LOG_E("Minimum supported version is MacOS 10.15."); 32*c8dee2aaSAndroid Build Coastguard Worker#endif 33*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLDevice>> device = sk_ret_cfp((id<MTLDevice>)(context.fDevice.get())); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<const MtlCaps> caps(new MtlCaps(device.get(), options)); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // TODO: Add memory allocator to context once we figure out synchronization 41*c8dee2aaSAndroid Build Coastguard Worker sk_sp<MtlMemoryAllocator> memoryAllocator = skgpu::MtlMemoryAllocatorImpl::Make(device.get()); 42*c8dee2aaSAndroid Build Coastguard Worker if (!memoryAllocator) { 43*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGFAIL("No supplied Metal memory allocator and unable to create one internally."); 44*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<skgpu::graphite::SharedContext>(new MtlSharedContext(std::move(device), 48*c8dee2aaSAndroid Build Coastguard Worker std::move(memoryAllocator), 49*c8dee2aaSAndroid Build Coastguard Worker std::move(caps))); 50*c8dee2aaSAndroid Build Coastguard Worker} 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard WorkerMtlSharedContext::MtlSharedContext(sk_cfp<id<MTLDevice>> device, 53*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::MtlMemoryAllocator> memoryAllocator, 54*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<const MtlCaps> caps) 55*c8dee2aaSAndroid Build Coastguard Worker : skgpu::graphite::SharedContext(std::move(caps), BackendApi::kMetal) 56*c8dee2aaSAndroid Build Coastguard Worker , fMemoryAllocator(std::move(memoryAllocator)) 57*c8dee2aaSAndroid Build Coastguard Worker , fDevice(std::move(device)) {} 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard WorkerMtlSharedContext::~MtlSharedContext() { 60*c8dee2aaSAndroid Build Coastguard Worker // need to clear out resources before the allocator (if any) is removed 61*c8dee2aaSAndroid Build Coastguard Worker this->globalCache()->deleteResources(); 62*c8dee2aaSAndroid Build Coastguard Worker} 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<ResourceProvider> MtlSharedContext::makeResourceProvider( 65*c8dee2aaSAndroid Build Coastguard Worker SingleOwner* singleOwner, 66*c8dee2aaSAndroid Build Coastguard Worker uint32_t recorderID, 67*c8dee2aaSAndroid Build Coastguard Worker size_t resourceBudget, 68*c8dee2aaSAndroid Build Coastguard Worker bool /* avoidBufferAlloc */) { 69*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<ResourceProvider>(new MtlResourceProvider(this, 70*c8dee2aaSAndroid Build Coastguard Worker singleOwner, 71*c8dee2aaSAndroid Build Coastguard Worker recorderID, 72*c8dee2aaSAndroid Build Coastguard Worker resourceBudget)); 73*c8dee2aaSAndroid Build Coastguard Worker} 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker} // namespace skgpu::graphite 76