1*c8dee2aaSAndroid Build Coastguard Worker 2*c8dee2aaSAndroid Build Coastguard Worker /* 3*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 4*c8dee2aaSAndroid Build Coastguard Worker * 5*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker */ 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GLTestContext_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GLTestContext_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLInterface.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLUtil.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/TestContext.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test { 16*c8dee2aaSAndroid Build Coastguard Worker /** 17*c8dee2aaSAndroid Build Coastguard Worker * An offscreen OpenGL context. Provides a GrGLInterface struct of function pointers for the context 18*c8dee2aaSAndroid Build Coastguard Worker * This class is intended for Skia's internal testing needs and not for general use. 19*c8dee2aaSAndroid Build Coastguard Worker * When SK_GL is not defined the GrGLInterface will always be nullptr. 20*c8dee2aaSAndroid Build Coastguard Worker */ 21*c8dee2aaSAndroid Build Coastguard Worker class GLTestContext : public TestContext { 22*c8dee2aaSAndroid Build Coastguard Worker public: 23*c8dee2aaSAndroid Build Coastguard Worker ~GLTestContext() override; 24*c8dee2aaSAndroid Build Coastguard Worker backend()25*c8dee2aaSAndroid Build Coastguard Worker GrBackendApi backend() override { return GrBackendApi::kOpenGL; } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** Does this represent a successfully created GL context? */ 28*c8dee2aaSAndroid Build Coastguard Worker bool isValid() const; 29*c8dee2aaSAndroid Build Coastguard Worker gl()30*c8dee2aaSAndroid Build Coastguard Worker const GrGLInterface* gl() const { return fGLInterface.get(); } 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** Used for testing EGLImage integration. Take a GL_TEXTURE_2D and wraps it in an EGL Image */ texture2DToEGLImage(GrGLuint)33*c8dee2aaSAndroid Build Coastguard Worker virtual GrEGLImage texture2DToEGLImage(GrGLuint /*texID*/) const { return nullptr; } 34*c8dee2aaSAndroid Build Coastguard Worker destroyEGLImage(GrEGLImage)35*c8dee2aaSAndroid Build Coastguard Worker virtual void destroyEGLImage(GrEGLImage) const { } 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker /** 38*c8dee2aaSAndroid Build Coastguard Worker * Used for testing EGLImage integration. Takes a EGLImage and wraps it in a 39*c8dee2aaSAndroid Build Coastguard Worker * GL_TEXTURE_EXTERNAL_OES. 40*c8dee2aaSAndroid Build Coastguard Worker */ eglImageToExternalTexture(GrEGLImage)41*c8dee2aaSAndroid Build Coastguard Worker virtual GrGLuint eglImageToExternalTexture(GrEGLImage) const { return 0; } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker void testAbandon() override; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker void overrideVersion(const char* version, const char* shadingLanguageVersion); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker /** 48*c8dee2aaSAndroid Build Coastguard Worker * Creates a new GL context of the same type and makes the returned context current 49*c8dee2aaSAndroid Build Coastguard Worker * (if not null). 50*c8dee2aaSAndroid Build Coastguard Worker */ makeNew()51*c8dee2aaSAndroid Build Coastguard Worker virtual std::unique_ptr<GLTestContext> makeNew() const { return nullptr; } 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker template<typename Ret, typename... Args> Ret(GR_GL_FUNCTION_TYPE ** out)54*c8dee2aaSAndroid Build Coastguard Worker void getGLProcAddress(Ret(GR_GL_FUNCTION_TYPE** out)(Args...), 55*c8dee2aaSAndroid Build Coastguard Worker const char* name, const char* ext = nullptr) const { 56*c8dee2aaSAndroid Build Coastguard Worker using Proc = Ret(GR_GL_FUNCTION_TYPE*)(Args...); 57*c8dee2aaSAndroid Build Coastguard Worker if (!SkStrStartsWith(name, "gl")) { 58*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("getGLProcAddress: proc name must have 'gl' prefix"); 59*c8dee2aaSAndroid Build Coastguard Worker *out = nullptr; 60*c8dee2aaSAndroid Build Coastguard Worker } else if (ext) { 61*c8dee2aaSAndroid Build Coastguard Worker SkString fullname(name); 62*c8dee2aaSAndroid Build Coastguard Worker fullname.append(ext); 63*c8dee2aaSAndroid Build Coastguard Worker *out = reinterpret_cast<Proc>(this->onPlatformGetProcAddress(fullname.c_str())); 64*c8dee2aaSAndroid Build Coastguard Worker } else { 65*c8dee2aaSAndroid Build Coastguard Worker *out = reinterpret_cast<Proc>(this->onPlatformGetProcAddress(name)); 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> makeContext(const GrContextOptions& options) override; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker protected: 72*c8dee2aaSAndroid Build Coastguard Worker GLTestContext(); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker /* 75*c8dee2aaSAndroid Build Coastguard Worker * Methods that subclasses must call from their constructors and destructors. 76*c8dee2aaSAndroid Build Coastguard Worker */ 77*c8dee2aaSAndroid Build Coastguard Worker void init(sk_sp<const GrGLInterface>); 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker void teardown() override; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker virtual GrGLFuncPtr onPlatformGetProcAddress(const char *) const = 0; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker private: 84*c8dee2aaSAndroid Build Coastguard Worker /** Subclass provides the gl interface object if construction was successful. */ 85*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrGLInterface> fOriginalGLInterface; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker /** The same as fOriginalGLInterface unless the version has been overridden. */ 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrGLInterface> fGLInterface; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = TestContext; 91*c8dee2aaSAndroid Build Coastguard Worker }; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker /** 94*c8dee2aaSAndroid Build Coastguard Worker * Creates platform-dependent GL context object. The shareContext parameter is in an optional 95*c8dee2aaSAndroid Build Coastguard Worker * context with which to share display lists. This should be a pointer to an GLTestContext created 96*c8dee2aaSAndroid Build Coastguard Worker * with SkCreatePlatformGLTestContext. NULL indicates that no sharing is to take place. Returns a 97*c8dee2aaSAndroid Build Coastguard Worker * valid gl context object or NULL if such can not be created. 98*c8dee2aaSAndroid Build Coastguard Worker */ 99*c8dee2aaSAndroid Build Coastguard Worker GLTestContext* CreatePlatformGLTestContext(GrGLStandard forcedGpuAPI, 100*c8dee2aaSAndroid Build Coastguard Worker GLTestContext *shareContext = nullptr); 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker } // namespace sk_gpu_test 103*c8dee2aaSAndroid Build Coastguard Worker #endif 104