
When GL draw calls are skipped due to null bindings and GPU service
logging is enabled log warnings for the skipped GL calls. This will
ensure it's clear the draw calls are being skipped when debugging.
Fixed: 1346380
Change-Id: I0afeba3ceffa12dc096ce1cf1d69eda02d79126e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3820604
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Kyle Charbonneau <kylechar@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1033553}
207 lines
7.1 KiB
C++
207 lines
7.1 KiB
C++
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// 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"
|
|
#include "ui/gl/gl_workarounds.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();
|
|
|
|
void SetCurrentGL(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 glClearColorFn(GLclampf red,
|
|
GLclampf green,
|
|
GLclampf blue,
|
|
GLclampf alpha) 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_gl_workarounds(const GLWorkarounds& workarounds);
|
|
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_;
|
|
|
|
GLWorkarounds gl_workarounds_;
|
|
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_
|