180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifndef GrGLContext_DEFINED 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define GrGLContext_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "gl/GrGLExtensions.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gl/GrGLInterface.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLCaps.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLSL.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLUtil.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Encapsulates information about an OpenGL context including the OpenGL 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * version, the GrGLBinding type of the context, and GLSL version. 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGLContextInfo { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Default constructor 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLContextInfo() { 307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fGLCaps.reset(SkNEW(GrGLCaps)); 317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger this->reset(); 327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copies a GrGLContextInfo 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContextInfo& operator= (const GrGLContextInfo& ctxInfo); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Initializes a GrGLContextInfo from a GrGLInterface and the currently 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * bound OpenGL context accessible by the GrGLInterface. 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool initialize(const GrGLInterface* interface); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isInitialized() const; 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLBinding binding() const { return fBindingInUse; } 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLVersion version() const { return fGLVersion; } 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLSLGeneration glslGeneration() const { return fGLSLGeneration; } 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrGLVendor vendor() const { return fVendor; } 500a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrGLRenderer renderer() const { return fRenderer; } 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** Is this a mesa-based driver. Does not mean it is the osmesa software rasterizer. */ 5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool isMesa() const { return fIsMesa; } 530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** Are we running inside Chromium (using the command buffer)? We make some different tradeoffs 540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger about what errors to check for because queries are synchronous. We should probably expose 550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger this as an option for clients other than Chromium. */ 560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool isChromium() const { return fIsChromium; } 577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrGLCaps* caps() const { return fGLCaps.get(); } 587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLCaps* caps() { return fGLCaps; } 597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrGLExtensions& extensions() const { return fExtensions; } 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Shortcut for extensions().has(ext); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool hasExtension(const char* ext) const { 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!this->isInitialized()) { 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return fExtensions.has(ext); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 72096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Reset the information 73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate: 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLBinding fBindingInUse; 797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLVersion fGLVersion; 807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLSLGeneration fGLSLGeneration; 817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLVendor fVendor; 820a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrGLRenderer fRenderer; 837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrGLExtensions fExtensions; 8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool fIsMesa; 850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool fIsChromium; 867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkAutoTUnref<GrGLCaps> fGLCaps; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/** 90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Encapsulates the GrGLInterface used to make GL calls plus information 91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * about the context (via GrGLContextInfo). 92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass GrGLContext { 94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic: 95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Default constructor 97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContext() { this->reset(); } 99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 101096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Creates a GrGLContext from a GrGLInterface and the currently 102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * bound OpenGL context accessible by the GrGLInterface. 103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger explicit GrGLContext(const GrGLInterface* interface); 105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copies a GrGLContext 108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 109096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContext(const GrGLContext& ctx); 110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 1110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger ~GrGLContext() { SkSafeUnref(fInterface); } 112096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 113096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 114096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copies a GrGLContext 115096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 116096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContext& operator= (const GrGLContext& ctx); 117096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 118096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 119096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Initializes a GrGLContext from a GrGLInterface and the currently 120096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * bound OpenGL context accessible by the GrGLInterface. 121096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 122096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool initialize(const GrGLInterface* interface); 123096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool isInitialized() const { return fInfo.isInitialized(); } 124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 125096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger const GrGLInterface* interface() const { return fInterface; } 126096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger const GrGLContextInfo& info() const { return fInfo; } 127096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContextInfo& info() { return fInfo; } 128096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 129096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate: 130096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger void reset(); 131096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger const GrGLInterface* fInterface; 133096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrGLContextInfo fInfo; 134096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}; 135096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 137