• 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