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 "tools/graphite/mtl/GraphiteMtlTestContext.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/Context.h" 11*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/ContextOptions.h" 12*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/mtl/MtlGraphiteTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/mtl/MtlGraphiteUtils.h" 14*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/ContextOptionsPriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker#include "tools/gpu/ContextType.h" 16*c8dee2aaSAndroid Build Coastguard Worker#include "tools/graphite/TestOptions.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker#import <Metal/Metal.h> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Workernamespace skiatest::graphite { 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<GraphiteTestContext> MtlTestContext::Make() { 23*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<id<MTLDevice>> device; 24*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_BUILD_FOR_MAC 25*c8dee2aaSAndroid Build Coastguard Worker sk_cfp<NSArray<id <MTLDevice>>*> availableDevices(MTLCopyAllDevices()); 26*c8dee2aaSAndroid Build Coastguard Worker // Choose the non-integrated CPU if available 27*c8dee2aaSAndroid Build Coastguard Worker for (id<MTLDevice> dev in availableDevices.get()) { 28*c8dee2aaSAndroid Build Coastguard Worker if (!dev.isLowPower) { 29*c8dee2aaSAndroid Build Coastguard Worker // This retain is necessary because when the NSArray goes away it will delete the 30*c8dee2aaSAndroid Build Coastguard Worker // device entry otherwise. 31*c8dee2aaSAndroid Build Coastguard Worker device.retain(dev); 32*c8dee2aaSAndroid Build Coastguard Worker break; 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker if (dev.isRemovable) { 35*c8dee2aaSAndroid Build Coastguard Worker device.retain(dev); 36*c8dee2aaSAndroid Build Coastguard Worker break; 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker if (!device) { 40*c8dee2aaSAndroid Build Coastguard Worker device.reset(MTLCreateSystemDefaultDevice()); 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker#else 43*c8dee2aaSAndroid Build Coastguard Worker device.reset(MTLCreateSystemDefaultDevice()); 44*c8dee2aaSAndroid Build Coastguard Worker#endif 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::MtlBackendContext backendContext = {}; 47*c8dee2aaSAndroid Build Coastguard Worker backendContext.fDevice.retain(device.get()); 48*c8dee2aaSAndroid Build Coastguard Worker backendContext.fQueue.reset([*device newCommandQueue]); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<GraphiteTestContext>(new MtlTestContext(backendContext)); 51*c8dee2aaSAndroid Build Coastguard Worker} 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Workerskgpu::ContextType MtlTestContext::contextType() { 54*c8dee2aaSAndroid Build Coastguard Worker return skgpu::ContextType::kMetal; 55*c8dee2aaSAndroid Build Coastguard Worker} 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<skgpu::graphite::Context> MtlTestContext::makeContext(const TestOptions& options) { 58*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!options.hasDawnOptions()); 59*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::ContextOptions revisedContextOptions(options.fContextOptions); 60*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::ContextOptionsPriv contextOptionsPriv; 61*c8dee2aaSAndroid Build Coastguard Worker if (!options.fContextOptions.fOptionsPriv) { 62*c8dee2aaSAndroid Build Coastguard Worker revisedContextOptions.fOptionsPriv = &contextOptionsPriv; 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker // Needed to make synchronous readPixels work 65*c8dee2aaSAndroid Build Coastguard Worker revisedContextOptions.fOptionsPriv->fStoreContextRefInRecorder = true; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker return skgpu::graphite::ContextFactory::MakeMetal(fMtl, revisedContextOptions); 68*c8dee2aaSAndroid Build Coastguard Worker} 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker} // namespace skiatest::graphite 71