1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 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/gpu/mtl/MtlTestContext.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/gpu/GrContextOptions.h" 11cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "src/gpu/mtl/GrMtlUtil.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#ifdef SK_METAL 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#import <Metal/Metal.h> 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cinamespace { 20cb93a386Sopenharmony_ciclass MtlTestContextImpl : public sk_gpu_test::MtlTestContext { 21cb93a386Sopenharmony_cipublic: 22cb93a386Sopenharmony_ci static MtlTestContext* Create(MtlTestContext* sharedContext) { 23cb93a386Sopenharmony_ci GrMtlBackendContext backendContext = {}; 24cb93a386Sopenharmony_ci if (sharedContext) { 25cb93a386Sopenharmony_ci MtlTestContextImpl* sharedContextImpl = (MtlTestContextImpl*) sharedContext; 26cb93a386Sopenharmony_ci backendContext = sharedContextImpl->getMtlBackendContext(); 27cb93a386Sopenharmony_ci } else { 28cb93a386Sopenharmony_ci sk_cfp<id<MTLDevice>> device; 29cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC 30cb93a386Sopenharmony_ci sk_cfp<NSArray<id <MTLDevice>>*> availableDevices(MTLCopyAllDevices()); 31cb93a386Sopenharmony_ci // Choose the non-integrated CPU if available 32cb93a386Sopenharmony_ci for (id<MTLDevice> dev in availableDevices.get()) { 33cb93a386Sopenharmony_ci if (!dev.isLowPower) { 34cb93a386Sopenharmony_ci device.retain(dev); 35cb93a386Sopenharmony_ci break; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci if (dev.isRemovable) { 38cb93a386Sopenharmony_ci device.retain(dev); 39cb93a386Sopenharmony_ci break; 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci if (!device) { 43cb93a386Sopenharmony_ci device.reset(MTLCreateSystemDefaultDevice()); 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci#else 46cb93a386Sopenharmony_ci device.reset(MTLCreateSystemDefaultDevice()); 47cb93a386Sopenharmony_ci#endif 48cb93a386Sopenharmony_ci backendContext.fDevice.retain((GrMTLHandle)device.get()); 49cb93a386Sopenharmony_ci sk_cfp<id<MTLCommandQueue>> queue([*device newCommandQueue]); 50cb93a386Sopenharmony_ci backendContext.fQueue.retain((GrMTLHandle)queue.get()); 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci return new MtlTestContextImpl(backendContext); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci ~MtlTestContextImpl() override { this->teardown(); } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci void testAbandon() override {} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci void finish() override {} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci sk_sp<GrDirectContext> makeContext(const GrContextOptions& options) override { 63cb93a386Sopenharmony_ci return GrDirectContext::MakeMetal(fMtl, options); 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ciprivate: 67cb93a386Sopenharmony_ci MtlTestContextImpl(const GrMtlBackendContext& mtl) 68cb93a386Sopenharmony_ci : INHERITED(mtl) { 69cb93a386Sopenharmony_ci fFenceSupport = true; 70cb93a386Sopenharmony_ci } 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci void onPlatformMakeNotCurrent() const override {} 73cb93a386Sopenharmony_ci void onPlatformMakeCurrent() const override {} 74cb93a386Sopenharmony_ci std::function<void()> onPlatformGetAutoContextRestore() const override { return nullptr; } 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci using INHERITED = sk_gpu_test::MtlTestContext; 77cb93a386Sopenharmony_ci}; 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci} // anonymous namespace 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_cinamespace sk_gpu_test { 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ciMtlTestContext* CreatePlatformMtlTestContext(MtlTestContext* sharedContext) { 84cb93a386Sopenharmony_ci return MtlTestContextImpl::Create(sharedContext); 85cb93a386Sopenharmony_ci} 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci} // namespace sk_gpu_test 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci#endif 91