1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "tools/graphite/mtl/GraphiteMtlTestContext.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/include/Context.h" 11cb93a386Sopenharmony_ci#include "experimental/graphite/include/mtl/MtlTypes.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#ifdef SK_METAL 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#import <Metal/Metal.h> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cinamespace skiatest::graphite::mtl { 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cistd::unique_ptr<GraphiteTestContext> TestContext::Make() { 20cb93a386Sopenharmony_ci sk_cfp<id<MTLDevice>> device; 21cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC 22cb93a386Sopenharmony_ci sk_cfp<NSArray<id <MTLDevice>>*> availableDevices(MTLCopyAllDevices()); 23cb93a386Sopenharmony_ci // Choose the non-integrated CPU if available 24cb93a386Sopenharmony_ci for (id<MTLDevice> dev in availableDevices.get()) { 25cb93a386Sopenharmony_ci if (!dev.isLowPower) { 26cb93a386Sopenharmony_ci // This retain is necessary because when the NSArray goes away it will delete the 27cb93a386Sopenharmony_ci // device entry otherwise. 28cb93a386Sopenharmony_ci device.retain(dev); 29cb93a386Sopenharmony_ci break; 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci if (dev.isRemovable) { 32cb93a386Sopenharmony_ci device.retain(dev); 33cb93a386Sopenharmony_ci break; 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci if (!device) { 37cb93a386Sopenharmony_ci device.reset(MTLCreateSystemDefaultDevice()); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci#else 40cb93a386Sopenharmony_ci device.reset(MTLCreateSystemDefaultDevice()); 41cb93a386Sopenharmony_ci#endif 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci skgpu::mtl::BackendContext backendContext = {}; 44cb93a386Sopenharmony_ci backendContext.fDevice.retain(device.get()); 45cb93a386Sopenharmony_ci backendContext.fQueue.reset([*device newCommandQueue]); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci return std::unique_ptr<GraphiteTestContext>(new TestContext(backendContext)); 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cisk_sp<skgpu::Context> TestContext::makeContext() { 51cb93a386Sopenharmony_ci return skgpu::Context::MakeMetal(fMtl); 52cb93a386Sopenharmony_ci} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci} // namespace skiatest::graphite::mtl 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci#endif // SK_METAL 57