Chromium Code Reviews| 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 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
| 6 | 6 |
| 7 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" | 7 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" |
| 8 | 8 |
| 9 #include <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
| 10 #ifndef GL_GLEXT_PROTOTYPES | 10 #ifndef GL_GLEXT_PROTOTYPES |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 // creation attributes. | 246 // creation attributes. |
| 247 memcpy(scanline, row_b, row_bytes); | 247 memcpy(scanline, row_b, row_bytes); |
| 248 memcpy(row_b, row_a, row_bytes); | 248 memcpy(row_b, row_a, row_bytes); |
| 249 memcpy(row_a, scanline, row_bytes); | 249 memcpy(row_a, scanline, row_bytes); |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 #endif | 252 #endif |
| 253 | 253 |
| 254 bool WebGraphicsContext3DCommandBufferImpl::readBackFramebuffer( | 254 bool WebGraphicsContext3DCommandBufferImpl::readBackFramebuffer( |
| 255 unsigned char* pixels, | 255 unsigned char* pixels, |
| 256 size_t buffer_size) { | 256 int width, |
| 257 if (buffer_size != static_cast<size_t>(4 * width() * height())) { | 257 int height, |
| 258 size_t buffer_size, | |
| 259 WebGLId buffer) { | |
| 260 if (buffer_size != static_cast<size_t>(4 * width * height)) { | |
| 258 return false; | 261 return false; |
| 259 } | 262 } |
| 260 | 263 |
| 261 // Earlier versions of this code used the GPU to flip the | 264 // Earlier versions of this code used the GPU to flip the |
| 262 // framebuffer vertically before reading it back for compositing | 265 // framebuffer vertically before reading it back for compositing |
| 263 // via software. This code was quite complicated, used a lot of | 266 // via software. This code was quite complicated, used a lot of |
| 264 // GPU memory, and didn't provide an obvious speedup. Since this | 267 // GPU memory, and didn't provide an obvious speedup. Since this |
| 265 // vertical flip is only a temporary solution anyway until Chrome | 268 // vertical flip is only a temporary solution anyway until Chrome |
| 266 // is fully GPU composited, it wasn't worth the complexity. | 269 // is fully GPU composited, it wasn't worth the complexity. |
| 267 | 270 |
| 268 bool mustRestoreFBO = (bound_fbo_ != 0); | 271 bool mustRestoreFBO = (bound_fbo_ != buffer); |
| 269 if (mustRestoreFBO) { | 272 if (mustRestoreFBO) { |
| 270 gl_->BindFramebuffer(GL_FRAMEBUFFER, 0); | 273 gl_->BindFramebuffer(GL_FRAMEBUFFER, buffer); |
| 271 } | 274 } |
|
Ken Russell (switch to Gerrit)
2011/08/04 22:55:07
Do you think we might want or need checks about th
jbauman
2011/08/04 23:20:21
Those can be expensive, so I'd rather avoid them (
| |
| 272 gl_->ReadPixels(0, 0, cached_width_, cached_height_, | 275 gl_->ReadPixels(0, 0, width, height, |
| 273 GL_RGBA, GL_UNSIGNED_BYTE, pixels); | 276 GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| 274 | 277 |
| 275 // Swizzle red and blue channels | 278 // Swizzle red and blue channels |
| 276 // TODO(kbr): expose GL_BGRA as extension | 279 // TODO(kbr): expose GL_BGRA as extension |
| 277 for (size_t i = 0; i < buffer_size; i += 4) { | 280 for (size_t i = 0; i < buffer_size; i += 4) { |
| 278 std::swap(pixels[i], pixels[i + 2]); | 281 std::swap(pixels[i], pixels[i + 2]); |
| 279 } | 282 } |
| 280 | 283 |
| 281 if (mustRestoreFBO) { | 284 if (mustRestoreFBO) { |
| 282 gl_->BindFramebuffer(GL_FRAMEBUFFER, bound_fbo_); | 285 gl_->BindFramebuffer(GL_FRAMEBUFFER, bound_fbo_); |
| 283 } | 286 } |
| 284 | 287 |
| 285 #ifdef FLIP_FRAMEBUFFER_VERTICALLY | 288 #ifdef FLIP_FRAMEBUFFER_VERTICALLY |
| 286 if (pixels) { | 289 if (pixels) { |
| 287 FlipVertically(pixels, cached_width_, cached_height_); | 290 FlipVertically(pixels, width, height); |
| 288 } | 291 } |
| 289 #endif | 292 #endif |
| 290 | 293 |
| 291 return true; | 294 return true; |
| 292 } | 295 } |
| 293 | 296 |
| 297 bool WebGraphicsContext3DCommandBufferImpl::readBackFramebuffer( | |
| 298 unsigned char* pixels, | |
| 299 size_t buffer_size) { | |
| 300 return readBackFramebuffer(pixels, width(), height(), buffer_size, 0); | |
| 301 } | |
| 302 | |
| 294 void WebGraphicsContext3DCommandBufferImpl::synthesizeGLError( | 303 void WebGraphicsContext3DCommandBufferImpl::synthesizeGLError( |
| 295 WGC3Denum error) { | 304 WGC3Denum error) { |
| 296 if (find(synthetic_errors_.begin(), synthetic_errors_.end(), error) == | 305 if (find(synthetic_errors_.begin(), synthetic_errors_.end(), error) == |
| 297 synthetic_errors_.end()) { | 306 synthetic_errors_.end()) { |
| 298 synthetic_errors_.push_back(error); | 307 synthetic_errors_.push_back(error); |
| 299 } | 308 } |
| 300 } | 309 } |
| 301 | 310 |
| 302 void* WebGraphicsContext3DCommandBufferImpl::mapBufferSubDataCHROMIUM( | 311 void* WebGraphicsContext3DCommandBufferImpl::mapBufferSubDataCHROMIUM( |
| 303 WGC3Denum target, | 312 WGC3Denum target, |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1028 context_lost_callback_->onContextLost(); | 1037 context_lost_callback_->onContextLost(); |
| 1029 } | 1038 } |
| 1030 | 1039 |
| 1031 RenderView* renderview = | 1040 RenderView* renderview = |
| 1032 web_view_ ? RenderView::FromWebView(web_view_) : NULL; | 1041 web_view_ ? RenderView::FromWebView(web_view_) : NULL; |
| 1033 if (renderview) | 1042 if (renderview) |
| 1034 renderview->OnViewContextSwapBuffersAborted(); | 1043 renderview->OnViewContextSwapBuffersAborted(); |
| 1035 } | 1044 } |
| 1036 | 1045 |
| 1037 #endif // defined(ENABLE_GPU) | 1046 #endif // defined(ENABLE_GPU) |
| OLD | NEW |