/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/gpu/mtl/MtlTestContext.h" #include "include/gpu/GrContextOptions.h" #include "include/gpu/GrDirectContext.h" #include "src/gpu/mtl/GrMtlUtil.h" #ifdef SK_METAL #import namespace { class MtlTestContextImpl : public sk_gpu_test::MtlTestContext { public: static MtlTestContext* Create(MtlTestContext* sharedContext) { GrMtlBackendContext backendContext = {}; if (sharedContext) { MtlTestContextImpl* sharedContextImpl = (MtlTestContextImpl*) sharedContext; backendContext = sharedContextImpl->getMtlBackendContext(); } else { sk_cfp> device; #ifdef SK_BUILD_FOR_MAC sk_cfp>*> availableDevices(MTLCopyAllDevices()); // Choose the non-integrated CPU if available for (id dev in availableDevices.get()) { if (!dev.isLowPower) { device.retain(dev); break; } if (dev.isRemovable) { device.retain(dev); break; } } if (!device) { device.reset(MTLCreateSystemDefaultDevice()); } #else device.reset(MTLCreateSystemDefaultDevice()); #endif backendContext.fDevice.retain((GrMTLHandle)device.get()); sk_cfp> queue([*device newCommandQueue]); backendContext.fQueue.retain((GrMTLHandle)queue.get()); } return new MtlTestContextImpl(backendContext); } ~MtlTestContextImpl() override { this->teardown(); } void testAbandon() override {} void finish() override {} sk_sp makeContext(const GrContextOptions& options) override { return GrDirectContext::MakeMetal(fMtl, options); } private: MtlTestContextImpl(const GrMtlBackendContext& mtl) : INHERITED(mtl) { fFenceSupport = true; } void onPlatformMakeNotCurrent() const override {} void onPlatformMakeCurrent() const override {} std::function onPlatformGetAutoContextRestore() const override { return nullptr; } using INHERITED = sk_gpu_test::MtlTestContext; }; } // anonymous namespace namespace sk_gpu_test { MtlTestContext* CreatePlatformMtlTestContext(MtlTestContext* sharedContext) { return MtlTestContextImpl::Create(sharedContext); } } // namespace sk_gpu_test #endif