skia2/tools/gpu/mtl/MtlTestContext.mm
Jim Van Verth 351c9b53d6 Switch to using GrMtlBackendContext for GrDirectContext creation.
Makes the Metal backend more consistent with the other backends,
and allows new init parameters to be added without significantly
changing API.

Added updated sk_cf_obj because I needed some of its functionality.

Bug: skia:10804
Change-Id: I6f1dd1c03ddc4c4b702ea75eff14bc0f98ab5ad2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/334426
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
2020-11-12 21:03:51 +00:00

91 lines
2.5 KiB
Plaintext

/*
* 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 {
id<MTLDevice> device;
#ifdef SK_BUILD_FOR_MAC
NSArray<id <MTLDevice>>* availableDevices = MTLCopyAllDevices();
// Choose the non-integrated CPU if available
for (id<MTLDevice> dev in availableDevices) {
if (!dev.isLowPower) {
device = dev;
break;
}
if (dev.isRemovable) {
device = dev;
break;
}
}
if (!device) {
device = MTLCreateSystemDefaultDevice();
}
#else
device = MTLCreateSystemDefaultDevice();
#endif
backendContext.fDevice.retain((__bridge GrMTLHandle)device);
id<MTLCommandQueue> queue = [device newCommandQueue];
backendContext.fQueue.retain((__bridge GrMTLHandle)queue);
}
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