Home | History | Annotate | Download | only in gl
      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:
     24     GrGLExtensions() : fInitialized(false), fStrings(SkNEW(SkTArray<SkString>)) {}
     25 
     26     GrGLExtensions(const GrGLExtensions&);
     27 
     28     GrGLExtensions& operator=(const GrGLExtensions&);
     29 
     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 
     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 
     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