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