- add sources.
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_implementation_android.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/base_paths.h"
6 #include "base/command_line.h"
7 #include "base/files/file_path.h"
8 #include "base/logging.h"
9 #include "base/native_library.h"
10 #include "base/path_service.h"
11 #include "ui/gl/gl_bindings.h"
12 #include "ui/gl/gl_egl_api_implementation.h"
13 #include "ui/gl/gl_gl_api_implementation.h"
14 #include "ui/gl/gl_implementation.h"
15 #include "ui/gl/gl_osmesa_api_implementation.h"
16
17 namespace gfx {
18
19 namespace {
20
21 void GL_BINDING_CALL MarshalClearDepthToClearDepthf(GLclampd depth) {
22   glClearDepthf(static_cast<GLclampf>(depth));
23 }
24
25 void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near,
26                                                     GLclampd z_far) {
27   glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far));
28 }
29
30 base::NativeLibrary LoadLibrary(const base::FilePath& filename) {
31   std::string error;
32   base::NativeLibrary library = base::LoadNativeLibrary(filename, &error);
33   if (!library) {
34     DVLOG(1) << "Failed to load " << filename.MaybeAsASCII() << ": " << error;
35     return NULL;
36   }
37   return library;
38 }
39
40 base::NativeLibrary LoadLibrary(const char* filename) {
41   return LoadLibrary(base::FilePath(filename));
42 }
43
44 }  // namespace
45
46 void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
47   impls->push_back(kGLImplementationEGLGLES2);
48 }
49
50 bool InitializeGLBindings(GLImplementation implementation) {
51   // Prevent reinitialization with a different implementation. Once the gpu
52   // unit tests have initialized with kGLImplementationMock, we don't want to
53   // later switch to another GL implementation.
54   if (GetGLImplementation() != kGLImplementationNone)
55     return true;
56
57   switch (implementation) {
58     case kGLImplementationEGLGLES2: {
59       base::NativeLibrary gles_library = LoadLibrary("libGLESv2.so");
60       if (!gles_library)
61         return false;
62       base::NativeLibrary egl_library = LoadLibrary("libEGL.so");
63       if (!egl_library) {
64         base::UnloadNativeLibrary(gles_library);
65         return false;
66       }
67
68       GLGetProcAddressProc get_proc_address =
69           reinterpret_cast<GLGetProcAddressProc>(
70               base::GetFunctionPointerFromNativeLibrary(
71                   egl_library, "eglGetProcAddress"));
72       if (!get_proc_address) {
73         LOG(ERROR) << "eglGetProcAddress not found.";
74         base::UnloadNativeLibrary(egl_library);
75         base::UnloadNativeLibrary(gles_library);
76         return false;
77       }
78
79       SetGLGetProcAddressProc(get_proc_address);
80       AddGLNativeLibrary(egl_library);
81       AddGLNativeLibrary(gles_library);
82       SetGLImplementation(kGLImplementationEGLGLES2);
83
84       InitializeGLBindingsGL();
85       InitializeGLBindingsEGL();
86
87       // These two functions take single precision float rather than double
88       // precision float parameters in GLES.
89       ::gfx::g_driver_gl.fn.glClearDepthFn = MarshalClearDepthToClearDepthf;
90       ::gfx::g_driver_gl.fn.glDepthRangeFn = MarshalDepthRangeToDepthRangef;
91       break;
92     }
93     case kGLImplementationMockGL: {
94       SetGLGetProcAddressProc(GetMockGLProcAddress);
95       SetGLImplementation(kGLImplementationMockGL);
96       InitializeGLBindingsGL();
97       break;
98     }
99     default:
100       NOTIMPLEMENTED() << "InitializeGLBindings on Android";
101       return false;
102   }
103
104   return true;
105 }
106
107 bool InitializeGLExtensionBindings(GLImplementation implementation,
108                                    GLContext* context) {
109   switch (implementation) {
110     case kGLImplementationEGLGLES2:
111       InitializeGLExtensionBindingsGL(context);
112       InitializeGLExtensionBindingsEGL(context);
113       break;
114     case kGLImplementationMockGL:
115       InitializeGLExtensionBindingsGL(context);
116       break;
117     default:
118       return false;
119   }
120
121   return true;
122 }
123
124 void InitializeDebugGLBindings() {
125 }
126
127 void ClearGLBindings() {
128   ClearGLBindingsEGL();
129   ClearGLBindingsGL();
130   SetGLImplementation(kGLImplementationNone);
131
132   UnloadGLNativeLibraries();
133 }
134
135 bool GetGLWindowSystemBindingInfo(GLWindowSystemBindingInfo* info) {
136   switch (GetGLImplementation()) {
137     case kGLImplementationEGLGLES2:
138       return GetGLWindowSystemBindingInfoEGL(info);
139     default:
140       return false;
141   }
142   return false;
143 }
144
145 }  // namespace gfx