1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 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 9*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrGLContext_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker #define GrGLContext_DEFINED 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLInterface.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLCaps.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLUtil.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 19*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrGLExtensions; 22*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 25*c8dee2aaSAndroid Build Coastguard Worker enum class GLSLGeneration; 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker /** 29*c8dee2aaSAndroid Build Coastguard Worker * Encapsulates information about an OpenGL context including the OpenGL 30*c8dee2aaSAndroid Build Coastguard Worker * version, the GrGLStandard type of the context, and GLSL version. 31*c8dee2aaSAndroid Build Coastguard Worker */ 32*c8dee2aaSAndroid Build Coastguard Worker class GrGLContextInfo { 33*c8dee2aaSAndroid Build Coastguard Worker public: 34*c8dee2aaSAndroid Build Coastguard Worker GrGLContextInfo(GrGLContextInfo&&) = default; 35*c8dee2aaSAndroid Build Coastguard Worker GrGLContextInfo& operator=(GrGLContextInfo&&) = default; 36*c8dee2aaSAndroid Build Coastguard Worker ~GrGLContextInfo()37*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrGLContextInfo() {} 38*c8dee2aaSAndroid Build Coastguard Worker standard()39*c8dee2aaSAndroid Build Coastguard Worker GrGLStandard standard() const { return fInterface->fStandard; } version()40*c8dee2aaSAndroid Build Coastguard Worker GrGLVersion version() const { return fDriverInfo.fVersion; } glslGeneration()41*c8dee2aaSAndroid Build Coastguard Worker SkSL::GLSLGeneration glslGeneration() const { return fGLSLGeneration; } 42*c8dee2aaSAndroid Build Coastguard Worker /** 43*c8dee2aaSAndroid Build Coastguard Worker * We've accumlated a lot of GL driver workarounds and performance preferences based on vendor 44*c8dee2aaSAndroid Build Coastguard Worker * and renderer. When we have GL sitting on top of Angle it is not clear which of these are 45*c8dee2aaSAndroid Build Coastguard Worker * necessary and which are handle by Angle. Thus to be safe we get the underlying GL vendor and 46*c8dee2aaSAndroid Build Coastguard Worker * renderer from Angle so we can enable these workarounds. It may mean that the same workaround 47*c8dee2aaSAndroid Build Coastguard Worker * is implemented both in Skia and Angle, but that is better than missing out on one. 48*c8dee2aaSAndroid Build Coastguard Worker */ vendor()49*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor vendor() const { 50*c8dee2aaSAndroid Build Coastguard Worker if (this->angleBackend() == GrGLANGLEBackend::kOpenGL) { 51*c8dee2aaSAndroid Build Coastguard Worker return this->angleVendor(); 52*c8dee2aaSAndroid Build Coastguard Worker } else { 53*c8dee2aaSAndroid Build Coastguard Worker return fDriverInfo.fVendor; 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker } renderer()56*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer renderer() const { 57*c8dee2aaSAndroid Build Coastguard Worker if (this->angleBackend() == GrGLANGLEBackend::kOpenGL) { 58*c8dee2aaSAndroid Build Coastguard Worker return this->angleRenderer(); 59*c8dee2aaSAndroid Build Coastguard Worker } else { 60*c8dee2aaSAndroid Build Coastguard Worker return fDriverInfo.fRenderer; 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker } angleBackend()63*c8dee2aaSAndroid Build Coastguard Worker GrGLANGLEBackend angleBackend() const { return fDriverInfo.fANGLEBackend; } angleDriver()64*c8dee2aaSAndroid Build Coastguard Worker GrGLDriver angleDriver() const { return fDriverInfo.fANGLEDriver; } angleDriverVersion()65*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverVersion angleDriverVersion() const { return fDriverInfo.fANGLEDriverVersion; } angleVendor()66*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor angleVendor() const { return fDriverInfo.fANGLEVendor; } angleRenderer()67*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer angleRenderer() const { return fDriverInfo.fANGLERenderer; } 68*c8dee2aaSAndroid Build Coastguard Worker webglVendor()69*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor webglVendor() const { return fDriverInfo.fWebGLVendor; } webglRenderer()70*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer webglRenderer() const { return fDriverInfo.fWebGLRenderer; } 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker /** What driver is running our GL implementation? This is not necessarily related to the vendor. 73*c8dee2aaSAndroid Build Coastguard Worker (e.g. Intel GPU being driven by Mesa) */ driver()74*c8dee2aaSAndroid Build Coastguard Worker GrGLDriver driver() const { return fDriverInfo.fDriver; } driverVersion()75*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverVersion driverVersion() const { return fDriverInfo.fDriverVersion; } isOverCommandBuffer()76*c8dee2aaSAndroid Build Coastguard Worker bool isOverCommandBuffer() const { return fDriverInfo.fIsOverCommandBuffer; } isRunningOverVirgl()77*c8dee2aaSAndroid Build Coastguard Worker bool isRunningOverVirgl() const { return fDriverInfo.fIsRunningOverVirgl; } 78*c8dee2aaSAndroid Build Coastguard Worker caps()79*c8dee2aaSAndroid Build Coastguard Worker const GrGLCaps* caps() const { return fGLCaps.get(); } caps()80*c8dee2aaSAndroid Build Coastguard Worker GrGLCaps* caps() { return fGLCaps.get(); } 81*c8dee2aaSAndroid Build Coastguard Worker hasExtension(const char * ext)82*c8dee2aaSAndroid Build Coastguard Worker bool hasExtension(const char* ext) const { 83*c8dee2aaSAndroid Build Coastguard Worker return fInterface->hasExtension(ext); 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker extensions()86*c8dee2aaSAndroid Build Coastguard Worker const GrGLExtensions& extensions() const { return fInterface->fExtensions; } 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker protected: 89*c8dee2aaSAndroid Build Coastguard Worker GrGLContextInfo& operator=(const GrGLContextInfo&) = default; 90*c8dee2aaSAndroid Build Coastguard Worker GrGLContextInfo(const GrGLContextInfo&) = default; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker struct ConstructorArgs { 93*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrGLInterface> fInterface; 94*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverInfo fDriverInfo; 95*c8dee2aaSAndroid Build Coastguard Worker SkSL::GLSLGeneration fGLSLGeneration; 96*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions* fContextOptions; 97*c8dee2aaSAndroid Build Coastguard Worker }; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker GrGLContextInfo(ConstructorArgs&&); 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrGLInterface> fInterface; 102*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverInfo fDriverInfo; 103*c8dee2aaSAndroid Build Coastguard Worker SkSL::GLSLGeneration fGLSLGeneration; 104*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGLCaps> fGLCaps; 105*c8dee2aaSAndroid Build Coastguard Worker }; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker /** 108*c8dee2aaSAndroid Build Coastguard Worker * Extension of GrGLContextInfo that also provides access to GrGLInterface. 109*c8dee2aaSAndroid Build Coastguard Worker */ 110*c8dee2aaSAndroid Build Coastguard Worker class GrGLContext : public GrGLContextInfo { 111*c8dee2aaSAndroid Build Coastguard Worker public: 112*c8dee2aaSAndroid Build Coastguard Worker /** 113*c8dee2aaSAndroid Build Coastguard Worker * Creates a GrGLContext from a GrGLInterface and the currently 114*c8dee2aaSAndroid Build Coastguard Worker * bound OpenGL context accessible by the GrGLInterface. 115*c8dee2aaSAndroid Build Coastguard Worker */ 116*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<GrGLContext> Make(sk_sp<const GrGLInterface>, const GrContextOptions&); 117*c8dee2aaSAndroid Build Coastguard Worker glInterface()118*c8dee2aaSAndroid Build Coastguard Worker const GrGLInterface* glInterface() const { return fInterface.get(); } 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker ~GrGLContext() override; 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker private: GrGLContext(ConstructorArgs && args)123*c8dee2aaSAndroid Build Coastguard Worker GrGLContext(ConstructorArgs&& args) : INHERITED(std::move(args)) {} 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrGLContextInfo; 126*c8dee2aaSAndroid Build Coastguard Worker }; 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker #endif 129