• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 using sk_gpu_test::GrContextFactory;
18 using sk_gpu_test::GLTestContext;
19 using sk_gpu_test::ContextInfo;
20 
21 namespace skiatest {
22 
IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type)23 bool IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
24     return GrBackendApi::kOpenGL == GrContextFactory::ContextTypeBackend(type);
25 }
IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type)26 bool IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type) {
27     return GrBackendApi::kVulkan == GrContextFactory::ContextTypeBackend(type);
28 }
IsMetalContextType(sk_gpu_test::GrContextFactory::ContextType type)29 bool IsMetalContextType(sk_gpu_test::GrContextFactory::ContextType type) {
30     return GrBackendApi::kMetal == GrContextFactory::ContextTypeBackend(type);
31 }
IsDirect3DContextType(sk_gpu_test::GrContextFactory::ContextType type)32 bool IsDirect3DContextType(sk_gpu_test::GrContextFactory::ContextType type) {
33     return GrBackendApi::kDirect3D == GrContextFactory::ContextTypeBackend(type);
34 }
IsDawnContextType(sk_gpu_test::GrContextFactory::ContextType type)35 bool IsDawnContextType(sk_gpu_test::GrContextFactory::ContextType type) {
36     return GrBackendApi::kDawn == GrContextFactory::ContextTypeBackend(type);
37 }
IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type)38 bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
39     return IsGLContextType(type) && GrContextFactory::IsRenderingContext(type);
40 }
IsMockContextType(sk_gpu_test::GrContextFactory::ContextType type)41 bool IsMockContextType(sk_gpu_test::GrContextFactory::ContextType type) {
42     return type == GrContextFactory::kMock_ContextType;
43 }
44 
RunWithGPUTestContexts(GrContextTestFn * test,GrContextTypeFilterFn * contextTypeFilter,Reporter * reporter,const GrContextOptions & options)45 void 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 
87 namespace graphite {
88 
RunWithGraphiteTestContexts(GraphiteTestFn * test,Reporter * reporter)89 void 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