GrGLContext.h revision 7839ce1af63bf12fe7b3caa866970bbbb3afb13d
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; }
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const GrGLCaps* caps() const { return fGLCaps.get(); }
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLCaps* caps() { return fGLCaps; }
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const GrGLExtensions& extensions() const { return fExtensions; }
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     * Shortcut for extensions().has(ext);
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool hasExtension(const char* ext) const {
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (!this->isInitialized()) {
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return fExtensions.has(ext);
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
65096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Reset the information
66096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset();
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLBinding             fBindingInUse;
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLVersion             fGLVersion;
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLSLGeneration        fGLSLGeneration;
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLVendor              fVendor;
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    GrGLExtensions          fExtensions;
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkAutoTUnref<GrGLCaps>  fGLCaps;
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/**
80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Encapsulates the GrGLInterface used to make GL calls plus information
81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * about the context (via GrGLContextInfo).
82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass GrGLContext {
84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic:
85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Default constructor
87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
88096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrGLContext() { this->reset(); }
89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Creates a GrGLContext from a GrGLInterface and the currently
92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * bound OpenGL context accessible by the GrGLInterface.
93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    explicit GrGLContext(const GrGLInterface* interface);
95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Copies a GrGLContext
98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrGLContext(const GrGLContext& ctx);
100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
101096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    ~GrGLContext() { GrSafeUnref(fInterface); }
102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Copies a GrGLContext
105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrGLContext& operator= (const GrGLContext& ctx);
107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
109096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Initializes a GrGLContext from a GrGLInterface and the currently
110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * bound OpenGL context accessible by the GrGLInterface.
111096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
112096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool initialize(const GrGLInterface* interface);
113096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool isInitialized() const { return fInfo.isInitialized(); }
114096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
115096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const GrGLInterface* interface() const { return fInterface; }
116096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const GrGLContextInfo& info() const { return fInfo; }
117096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrGLContextInfo& info() { return fInfo; }
118096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
119096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
120096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void reset();
121096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
122096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const GrGLInterface* fInterface;
123096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    GrGLContextInfo      fInfo;
124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger};
125096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
127