15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_GL_GL_IMPLEMENTATION_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_GL_GL_IMPLEMENTATION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/native_library.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLContext;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The GL implementation currently in use.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GLImplementation {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationNone,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationDesktopGL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationOSMesaGL,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationAppleGL,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationEGLGLES2,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kGLImplementationMockGL
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct GLWindowSystemBindingInfo {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string vendor;
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string version;
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string extensions;
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetAllowedGLImplementations(std::vector<GLImplementation>* impls);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* (WINAPI *GLGetProcAddressProc)(const char* name);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* (*GLGetProcAddressProc)(const char* name);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize a particular GL implementation.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GL_EXPORT bool InitializeGLBindings(GLImplementation implementation);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize extension function bindings for a GL implementation.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GL_EXPORT bool InitializeGLExtensionBindings(GLImplementation implementation,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLContext* context);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize Debug logging wrappers for GL bindings.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeDebugGLBindings();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)GL_EXPORT void ClearGLBindings();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set the current GL implementation.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GL_EXPORT void SetGLImplementation(GLImplementation implementation);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the current GL implementation.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GL_EXPORT GLImplementation GetGLImplementation();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Does the underlying GL support all features from Desktop GL 2.0 that were
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// removed from the ES 2.0 spec without requiring specific extension strings.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GL_EXPORT bool HasDesktopGLFeatures();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the GL implementation with a given name.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLImplementation GetNamedGLImplementation(const std::string& name);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the name of a GL implementation.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetGLImplementationName(GLImplementation implementation);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add a native library to those searched for GL entry points.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddGLNativeLibrary(base::NativeLibrary library);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unloads all native libraries.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnloadGLNativeLibraries();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set an additional function that will be called to find GL entry points.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetGLGetProcAddressProc(GLGetProcAddressProc proc);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Find a core (non-extension) entry point in the current GL implementation. On
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EGL based implementations core entry points will not be queried through
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GLGetProcAddressProc.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* GetGLCoreProcAddress(const char* name);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Find an entry point in the current GL implementation.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* GetGLProcAddress(const char* name);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Return information about the GL window system binding implementation (e.g.,
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// EGL, GLX, WGL). Returns true if the information was retrieved successfully.
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GL_EXPORT bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info);
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_GL_GL_IMPLEMENTATION_H_
96