xref: /third_party/skia/dm/DMGpuTestProcs.cpp (revision cb93a386)
1/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "tests/Test.h"
9
10#include "include/gpu/GrDirectContext.h"
11
12#ifdef SK_GRAPHITE_ENABLED
13#include "experimental/graphite/include/Context.h"
14#include "tools/graphite/ContextFactory.h"
15#endif
16
17using sk_gpu_test::GrContextFactory;
18using sk_gpu_test::GLTestContext;
19using sk_gpu_test::ContextInfo;
20
21namespace skiatest {
22
23bool IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
24    return GrBackendApi::kOpenGL == GrContextFactory::ContextTypeBackend(type);
25}
26bool IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type) {
27    return GrBackendApi::kVulkan == GrContextFactory::ContextTypeBackend(type);
28}
29bool IsMetalContextType(sk_gpu_test::GrContextFactory::ContextType type) {
30    return GrBackendApi::kMetal == GrContextFactory::ContextTypeBackend(type);
31}
32bool IsDirect3DContextType(sk_gpu_test::GrContextFactory::ContextType type) {
33    return GrBackendApi::kDirect3D == GrContextFactory::ContextTypeBackend(type);
34}
35bool IsDawnContextType(sk_gpu_test::GrContextFactory::ContextType type) {
36    return GrBackendApi::kDawn == GrContextFactory::ContextTypeBackend(type);
37}
38bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
39    return IsGLContextType(type) && GrContextFactory::IsRenderingContext(type);
40}
41bool IsMockContextType(sk_gpu_test::GrContextFactory::ContextType type) {
42    return type == GrContextFactory::kMock_ContextType;
43}
44
45void RunWithGPUTestContexts(GrContextTestFn* test, GrContextTypeFilterFn* contextTypeFilter,
46                            Reporter* reporter, const GrContextOptions& options) {
47#if defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_WIN) || defined(SK_BUILD_FOR_MAC)
48    static constexpr auto kNativeGLType = GrContextFactory::kGL_ContextType;
49#else
50    static constexpr auto kNativeGLType = GrContextFactory::kGLES_ContextType;
51#endif
52
53    for (int typeInt = 0; typeInt < GrContextFactory::kContextTypeCnt; ++typeInt) {
54        GrContextFactory::ContextType contextType = (GrContextFactory::ContextType) typeInt;
55        // Use "native" instead of explicitly trying OpenGL and OpenGL ES. Do not use GLES on
56        // desktop since tests do not account for not fixing http://skbug.com/2809
57        if (contextType == GrContextFactory::kGL_ContextType ||
58            contextType == GrContextFactory::kGLES_ContextType) {
59            if (contextType != kNativeGLType) {
60                continue;
61            }
62        }
63        // We destroy the factory and its associated contexts after each test. This is due to the
64        // fact that the command buffer sits on top of the native GL windowing (cgl, wgl, ...) but
65        // also tracks which of its contexts is current above that API and gets tripped up if the
66        // native windowing API is used directly outside of the command buffer code.
67        GrContextFactory factory(options);
68        ContextInfo ctxInfo = factory.getContextInfo(contextType);
69        if (contextTypeFilter && !(*contextTypeFilter)(contextType)) {
70            continue;
71        }
72
73        ReporterContext ctx(reporter, SkString(GrContextFactory::ContextTypeName(contextType)));
74        if (ctxInfo.directContext()) {
75            (*test)(reporter, ctxInfo);
76            // In case the test changed the current context make sure we move it back before
77            // calling flush.
78            ctxInfo.testContext()->makeCurrent();
79            // Sync so any release/finished procs get called.
80            ctxInfo.directContext()->flushAndSubmit(/*sync*/true);
81        }
82    }
83}
84
85#ifdef SK_GRAPHITE_ENABLED
86
87namespace graphite {
88
89void RunWithGraphiteTestContexts(GraphiteTestFn* test, Reporter* reporter) {
90    ContextFactory factory;
91
92    auto [_, context] = factory.getContextInfo(ContextFactory::ContextType::kMetal);
93    if (!context) {
94        return;
95    }
96
97    (*test)(reporter, context.get());
98}
99
100} // namespace graphite
101
102#endif // SK_GRAPHITE_ENABLED
103
104} // namespace skiatest
105