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