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
15struct 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 */
22class SK_API GrGLExtensions {
23public:
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
66private:
67    bool                                fInitialized;
68    SkAutoTDelete<SkTArray<SkString> >  fStrings;
69};
70
71#endif
72