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 "../../private/SkTArray.h"
     12 #include "GrGLFunctions.h"
     13 #include "SkString.h"
     14 
     15 struct GrGLInterface;
     16 class SkJSONWriter;
     17 
     18 /**
     19  * This helper queries the current GL context for its extensions, remembers them, and can be
     20  * queried. It supports both glGetString- and glGetStringi-style extension string APIs and will
     21  * use the latter if it is available. It also will query for EGL extensions if a eglQueryString
     22  * implementation is provided.
     23  */
     24 class SK_API GrGLExtensions {
     25 public:
     26     GrGLExtensions() : fInitialized(false), fStrings(new SkTArray<SkString>) {}
     27 
     28     GrGLExtensions(const GrGLExtensions&);
     29 
     30     GrGLExtensions& operator=(const GrGLExtensions&);
     31 
     32     void swap(GrGLExtensions* that) {
     33         fStrings.swap(that->fStrings);
     34         SkTSwap(fInitialized, that->fInitialized);
     35     }
     36 
     37     /**
     38      * We sometimes need to use this class without having yet created a GrGLInterface. This version
     39      * of init expects that getString is always non-NULL while getIntegerv and getStringi are non-
     40      * NULL if on desktop GL with version 3.0 or higher. Otherwise it will fail.
     41      */
     42     bool init(GrGLStandard standard,
     43               GrGLFunction<GrGLGetStringProc> getString,
     44               GrGLFunction<GrGLGetStringiProc> getStringi,
     45               GrGLFunction<GrGLGetIntegervProc> getIntegerv,
     46               GrGLFunction<GrEGLQueryStringProc> queryString = nullptr,
     47               GrEGLDisplay eglDisplay = nullptr);
     48 
     49     bool isInitialized() const { return fInitialized; }
     50 
     51     /**
     52      * Queries whether an extension is present. This will fail if init() has not been called.
     53      */
     54     bool has(const char[]) const;
     55 
     56     /**
     57      * Removes an extension if present. Returns true if the extension was present before the call.
     58      */
     59     bool remove(const char[]);
     60 
     61     /**
     62      * Adds an extension to list
     63      */
     64     void add(const char[]);
     65 
     66     void reset() { fStrings->reset(); }
     67 
     68     void dumpJSON(SkJSONWriter*) const;
     69 
     70 private:
     71     bool                                fInitialized;
     72     std::unique_ptr<SkTArray<SkString>> fStrings;
     73 };
     74 
     75 #endif
     76