xref: /aosp_15_r20/external/skia/tools/graphite/mtl/GraphiteMtlTestContext.mm (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker/*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker#include "tools/graphite/mtl/GraphiteMtlTestContext.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/Context.h"
11*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/ContextOptions.h"
12*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/mtl/MtlGraphiteTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker#include "include/gpu/graphite/mtl/MtlGraphiteUtils.h"
14*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/graphite/ContextOptionsPriv.h"
15*c8dee2aaSAndroid Build Coastguard Worker#include "tools/gpu/ContextType.h"
16*c8dee2aaSAndroid Build Coastguard Worker#include "tools/graphite/TestOptions.h"
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker#import <Metal/Metal.h>
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Workernamespace skiatest::graphite {
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<GraphiteTestContext> MtlTestContext::Make() {
23*c8dee2aaSAndroid Build Coastguard Worker    sk_cfp<id<MTLDevice>> device;
24*c8dee2aaSAndroid Build Coastguard Worker#ifdef SK_BUILD_FOR_MAC
25*c8dee2aaSAndroid Build Coastguard Worker    sk_cfp<NSArray<id <MTLDevice>>*> availableDevices(MTLCopyAllDevices());
26*c8dee2aaSAndroid Build Coastguard Worker    // Choose the non-integrated CPU if available
27*c8dee2aaSAndroid Build Coastguard Worker    for (id<MTLDevice> dev in availableDevices.get()) {
28*c8dee2aaSAndroid Build Coastguard Worker        if (!dev.isLowPower) {
29*c8dee2aaSAndroid Build Coastguard Worker            // This retain is necessary because when the NSArray goes away it will delete the
30*c8dee2aaSAndroid Build Coastguard Worker            // device entry otherwise.
31*c8dee2aaSAndroid Build Coastguard Worker            device.retain(dev);
32*c8dee2aaSAndroid Build Coastguard Worker            break;
33*c8dee2aaSAndroid Build Coastguard Worker        }
34*c8dee2aaSAndroid Build Coastguard Worker        if (dev.isRemovable) {
35*c8dee2aaSAndroid Build Coastguard Worker            device.retain(dev);
36*c8dee2aaSAndroid Build Coastguard Worker            break;
37*c8dee2aaSAndroid Build Coastguard Worker        }
38*c8dee2aaSAndroid Build Coastguard Worker    }
39*c8dee2aaSAndroid Build Coastguard Worker    if (!device) {
40*c8dee2aaSAndroid Build Coastguard Worker        device.reset(MTLCreateSystemDefaultDevice());
41*c8dee2aaSAndroid Build Coastguard Worker    }
42*c8dee2aaSAndroid Build Coastguard Worker#else
43*c8dee2aaSAndroid Build Coastguard Worker    device.reset(MTLCreateSystemDefaultDevice());
44*c8dee2aaSAndroid Build Coastguard Worker#endif
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker    skgpu::graphite::MtlBackendContext backendContext = {};
47*c8dee2aaSAndroid Build Coastguard Worker    backendContext.fDevice.retain(device.get());
48*c8dee2aaSAndroid Build Coastguard Worker    backendContext.fQueue.reset([*device newCommandQueue]);
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker    return std::unique_ptr<GraphiteTestContext>(new MtlTestContext(backendContext));
51*c8dee2aaSAndroid Build Coastguard Worker}
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Workerskgpu::ContextType MtlTestContext::contextType() {
54*c8dee2aaSAndroid Build Coastguard Worker    return skgpu::ContextType::kMetal;
55*c8dee2aaSAndroid Build Coastguard Worker}
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<skgpu::graphite::Context> MtlTestContext::makeContext(const TestOptions& options) {
58*c8dee2aaSAndroid Build Coastguard Worker    SkASSERT(!options.hasDawnOptions());
59*c8dee2aaSAndroid Build Coastguard Worker    skgpu::graphite::ContextOptions revisedContextOptions(options.fContextOptions);
60*c8dee2aaSAndroid Build Coastguard Worker    skgpu::graphite::ContextOptionsPriv contextOptionsPriv;
61*c8dee2aaSAndroid Build Coastguard Worker    if (!options.fContextOptions.fOptionsPriv) {
62*c8dee2aaSAndroid Build Coastguard Worker        revisedContextOptions.fOptionsPriv = &contextOptionsPriv;
63*c8dee2aaSAndroid Build Coastguard Worker    }
64*c8dee2aaSAndroid Build Coastguard Worker    // Needed to make synchronous readPixels work
65*c8dee2aaSAndroid Build Coastguard Worker    revisedContextOptions.fOptionsPriv->fStoreContextRefInRecorder = true;
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Worker    return skgpu::graphite::ContextFactory::MakeMetal(fMtl, revisedContextOptions);
68*c8dee2aaSAndroid Build Coastguard Worker}
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker}  // namespace skiatest::graphite
71