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 "webkit/gpu/webgraphicscontext3d_in_process_impl.h" | 5 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <string> | 10 #include <string> |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 bool render_directly_to_web_view) { | 107 bool render_directly_to_web_view) { |
108 if (!gfx::GLSurface::InitializeOneOff()) | 108 if (!gfx::GLSurface::InitializeOneOff()) |
109 return false; | 109 return false; |
110 gfx::BindSkiaToInProcessGL(); | 110 gfx::BindSkiaToInProcessGL(); |
111 | 111 |
112 render_directly_to_web_view_ = render_directly_to_web_view; | 112 render_directly_to_web_view_ = render_directly_to_web_view; |
113 gfx::GLShareGroup* share_group = 0; | 113 gfx::GLShareGroup* share_group = 0; |
114 | 114 |
115 if (!render_directly_to_web_view) { | 115 if (!render_directly_to_web_view) { |
116 // Pick up the compositor's context to share resources with. | 116 // Pick up the compositor's context to share resources with. |
117 WebGraphicsContext3D* view_context = webView->graphicsContext3D(); | 117 WebGraphicsContext3D* view_context = webView ? |
| 118 webView->graphicsContext3D() : NULL; |
118 if (view_context) { | 119 if (view_context) { |
119 WebGraphicsContext3DInProcessImpl* contextImpl = | 120 WebGraphicsContext3DInProcessImpl* contextImpl = |
120 static_cast<WebGraphicsContext3DInProcessImpl*>(view_context); | 121 static_cast<WebGraphicsContext3DInProcessImpl*>(view_context); |
121 share_group = contextImpl->gl_context_->share_group(); | 122 share_group = contextImpl->gl_context_->share_group(); |
122 } else { | 123 } else { |
123 // The compositor's context didn't get created | 124 // The compositor's context didn't get created |
124 // successfully, so conceptually there is no way we can | 125 // successfully, so conceptually there is no way we can |
125 // render successfully to the WebView. | 126 // render successfully to the WebView. |
126 render_directly_to_web_view_ = false; | 127 render_directly_to_web_view_ = false; |
127 } | 128 } |
(...skipping 13 matching lines...) Expand all Loading... |
141 if (!is_gles2_) | 142 if (!is_gles2_) |
142 return false; | 143 return false; |
143 | 144 |
144 // Embedded systems have smaller limit on number of GL contexts. Sometimes | 145 // Embedded systems have smaller limit on number of GL contexts. Sometimes |
145 // failure of GL context creation is because of existing GL contexts | 146 // failure of GL context creation is because of existing GL contexts |
146 // referenced by JavaScript garbages. Collect garbage and try again. | 147 // referenced by JavaScript garbages. Collect garbage and try again. |
147 // TODO: Besides this solution, kbr@chromium.org suggested: upon receiving | 148 // TODO: Besides this solution, kbr@chromium.org suggested: upon receiving |
148 // a page unload event, iterate down any live WebGraphicsContext3D instances | 149 // a page unload event, iterate down any live WebGraphicsContext3D instances |
149 // and force them to drop their contexts, sending a context lost event if | 150 // and force them to drop their contexts, sending a context lost event if |
150 // necessary. | 151 // necessary. |
151 webView->mainFrame()->collectGarbage(); | 152 if (webView) webView->mainFrame()->collectGarbage(); |
152 | 153 |
153 gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(false, | 154 gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(false, |
154 gfx::Size(1, 1)); | 155 gfx::Size(1, 1)); |
155 if (!gl_surface_.get()) | 156 if (!gl_surface_.get()) |
156 return false; | 157 return false; |
157 } | 158 } |
158 | 159 |
159 gl_context_ = gfx::GLContext::CreateGLContext(share_group, | 160 gl_context_ = gfx::GLContext::CreateGLContext(share_group, |
160 gl_surface_.get()); | 161 gl_surface_.get()); |
161 if (!gl_context_.get()) { | 162 if (!gl_context_.get()) { |
162 if (!is_gles2_) | 163 if (!is_gles2_) |
163 return false; | 164 return false; |
164 | 165 |
165 // Embedded systems have smaller limit on number of GL contexts. Sometimes | 166 // Embedded systems have smaller limit on number of GL contexts. Sometimes |
166 // failure of GL context creation is because of existing GL contexts | 167 // failure of GL context creation is because of existing GL contexts |
167 // referenced by JavaScript garbages. Collect garbage and try again. | 168 // referenced by JavaScript garbages. Collect garbage and try again. |
168 // TODO: Besides this solution, kbr@chromium.org suggested: upon receiving | 169 // TODO: Besides this solution, kbr@chromium.org suggested: upon receiving |
169 // a page unload event, iterate down any live WebGraphicsContext3D instances | 170 // a page unload event, iterate down any live WebGraphicsContext3D instances |
170 // and force them to drop their contexts, sending a context lost event if | 171 // and force them to drop their contexts, sending a context lost event if |
171 // necessary. | 172 // necessary. |
172 webView->mainFrame()->collectGarbage(); | 173 if (webView) webView->mainFrame()->collectGarbage(); |
173 | 174 |
174 gl_context_ = gfx::GLContext::CreateGLContext(share_group, | 175 gl_context_ = gfx::GLContext::CreateGLContext(share_group, |
175 gl_surface_.get()); | 176 gl_surface_.get()); |
176 if (!gl_context_.get()) | 177 if (!gl_context_.get()) |
177 return false; | 178 return false; |
178 } | 179 } |
179 | 180 |
180 attributes_ = attributes; | 181 attributes_ = attributes; |
181 | 182 |
182 // FIXME: for the moment we disable multisampling for the compositor. | 183 // FIXME: for the moment we disable multisampling for the compositor. |
(...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 } | 1323 } |
1323 | 1324 |
1324 DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dclampf, WGC3Dboolean) | 1325 DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dclampf, WGC3Dboolean) |
1325 | 1326 |
1326 DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei) | 1327 DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei) |
1327 | 1328 |
1328 void WebGraphicsContext3DInProcessImpl::texImage2D( | 1329 void WebGraphicsContext3DInProcessImpl::texImage2D( |
1329 WGC3Denum target, WGC3Dint level, WGC3Denum internalFormat, | 1330 WGC3Denum target, WGC3Dint level, WGC3Denum internalFormat, |
1330 WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, | 1331 WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, |
1331 WGC3Denum format, WGC3Denum type, const void* pixels) { | 1332 WGC3Denum format, WGC3Denum type, const void* pixels) { |
1332 if (width && height && !pixels) { | |
1333 synthesizeGLError(GL_INVALID_VALUE); | |
1334 return; | |
1335 } | |
1336 makeContextCurrent(); | 1333 makeContextCurrent(); |
1337 glTexImage2D(target, level, internalFormat, | 1334 glTexImage2D(target, level, internalFormat, |
1338 width, height, border, format, type, pixels); | 1335 width, height, border, format, type, pixels); |
1339 } | 1336 } |
1340 | 1337 |
1341 void WebGraphicsContext3DInProcessImpl::shaderSource( | 1338 void WebGraphicsContext3DInProcessImpl::shaderSource( |
1342 WebGLId shader, const WGC3Dchar* source) { | 1339 WebGLId shader, const WGC3Dchar* source) { |
1343 makeContextCurrent(); | 1340 makeContextCurrent(); |
1344 GLint length = source ? strlen(source) : 0; | 1341 GLint length = source ? strlen(source) : 0; |
1345 ShaderSourceMap::iterator result = shader_source_map_.find(shader); | 1342 ShaderSourceMap::iterator result = shader_source_map_.find(shader); |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 if (length > 1) { | 1625 if (length > 1) { |
1629 entry->translated_source.reset(new char[length]); | 1626 entry->translated_source.reset(new char[length]); |
1630 ShGetObjectCode(compiler, entry->translated_source.get()); | 1627 ShGetObjectCode(compiler, entry->translated_source.get()); |
1631 } | 1628 } |
1632 entry->is_valid = true; | 1629 entry->is_valid = true; |
1633 return true; | 1630 return true; |
1634 } | 1631 } |
1635 | 1632 |
1636 } // namespace gpu | 1633 } // namespace gpu |
1637 } // namespace webkit | 1634 } // namespace webkit |
OLD | NEW |