1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GL_GL_GL_API_IMPLEMENTATION_H_
#define UI_GL_GL_GL_API_IMPLEMENTATION_H_
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_export.h"
namespace gl {
struct GLVersionInfo;
GL_EXPORT GLenum GetInternalFormat(const GLVersionInfo* version,
GLenum internal_format);
GL_EXPORT void InitializeStaticGLBindingsGL();
GL_EXPORT void ClearBindingsGL();
bool SetNullDrawGLBindingsEnabled(bool enabled);
bool GetNullDrawBindingsEnabled();
// This is exported from //ui/gl/gl_bindings.h to retrieve GL bindings.
GL_EXPORT CurrentGL* GetThreadLocalCurrentGL();
// This is only used internally in //ui/gl to set GL bindings from GLContext.
void SetThreadLocalCurrentGL(CurrentGL* current);
class GL_EXPORT GLApiBase : public GLApi {
public:
// Include the auto-generated part of this class. We split this because
// it means we can easily edit the non-auto generated parts right here in
// this file instead of having to edit some template or the code generator.
#include "gl_bindings_api_autogen_gl.h"
protected:
GLApiBase();
~GLApiBase() override;
void InitializeBase(DriverGL* driver);
raw_ptr<DriverGL> driver_;
};
// Implemenents the GL API by calling directly into the driver.
class GL_EXPORT RealGLApi : public GLApiBase {
public:
RealGLApi();
~RealGLApi() override;
void Initialize(DriverGL* driver);
void SetDisabledExtensions(const std::string& disabled_extensions) override;
void glGetIntegervFn(GLenum pname, GLint* params) override;
const GLubyte* glGetStringFn(GLenum name) override;
const GLubyte* glGetStringiFn(GLenum name, GLuint index) override;
void glTexImage2DFn(GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const void* pixels) override;
void glTexSubImage2DFn(GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
const void* pixels) override;
void glTexStorage2DEXTFn(GLenum target,
GLsizei levels,
GLenum internalformat,
GLsizei width,
GLsizei height) override;
void glTexStorageMem2DEXTFn(GLenum target,
GLsizei levels,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLuint memory,
GLuint64 offset) override;
void glTexStorageMemFlags2DANGLEFn(GLenum target,
GLsizei levels,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLuint memory,
GLuint64 offset,
GLbitfield createFlags,
GLbitfield usageFlags,
const void* imageCreateInfoPNext) override;
void glRenderbufferStorageEXTFn(GLenum target,
GLenum internalformat,
GLsizei width,
GLsizei height) override;
void glRenderbufferStorageMultisampleEXTFn(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height) override;
void glRenderbufferStorageMultisampleFn(GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height) override;
void glReadPixelsFn(GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
void* pixels) override;
void glClearFn(GLbitfield mask) override;
void glDrawArraysFn(GLenum mode, GLint first, GLsizei count) override;
void glDrawElementsFn(GLenum mode,
GLsizei count,
GLenum type,
const void* indices) override;
void glClearDepthFn(GLclampd depth) override;
void glDepthRangeFn(GLclampd z_near, GLclampd z_far) override;
void glUseProgramFn(GLuint program) override;
void set_version(std::unique_ptr<GLVersionInfo> version);
void ClearCachedGLExtensions();
private:
// Compute |filtered_exts_| & |filtered_exts_str_| from |disabled_ext_|.
void InitializeFilteredExtensionsIfNeeded();
const bool logging_enabled_;
std::vector<std::string> disabled_exts_;
// Filtered GL_EXTENSIONS we return to glGetString(i) calls.
std::vector<std::string> filtered_exts_;
std::string filtered_exts_str_;
std::unique_ptr<GLVersionInfo> version_;
};
// Inserts a TRACE for every GL call.
class TraceGLApi : public GLApi {
public:
TraceGLApi(GLApi* gl_api) : gl_api_(gl_api) { }
~TraceGLApi() override;
// Include the auto-generated part of this class. We split this because
// it means we can easily edit the non-auto generated parts right here in
// this file instead of having to edit some template or the code generator.
#include "gl_bindings_api_autogen_gl.h"
private:
raw_ptr<GLApi> gl_api_;
};
// Logs debug information for every GL call.
class LogGLApi : public GLApi {
public:
LogGLApi(GLApi* gl_api);
~LogGLApi() override;
// Include the auto-generated part of this class. We split this because
// it means we can easily edit the non-auto generated parts right here in
// this file instead of having to edit some template or the code generator.
#include "gl_bindings_api_autogen_gl.h"
private:
raw_ptr<GLApi> gl_api_;
};
// Catches incorrect usage when GL calls are made without a current context.
class NoContextGLApi : public GLApi {
public:
NoContextGLApi();
~NoContextGLApi() override;
// Include the auto-generated part of this class. We split this because
// it means we can easily edit the non-auto generated parts right here in
// this file instead of having to edit some template or the code generator.
#include "gl_bindings_api_autogen_gl.h"
};
} // namespace gl
#endif // UI_GL_GL_GL_API_IMPLEMENTATION_H_
|