OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/gl/gl_context_egl.h" | 5 #include "ui/gfx/gl/gl_context_egl.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "third_party/angle/include/EGL/egl.h" | 10 #include "third_party/angle/include/EGL/egl.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 std::string GLContextEGL::GetExtensions() { | 26 std::string GLContextEGL::GetExtensions() { |
27 const char* extensions = eglQueryString(GLSurfaceEGL::GetDisplay(), | 27 const char* extensions = eglQueryString(GLSurfaceEGL::GetDisplay(), |
28 EGL_EXTENSIONS); | 28 EGL_EXTENSIONS); |
29 if (!extensions) | 29 if (!extensions) |
30 return GLContext::GetExtensions(); | 30 return GLContext::GetExtensions(); |
31 | 31 |
32 return GLContext::GetExtensions() + " " + extensions; | 32 return GLContext::GetExtensions() + " " + extensions; |
33 } | 33 } |
34 | 34 |
35 GLContextEGL::GLContextEGL(GLSurfaceEGL* surface) | 35 GLContextEGL::GLContextEGL() |
36 : surface_(surface), | 36 : context_(NULL) |
37 context_(NULL) | |
38 { | 37 { |
39 } | 38 } |
40 | 39 |
41 GLContextEGL::~GLContextEGL() { | 40 GLContextEGL::~GLContextEGL() { |
42 Destroy(); | 41 Destroy(); |
43 } | 42 } |
44 | 43 |
45 bool GLContextEGL::Initialize(GLContext* shared_context) { | 44 bool GLContextEGL::Initialize(GLContext* shared_context, |
| 45 GLSurface* compatible_surface) { |
| 46 DCHECK(compatible_surface); |
46 DCHECK(!context_); | 47 DCHECK(!context_); |
47 | 48 |
48 static const EGLint kContextAttributes[] = { | 49 static const EGLint kContextAttributes[] = { |
49 EGL_CONTEXT_CLIENT_VERSION, 2, | 50 EGL_CONTEXT_CLIENT_VERSION, 2, |
50 EGL_NONE | 51 EGL_NONE |
51 }; | 52 }; |
52 | 53 |
53 context_ = eglCreateContext( | 54 context_ = eglCreateContext( |
54 GLSurfaceEGL::GetDisplay(), | 55 GLSurfaceEGL::GetDisplay(), |
55 GLSurfaceEGL::GetConfig(), | 56 GLSurfaceEGL::GetConfig(), |
56 shared_context ? shared_context->GetHandle() : NULL, | 57 shared_context ? shared_context->GetHandle() : NULL, |
57 kContextAttributes); | 58 kContextAttributes); |
58 if (!context_) { | 59 if (!context_) { |
59 LOG(ERROR) << "eglCreateContext failed with error " | 60 LOG(ERROR) << "eglCreateContext failed with error " |
60 << GetLastEGLErrorString(); | 61 << GetLastEGLErrorString(); |
61 Destroy(); | 62 Destroy(); |
62 return false; | 63 return false; |
63 } | 64 } |
64 | 65 |
65 if (!MakeCurrent()) { | |
66 LOG(ERROR) << "MakeCurrent failed."; | |
67 Destroy(); | |
68 return false; | |
69 } | |
70 | |
71 if (!InitializeCommon()) { | |
72 LOG(ERROR) << "GLContext::InitializeCommon failed."; | |
73 Destroy(); | |
74 return false; | |
75 } | |
76 | |
77 return true; | 66 return true; |
78 } | 67 } |
79 | 68 |
80 void GLContextEGL::Destroy() { | 69 void GLContextEGL::Destroy() { |
81 if (context_) { | 70 if (context_) { |
82 if (!eglDestroyContext(GLSurfaceEGL::GetDisplay(), context_)) { | 71 if (!eglDestroyContext(GLSurfaceEGL::GetDisplay(), context_)) { |
83 LOG(ERROR) << "eglDestroyContext failed with error " | 72 LOG(ERROR) << "eglDestroyContext failed with error " |
84 << GetLastEGLErrorString(); | 73 << GetLastEGLErrorString(); |
85 } | 74 } |
86 | 75 |
87 context_ = NULL; | 76 context_ = NULL; |
88 } | 77 } |
89 | |
90 if (surface_.get()) { | |
91 surface_->Destroy(); | |
92 surface_.reset(); | |
93 } | |
94 } | 78 } |
95 | 79 |
96 bool GLContextEGL::MakeCurrent() { | 80 bool GLContextEGL::MakeCurrent(GLSurface* surface) { |
97 DCHECK(context_); | 81 DCHECK(context_); |
98 if (IsCurrent()) | 82 if (IsCurrent(surface)) |
99 return true; | 83 return true; |
100 | 84 |
101 if (!eglMakeCurrent(GLSurfaceEGL::GetDisplay(), | 85 if (!eglMakeCurrent(GLSurfaceEGL::GetDisplay(), |
102 surface_->GetHandle(), | 86 surface->GetHandle(), |
103 surface_->GetHandle(), | 87 surface->GetHandle(), |
104 context_)) { | 88 context_)) { |
105 VLOG(1) << "eglMakeCurrent failed with error " | 89 VLOG(1) << "eglMakeCurrent failed with error " |
106 << GetLastEGLErrorString(); | 90 << GetLastEGLErrorString(); |
107 return false; | 91 return false; |
108 } | 92 } |
109 | 93 |
110 return true; | 94 return true; |
111 } | 95 } |
112 | 96 |
113 void GLContextEGL::ReleaseCurrent() { | 97 void GLContextEGL::ReleaseCurrent(GLSurface* surface) { |
114 if (!IsCurrent()) | 98 if (!IsCurrent(surface)) |
115 return; | 99 return; |
116 | 100 |
117 eglMakeCurrent(GLSurfaceEGL::GetDisplay(), | 101 eglMakeCurrent(GLSurfaceEGL::GetDisplay(), |
118 EGL_NO_SURFACE, | 102 EGL_NO_SURFACE, |
119 EGL_NO_SURFACE, | 103 EGL_NO_SURFACE, |
120 EGL_NO_CONTEXT); | 104 EGL_NO_CONTEXT); |
121 } | 105 } |
122 | 106 |
123 bool GLContextEGL::IsCurrent() { | 107 bool GLContextEGL::IsCurrent(GLSurface* surface) { |
124 DCHECK(context_); | 108 DCHECK(context_); |
125 return context_ == eglGetCurrentContext() && | 109 if (context_ != eglGetCurrentContext()) |
126 surface_->GetHandle() == eglGetCurrentSurface(EGL_DRAW); | 110 return false; |
127 } | |
128 | 111 |
129 bool GLContextEGL::IsOffscreen() { | 112 if (surface) { |
130 // TODO(apatrick): remove this from GLContext interface. | 113 if (surface->GetHandle() != eglGetCurrentSurface(EGL_DRAW)) |
131 return surface_->IsOffscreen(); | 114 return false; |
132 } | 115 } |
133 | 116 |
134 bool GLContextEGL::SwapBuffers() { | 117 return true; |
135 // TODO(apatrick): remove this from GLContext interface. | |
136 return surface_->SwapBuffers(); | |
137 } | |
138 | |
139 gfx::Size GLContextEGL::GetSize() { | |
140 // TODO(apatrick): remove this from GLContext interface. | |
141 return surface_->GetSize(); | |
142 } | |
143 | |
144 GLSurface* GLContextEGL::GetSurface() { | |
145 // TODO(apatrick): remove this from GLContext interface. | |
146 return surface_.get(); | |
147 } | 118 } |
148 | 119 |
149 void* GLContextEGL::GetHandle() { | 120 void* GLContextEGL::GetHandle() { |
150 return context_; | 121 return context_; |
151 } | 122 } |
152 | 123 |
153 void GLContextEGL::SetSwapInterval(int interval) { | 124 void GLContextEGL::SetSwapInterval(int interval) { |
154 DCHECK(IsCurrent()); | 125 DCHECK(IsCurrent(NULL)); |
155 if (!eglSwapInterval(GLSurfaceEGL::GetDisplay(), interval)) { | 126 if (!eglSwapInterval(GLSurfaceEGL::GetDisplay(), interval)) { |
156 LOG(ERROR) << "eglSwapInterval failed with error " | 127 LOG(ERROR) << "eglSwapInterval failed with error " |
157 << GetLastEGLErrorString(); | 128 << GetLastEGLErrorString(); |
158 } | 129 } |
159 } | 130 } |
160 | 131 |
161 } // namespace gfx | 132 } // namespace gfx |
OLD | NEW |