// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file contains some useful utilities for the ui/gl classes. #ifndef UI_GL_GL_UTILS_H_ #define UI_GL_GL_UTILS_H_ #include "base/command_line.h" #include "base/memory/raw_ptr.h" #include "build/build_config.h" #include "ui/gl/gl_export.h" #include "ui/gl/gpu_preference.h" #if BUILDFLAG(IS_WIN) #include <dxgi1_6.h> #endif #if BUILDFLAG(IS_ANDROID) #include "base/files/scoped_file.h" #endif namespace gl { class GLApi; class GLDisplayEGL; class GLDisplay; GL_EXPORT void Crash(); GL_EXPORT void Hang(); #if BUILDFLAG(IS_ANDROID) GL_EXPORT base::ScopedFD MergeFDs(base::ScopedFD a, base::ScopedFD b); // Disable ANGLE and force to use native or other GL implementation. GL_EXPORT void DisableANGLE(); #endif GL_EXPORT bool UsePassthroughCommandDecoder( const base::CommandLine* command_line); GL_EXPORT bool PassthroughCommandDecoderSupported(); // Defines a set of workarounds that can be passed to ui/gl using the // SetGlWorkarounds function below. struct GlWorkarounds { … }; // Obtains the global GlWorkarounds. For use by ui/gl code to determine which // workarounds have been set by a call to SetGlWorkarounds. GL_EXPORT const GlWorkarounds& GetGlWorkarounds(); // Sets the GlWorkarounds. This should be called from the code hosting ui/gl. GL_EXPORT void SetGlWorkarounds(const GlWorkarounds& workarounds); #if BUILDFLAG(IS_WIN) // Calculates present during in 100 ns from number of frames per second. GL_EXPORT unsigned int FrameRateToPresentDuration(float frame_rate); // BufferCount for the root surface swap chain. GL_EXPORT unsigned int DirectCompositionRootSurfaceBufferCount(); // Labels swapchain with the name_prefix and ts buffers buffers with the string // name_prefix + _Buffer_ + <buffer_number>. GL_EXPORT void LabelSwapChainAndBuffers(IDXGISwapChain* swap_chain, const char* name_prefix); // Same as LabelSwapChainAndBuffers, but only does the buffers. Used for resize // operations. GL_EXPORT void LabelSwapChainBuffers(IDXGISwapChain* swap_chain, const char* name_prefix); #endif // The following functions expose functionalities from GLDisplayManagerEGL // and GLDisplayManagerX11 for access outside the ui/gl module. This is because // the two GLDisplayManager classes are singletons and in component build, // calling GetInstance() directly returns different instances in different // components. // Add an entry <preference, system_device_id> to GLDisplayManagerEGL. GL_EXPORT void SetGpuPreferenceEGL(GpuPreference preference, uint64_t system_device_id); // Remove the entry at <preference> from GLDisplayManagerEGL. GL_EXPORT void RemoveGpuPreferenceEGL(GpuPreference preference); // Query the default GLDisplay. May return either a GLDisplayEGL or // GLDisplayX11. GL_EXPORT GLDisplay* GetDefaultDisplay(); // Query the GLDisplay by |gpu_preference|. May return either a GLDisplayEGL or // GLDisplayX11. GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference); // Query the GLDisplay by |gpu_preference| and |display_key|. May return either // a GLDisplayEGL or GLDisplayX11. GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference, gl::DisplayKey display_key); // Query the default GLDisplayEGL. GL_EXPORT GLDisplayEGL* GetDefaultDisplayEGL(); // Query the GLDisplayEGL by |gpu_preference|. GL_EXPORT GLDisplayEGL* GetDisplayEGL(GpuPreference gpu_preference); // Temporarily allows compilation of shaders that use the // ARB_texture_rectangle/ANGLE_texture_rectangle extension. We don't want to // expose the extension to WebGL user shaders but we still need to use it for // parts of the implementation on macOS. Note that the extension is always // enabled on macOS and this only controls shader compilation. class GL_EXPORT ScopedEnableTextureRectangleInShaderCompiler { … }; class GL_EXPORT ScopedPixelStore { … }; } // namespace gl #endif // UI_GL_GL_UTILS_H_