| // Copyright 2019 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_IMPLEMENTATION_WRAPPER_H_ |
| #define UI_GL_GL_IMPLEMENTATION_WRAPPER_H_ |
| |
| #include <memory> |
| |
| #include "base/command_line.h" |
| #include "ui/gl/gl_switches.h" |
| |
| #define GL_IMPL_WRAPPER_TYPE(name) \ |
| GLImplementationWrapper<name##Api, Trace##name##Api, Log##name##Api> |
| |
| namespace gl { |
| |
| // Wraps a GLApi with its tracing and logging variants when the corresponding |
| // command line flags are passed. |
| template <class GLImplApi, class GLTraceImplApi, class GLLogImplApi> |
| class GLImplementationWrapper { |
| public: |
| GLImplementationWrapper(std::unique_ptr<GLImplApi> real_gl) |
| : real_gl_(std::move(real_gl)) { |
| gl_api_ = real_gl_.get(); |
| |
| static bool enable_tracing = |
| base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableGPUServiceTracing); |
| if (enable_tracing) { |
| trace_gl_ = std::make_unique<GLTraceImplApi>(gl_api_); |
| gl_api_ = trace_gl_.get(); |
| } |
| |
| static bool enable_logging = |
| base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableGPUServiceLogging); |
| if (enable_logging) { |
| log_gl_ = std::make_unique<GLLogImplApi>(gl_api_); |
| gl_api_ = log_gl_.get(); |
| } |
| } |
| |
| ~GLImplementationWrapper() = default; |
| |
| GLImplApi* api() { return gl_api_; } |
| |
| private: |
| std::unique_ptr<GLImplApi> real_gl_; |
| std::unique_ptr<GLTraceImplApi> trace_gl_; |
| std::unique_ptr<GLLogImplApi> log_gl_; |
| GLImplApi* gl_api_ = nullptr; |
| |
| DISALLOW_COPY_AND_ASSIGN(GLImplementationWrapper); |
| }; |
| |
| } // namespace gl |
| |
| #endif // UI_GL_GL_IMPLEMENTATION_WRAPPER_H_ |