| /* |
| * 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 <Metal/Metal.h> |
| |
| 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<id<MTLDevice>> device; |
| #ifdef SK_BUILD_FOR_MAC |
| sk_cfp<NSArray<id <MTLDevice>>*> availableDevices(MTLCopyAllDevices()); |
| // Choose the non-integrated CPU if available |
| for (id<MTLDevice> 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<id<MTLCommandQueue>> 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<GrDirectContext> 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<void()> 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 |