1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrGLExtensions_DEFINED
9 #define GrGLExtensions_DEFINED
10 
11 #include "GrGLFunctions.h"
12 #include "SkString.h"
13 #include "SkTArray.h"
14 
15 struct GrGLInterface;
16 
17 /**
18  * This helper queries the current GL context for its extensions, remembers them, and can be
19  * queried. It supports both glGetString- and glGetStringi-style extension string APIs and will
20  * use the latter if it is available.
21  */
22 class SK_API GrGLExtensions {
23 public:
GrGLExtensions()24     GrGLExtensions() : fInitialized(false), fStrings(SkNEW(SkTArray<SkString>)) {}
25 
26     GrGLExtensions(const GrGLExtensions&);
27 
28     GrGLExtensions& operator=(const GrGLExtensions&);
29 
swap(GrGLExtensions * that)30     void swap(GrGLExtensions* that) {
31         fStrings.swap(&that->fStrings);
32         SkTSwap(fInitialized, that->fInitialized);
33     }
34 
35     /**
36      * We sometimes need to use this class without having yet created a GrGLInterface. This version
37      * of init expects that getString is always non-NULL while getIntegerv and getStringi are non-
38      * NULL if on desktop GL with version 3.0 or higher. Otherwise it will fail.
39      */
40     bool init(GrGLStandard standard,
41               GrGLGetStringProc getString,
42               GrGLGetStringiProc getStringi,
43               GrGLGetIntegervProc getIntegerv);
44 
isInitialized()45     bool isInitialized() const { return fInitialized; }
46 
47     /**
48      * Queries whether an extension is present. This will fail if init() has not been called.
49      */
50     bool has(const char[]) const;
51 
52     /**
53      * Removes an extension if present. Returns true if the extension was present before the call.
54      */
55     bool remove(const char[]);
56 
57     /**
58      * Adds an extension to list
59      */
60     void add(const char[]);
61 
reset()62     void reset() { fStrings->reset(); }
63 
64     void print(const char* sep = "\n") const;
65 
66 private:
67     bool                                fInitialized;
68     SkAutoTDelete<SkTArray<SkString> >  fStrings;
69 };
70 
71 #endif
72