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 "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 ScopedFrameBufferBinder(GLES2DecoderImpl* decoder, GLuint id); | 212 ScopedFrameBufferBinder(GLES2DecoderImpl* decoder, GLuint id); |
213 ~ScopedFrameBufferBinder(); | 213 ~ScopedFrameBufferBinder(); |
214 | 214 |
215 private: | 215 private: |
216 GLES2DecoderImpl* decoder_; | 216 GLES2DecoderImpl* decoder_; |
217 DISALLOW_COPY_AND_ASSIGN(ScopedFrameBufferBinder); | 217 DISALLOW_COPY_AND_ASSIGN(ScopedFrameBufferBinder); |
218 }; | 218 }; |
219 | 219 |
220 // Temporarily changes a decoder's bound frame buffer to a resolved version of | 220 // Temporarily changes a decoder's bound frame buffer to a resolved version of |
221 // the multisampled offscreen render buffer if that buffer is multisampled, and, | 221 // the multisampled offscreen render buffer if that buffer is multisampled, and, |
222 // if it is bound or enforce_internal_framebuffer is true. | 222 // if it is bound or enforce_internal_framebuffer is true. If internal is |
| 223 // true, the resolved framebuffer is not visible to the parent. |
223 class ScopedResolvedFrameBufferBinder { | 224 class ScopedResolvedFrameBufferBinder { |
224 public: | 225 public: |
225 ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder, | 226 ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder, |
226 bool enforce_internal_framebuffer); | 227 bool enforce_internal_framebuffer, |
| 228 bool internal); |
227 ~ScopedResolvedFrameBufferBinder(); | 229 ~ScopedResolvedFrameBufferBinder(); |
228 | 230 |
229 private: | 231 private: |
230 GLES2DecoderImpl* decoder_; | 232 GLES2DecoderImpl* decoder_; |
231 bool resolve_and_bind_; | 233 bool resolve_and_bind_; |
232 DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder); | 234 DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder); |
233 }; | 235 }; |
234 | 236 |
235 // Encapsulates an OpenGL texture. | 237 // Encapsulates an OpenGL texture. |
236 class Texture { | 238 class Texture { |
(...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 scoped_ptr<RenderBuffer> offscreen_target_color_render_buffer_; | 1280 scoped_ptr<RenderBuffer> offscreen_target_color_render_buffer_; |
1279 scoped_ptr<RenderBuffer> offscreen_target_depth_render_buffer_; | 1281 scoped_ptr<RenderBuffer> offscreen_target_depth_render_buffer_; |
1280 scoped_ptr<RenderBuffer> offscreen_target_stencil_render_buffer_; | 1282 scoped_ptr<RenderBuffer> offscreen_target_stencil_render_buffer_; |
1281 GLenum offscreen_target_color_format_; | 1283 GLenum offscreen_target_color_format_; |
1282 GLenum offscreen_target_depth_format_; | 1284 GLenum offscreen_target_depth_format_; |
1283 GLenum offscreen_target_stencil_format_; | 1285 GLenum offscreen_target_stencil_format_; |
1284 GLsizei offscreen_target_samples_; | 1286 GLsizei offscreen_target_samples_; |
1285 | 1287 |
1286 GLuint copy_texture_to_parent_texture_fb_; | 1288 GLuint copy_texture_to_parent_texture_fb_; |
1287 | 1289 |
1288 // The copy that is saved when SwapBuffers is called. It is also | 1290 // The copy that is saved when SwapBuffers is called. |
1289 // used as the destination for multi-sample resolves. | |
1290 scoped_ptr<FrameBuffer> offscreen_saved_frame_buffer_; | 1291 scoped_ptr<FrameBuffer> offscreen_saved_frame_buffer_; |
1291 scoped_ptr<Texture> offscreen_saved_color_texture_; | 1292 scoped_ptr<Texture> offscreen_saved_color_texture_; |
| 1293 |
| 1294 // The copy that is used as the destination for multi-sample resolves. |
| 1295 scoped_ptr<FrameBuffer> offscreen_resolved_frame_buffer_; |
| 1296 scoped_ptr<Texture> offscreen_resolved_color_texture_; |
1292 GLenum offscreen_saved_color_format_; | 1297 GLenum offscreen_saved_color_format_; |
1293 | 1298 |
1294 scoped_ptr<Callback1<gfx::Size>::Type> resize_callback_; | 1299 scoped_ptr<Callback1<gfx::Size>::Type> resize_callback_; |
1295 scoped_ptr<Callback0::Type> swap_buffers_callback_; | 1300 scoped_ptr<Callback0::Type> swap_buffers_callback_; |
1296 | 1301 |
1297 // The format of the back buffer_ | 1302 // The format of the back buffer_ |
1298 GLenum back_buffer_color_format_; | 1303 GLenum back_buffer_color_format_; |
1299 bool back_buffer_has_depth_; | 1304 bool back_buffer_has_depth_; |
1300 bool back_buffer_has_stencil_; | 1305 bool back_buffer_has_stencil_; |
1301 | 1306 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 ScopedGLErrorSuppressor suppressor(decoder_); | 1378 ScopedGLErrorSuppressor suppressor(decoder_); |
1374 glBindFramebufferEXT(GL_FRAMEBUFFER, id); | 1379 glBindFramebufferEXT(GL_FRAMEBUFFER, id); |
1375 } | 1380 } |
1376 | 1381 |
1377 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() { | 1382 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() { |
1378 ScopedGLErrorSuppressor suppressor(decoder_); | 1383 ScopedGLErrorSuppressor suppressor(decoder_); |
1379 decoder_->RestoreCurrentFramebufferBindings(); | 1384 decoder_->RestoreCurrentFramebufferBindings(); |
1380 } | 1385 } |
1381 | 1386 |
1382 ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder( | 1387 ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder( |
1383 GLES2DecoderImpl* decoder, bool enforce_internal_framebuffer) | 1388 GLES2DecoderImpl* decoder, bool enforce_internal_framebuffer, bool internal) |
1384 : decoder_(decoder) { | 1389 : decoder_(decoder) { |
1385 resolve_and_bind_ = (decoder_->offscreen_target_frame_buffer_.get() && | 1390 resolve_and_bind_ = (decoder_->offscreen_target_frame_buffer_.get() && |
1386 decoder_->IsOffscreenBufferMultisampled() && | 1391 decoder_->IsOffscreenBufferMultisampled() && |
1387 (!decoder_->bound_read_framebuffer_.get() || | 1392 (!decoder_->bound_read_framebuffer_.get() || |
1388 enforce_internal_framebuffer)); | 1393 enforce_internal_framebuffer)); |
1389 if (!resolve_and_bind_) | 1394 if (!resolve_and_bind_) |
1390 return; | 1395 return; |
1391 | 1396 |
1392 ScopedGLErrorSuppressor suppressor(decoder_); | 1397 ScopedGLErrorSuppressor suppressor(decoder_); |
1393 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, | 1398 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, |
1394 decoder_->offscreen_target_frame_buffer_->id()); | 1399 decoder_->offscreen_target_frame_buffer_->id()); |
1395 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, | 1400 GLuint targetid; |
1396 decoder_->offscreen_saved_frame_buffer_->id()); | 1401 if (internal) { |
| 1402 if (!decoder_->offscreen_resolved_frame_buffer_.get()) { |
| 1403 decoder_->offscreen_resolved_frame_buffer_.reset( |
| 1404 new FrameBuffer(decoder_)); |
| 1405 decoder_->offscreen_resolved_frame_buffer_->Create(); |
| 1406 decoder_->offscreen_resolved_color_texture_.reset(new Texture(decoder_)); |
| 1407 decoder_->offscreen_resolved_color_texture_->Create(); |
| 1408 |
| 1409 DCHECK(decoder_->offscreen_saved_color_format_); |
| 1410 decoder_->offscreen_resolved_color_texture_->AllocateStorage( |
| 1411 decoder_->offscreen_size_, decoder_->offscreen_saved_color_format_); |
| 1412 |
| 1413 decoder_->offscreen_resolved_frame_buffer_->AttachRenderTexture( |
| 1414 decoder_->offscreen_resolved_color_texture_.get()); |
| 1415 if (decoder_->offscreen_resolved_frame_buffer_->CheckStatus() != |
| 1416 GL_FRAMEBUFFER_COMPLETE) { |
| 1417 LOG(ERROR) << "ScopedResolvedFrameBufferBinder failed " |
| 1418 << "because offscreen resolved FBO was incomplete."; |
| 1419 return; |
| 1420 } |
| 1421 } |
| 1422 targetid = decoder_->offscreen_resolved_frame_buffer_->id(); |
| 1423 } else { |
| 1424 targetid = decoder_->offscreen_saved_frame_buffer_->id(); |
| 1425 } |
| 1426 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, targetid); |
1397 const int width = decoder_->offscreen_size_.width(); | 1427 const int width = decoder_->offscreen_size_.width(); |
1398 const int height = decoder_->offscreen_size_.height(); | 1428 const int height = decoder_->offscreen_size_.height(); |
1399 glDisable(GL_SCISSOR_TEST); | 1429 glDisable(GL_SCISSOR_TEST); |
1400 if (IsAngle()) { | 1430 if (IsAngle()) { |
1401 glBlitFramebufferANGLE(0, 0, width, height, 0, 0, width, height, | 1431 glBlitFramebufferANGLE(0, 0, width, height, 0, 0, width, height, |
1402 GL_COLOR_BUFFER_BIT, GL_NEAREST); | 1432 GL_COLOR_BUFFER_BIT, GL_NEAREST); |
1403 } else { | 1433 } else { |
1404 glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, | 1434 glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, |
1405 GL_COLOR_BUFFER_BIT, GL_NEAREST); | 1435 GL_COLOR_BUFFER_BIT, GL_NEAREST); |
1406 } | 1436 } |
1407 glBindFramebufferEXT(GL_FRAMEBUFFER, | 1437 glBindFramebufferEXT(GL_FRAMEBUFFER, targetid); |
1408 decoder_->offscreen_saved_frame_buffer_->id()); | |
1409 } | 1438 } |
1410 | 1439 |
1411 ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { | 1440 ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { |
1412 if (!resolve_and_bind_) | 1441 if (!resolve_and_bind_) |
1413 return; | 1442 return; |
1414 | 1443 |
1415 ScopedGLErrorSuppressor suppressor(decoder_); | 1444 ScopedGLErrorSuppressor suppressor(decoder_); |
1416 decoder_->RestoreCurrentFramebufferBindings(); | 1445 decoder_->RestoreCurrentFramebufferBindings(); |
1417 if (decoder_->enable_scissor_test_) { | 1446 if (decoder_->enable_scissor_test_) { |
1418 glEnable(GL_SCISSOR_TEST); | 1447 glEnable(GL_SCISSOR_TEST); |
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2308 | 2337 |
2309 offscreen_saved_frame_buffer_->AttachRenderTexture( | 2338 offscreen_saved_frame_buffer_->AttachRenderTexture( |
2310 offscreen_saved_color_texture_.get()); | 2339 offscreen_saved_color_texture_.get()); |
2311 if (offscreen_saved_frame_buffer_->CheckStatus() != | 2340 if (offscreen_saved_frame_buffer_->CheckStatus() != |
2312 GL_FRAMEBUFFER_COMPLETE) { | 2341 GL_FRAMEBUFFER_COMPLETE) { |
2313 LOG(ERROR) << "GLES2DecoderImpl::UpdateOffscreenFrameBufferSize failed " | 2342 LOG(ERROR) << "GLES2DecoderImpl::UpdateOffscreenFrameBufferSize failed " |
2314 << "because offscreen saved FBO was incomplete."; | 2343 << "because offscreen saved FBO was incomplete."; |
2315 return false; | 2344 return false; |
2316 } | 2345 } |
2317 | 2346 |
| 2347 // Destroy the offscreen resolved framebuffers. |
| 2348 if (offscreen_resolved_frame_buffer_.get()) |
| 2349 offscreen_resolved_frame_buffer_->Destroy(); |
| 2350 if (offscreen_resolved_color_texture_.get()) |
| 2351 offscreen_resolved_color_texture_->Destroy(); |
| 2352 offscreen_resolved_color_texture_.reset(); |
| 2353 offscreen_resolved_frame_buffer_.reset(); |
| 2354 |
2318 // Clear the offscreen color texture. | 2355 // Clear the offscreen color texture. |
2319 { | 2356 { |
2320 ScopedFrameBufferBinder binder(this, offscreen_saved_frame_buffer_->id()); | 2357 ScopedFrameBufferBinder binder(this, offscreen_saved_frame_buffer_->id()); |
2321 glClearColor(0, 0, 0, 0); | 2358 glClearColor(0, 0, 0, 0); |
2322 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 2359 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
2323 glDisable(GL_SCISSOR_TEST); | 2360 glDisable(GL_SCISSOR_TEST); |
2324 glClear(GL_COLOR_BUFFER_BIT); | 2361 glClear(GL_COLOR_BUFFER_BIT); |
2325 RestoreClearState(); | 2362 RestoreClearState(); |
2326 } | 2363 } |
2327 | 2364 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2427 if (offscreen_target_color_render_buffer_.get()) | 2464 if (offscreen_target_color_render_buffer_.get()) |
2428 offscreen_target_color_render_buffer_->Destroy(); | 2465 offscreen_target_color_render_buffer_->Destroy(); |
2429 if (offscreen_target_depth_render_buffer_.get()) | 2466 if (offscreen_target_depth_render_buffer_.get()) |
2430 offscreen_target_depth_render_buffer_->Destroy(); | 2467 offscreen_target_depth_render_buffer_->Destroy(); |
2431 if (offscreen_target_stencil_render_buffer_.get()) | 2468 if (offscreen_target_stencil_render_buffer_.get()) |
2432 offscreen_target_stencil_render_buffer_->Destroy(); | 2469 offscreen_target_stencil_render_buffer_->Destroy(); |
2433 if (offscreen_saved_frame_buffer_.get()) | 2470 if (offscreen_saved_frame_buffer_.get()) |
2434 offscreen_saved_frame_buffer_->Destroy(); | 2471 offscreen_saved_frame_buffer_->Destroy(); |
2435 if (offscreen_saved_color_texture_.get()) | 2472 if (offscreen_saved_color_texture_.get()) |
2436 offscreen_saved_color_texture_->Destroy(); | 2473 offscreen_saved_color_texture_->Destroy(); |
| 2474 if (offscreen_resolved_frame_buffer_.get()) |
| 2475 offscreen_resolved_frame_buffer_->Destroy(); |
| 2476 if (offscreen_resolved_color_texture_.get()) |
| 2477 offscreen_resolved_color_texture_->Destroy(); |
2437 | 2478 |
2438 // must release the ContextGroup before destroying the context as its | 2479 // must release the ContextGroup before destroying the context as its |
2439 // destructor uses GL. | 2480 // destructor uses GL. |
2440 group_ = NULL; | 2481 group_ = NULL; |
2441 } else { | 2482 } else { |
2442 if (offscreen_target_frame_buffer_.get()) | 2483 if (offscreen_target_frame_buffer_.get()) |
2443 offscreen_target_frame_buffer_->Invalidate(); | 2484 offscreen_target_frame_buffer_->Invalidate(); |
2444 if (offscreen_target_color_texture_.get()) | 2485 if (offscreen_target_color_texture_.get()) |
2445 offscreen_target_color_texture_->Invalidate(); | 2486 offscreen_target_color_texture_->Invalidate(); |
2446 if (offscreen_target_color_render_buffer_.get()) | 2487 if (offscreen_target_color_render_buffer_.get()) |
2447 offscreen_target_color_render_buffer_->Invalidate(); | 2488 offscreen_target_color_render_buffer_->Invalidate(); |
2448 if (offscreen_target_depth_render_buffer_.get()) | 2489 if (offscreen_target_depth_render_buffer_.get()) |
2449 offscreen_target_depth_render_buffer_->Invalidate(); | 2490 offscreen_target_depth_render_buffer_->Invalidate(); |
2450 if (offscreen_target_stencil_render_buffer_.get()) | 2491 if (offscreen_target_stencil_render_buffer_.get()) |
2451 offscreen_target_stencil_render_buffer_->Invalidate(); | 2492 offscreen_target_stencil_render_buffer_->Invalidate(); |
2452 if (offscreen_saved_frame_buffer_.get()) | 2493 if (offscreen_saved_frame_buffer_.get()) |
2453 offscreen_saved_frame_buffer_->Invalidate(); | 2494 offscreen_saved_frame_buffer_->Invalidate(); |
2454 if (offscreen_saved_color_texture_.get()) | 2495 if (offscreen_saved_color_texture_.get()) |
2455 offscreen_saved_color_texture_->Invalidate(); | 2496 offscreen_saved_color_texture_->Invalidate(); |
| 2497 if (offscreen_resolved_frame_buffer_.get()) |
| 2498 offscreen_resolved_frame_buffer_->Invalidate(); |
| 2499 if (offscreen_resolved_color_texture_.get()) |
| 2500 offscreen_resolved_color_texture_->Invalidate(); |
2456 } | 2501 } |
2457 | 2502 |
2458 if (context_.get()) { | 2503 if (context_.get()) { |
2459 context_->ReleaseCurrent(NULL); | 2504 context_->ReleaseCurrent(NULL); |
2460 context_->Destroy(); | 2505 context_->Destroy(); |
2461 } | 2506 } |
2462 context_ = NULL; | 2507 context_ = NULL; |
2463 | 2508 |
2464 offscreen_target_frame_buffer_.reset(); | 2509 offscreen_target_frame_buffer_.reset(); |
2465 offscreen_target_color_texture_.reset(); | 2510 offscreen_target_color_texture_.reset(); |
2466 offscreen_target_color_render_buffer_.reset(); | 2511 offscreen_target_color_render_buffer_.reset(); |
2467 offscreen_target_depth_render_buffer_.reset(); | 2512 offscreen_target_depth_render_buffer_.reset(); |
2468 offscreen_target_stencil_render_buffer_.reset(); | 2513 offscreen_target_stencil_render_buffer_.reset(); |
2469 offscreen_saved_frame_buffer_.reset(); | 2514 offscreen_saved_frame_buffer_.reset(); |
2470 offscreen_saved_color_texture_.reset(); | 2515 offscreen_saved_color_texture_.reset(); |
| 2516 offscreen_resolved_frame_buffer_.reset(); |
| 2517 offscreen_resolved_color_texture_.reset(); |
2471 } | 2518 } |
2472 | 2519 |
2473 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, | 2520 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, |
2474 uint32 new_parent_texture_id) { | 2521 uint32 new_parent_texture_id) { |
2475 if (!offscreen_saved_color_texture_.get()) | 2522 if (!offscreen_saved_color_texture_.get()) |
2476 return false; | 2523 return false; |
2477 | 2524 |
2478 // Remove the saved frame buffer mapping from the parent decoder. The | 2525 // Remove the saved frame buffer mapping from the parent decoder. The |
2479 // parent pointer is a weak pointer so it will be null if the parent has | 2526 // parent pointer is a weak pointer so it will be null if the parent has |
2480 // already been destroyed. | 2527 // already been destroyed. |
(...skipping 2627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5108 if (!validators_->pixel_type.IsValid(type)) { | 5155 if (!validators_->pixel_type.IsValid(type)) { |
5109 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); | 5156 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); |
5110 return error::kNoError; | 5157 return error::kNoError; |
5111 } | 5158 } |
5112 if (width == 0 || height == 0) { | 5159 if (width == 0 || height == 0) { |
5113 return error::kNoError; | 5160 return error::kNoError; |
5114 } | 5161 } |
5115 | 5162 |
5116 CopyRealGLErrorsToWrapper(); | 5163 CopyRealGLErrorsToWrapper(); |
5117 | 5164 |
5118 ScopedResolvedFrameBufferBinder binder(this, false); | 5165 ScopedResolvedFrameBufferBinder binder(this, false, true); |
5119 | 5166 |
5120 // Get the size of the current fbo or backbuffer. | 5167 // Get the size of the current fbo or backbuffer. |
5121 gfx::Size max_size = GetBoundReadFrameBufferSize(); | 5168 gfx::Size max_size = GetBoundReadFrameBufferSize(); |
5122 | 5169 |
5123 GLint max_x; | 5170 GLint max_x; |
5124 GLint max_y; | 5171 GLint max_y; |
5125 if (!SafeAdd(x, width, &max_x) || !SafeAdd(y, height, &max_y)) { | 5172 if (!SafeAdd(x, width, &max_x) || !SafeAdd(y, height, &max_y)) { |
5126 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); | 5173 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); |
5127 return error::kNoError; | 5174 return error::kNoError; |
5128 } | 5175 } |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5895 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 5942 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
5896 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 5943 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
5897 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format); | 5944 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format); |
5898 | 5945 |
5899 if ((channels_needed & channels_exist) != channels_needed) { | 5946 if ((channels_needed & channels_exist) != channels_needed) { |
5900 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D: incompatible format"); | 5947 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D: incompatible format"); |
5901 return; | 5948 return; |
5902 } | 5949 } |
5903 | 5950 |
5904 CopyRealGLErrorsToWrapper(); | 5951 CopyRealGLErrorsToWrapper(); |
5905 ScopedResolvedFrameBufferBinder binder(this, false); | 5952 ScopedResolvedFrameBufferBinder binder(this, false, true); |
5906 gfx::Size size = GetBoundReadFrameBufferSize(); | 5953 gfx::Size size = GetBoundReadFrameBufferSize(); |
5907 | 5954 |
5908 if (info->IsAttachedToFramebuffer()) { | 5955 if (info->IsAttachedToFramebuffer()) { |
5909 state_dirty_ = true; | 5956 state_dirty_ = true; |
5910 } | 5957 } |
5911 | 5958 |
5912 // Clip to size to source dimensions | 5959 // Clip to size to source dimensions |
5913 GLint copyX = 0; | 5960 GLint copyX = 0; |
5914 GLint copyY = 0; | 5961 GLint copyY = 0; |
5915 GLint copyWidth = 0; | 5962 GLint copyWidth = 0; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5983 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 6030 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
5984 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 6031 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
5985 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format); | 6032 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format); |
5986 | 6033 |
5987 if ((channels_needed & channels_exist) != channels_needed) { | 6034 if ((channels_needed & channels_exist) != channels_needed) { |
5988 SetGLError( | 6035 SetGLError( |
5989 GL_INVALID_OPERATION, "glCopyTexSubImage2D: incompatible format"); | 6036 GL_INVALID_OPERATION, "glCopyTexSubImage2D: incompatible format"); |
5990 return; | 6037 return; |
5991 } | 6038 } |
5992 | 6039 |
5993 ScopedResolvedFrameBufferBinder binder(this, false); | 6040 ScopedResolvedFrameBufferBinder binder(this, false, true); |
5994 gfx::Size size = GetBoundReadFrameBufferSize(); | 6041 gfx::Size size = GetBoundReadFrameBufferSize(); |
5995 GLint copyX = 0; | 6042 GLint copyX = 0; |
5996 GLint copyY = 0; | 6043 GLint copyY = 0; |
5997 GLint copyWidth = 0; | 6044 GLint copyWidth = 0; |
5998 GLint copyHeight = 0; | 6045 GLint copyHeight = 0; |
5999 Clip(x, width, size.width(), ©X, ©Width); | 6046 Clip(x, width, size.width(), ©X, ©Width); |
6000 Clip(y, height, size.height(), ©Y, ©Height); | 6047 Clip(y, height, size.height(), ©Y, ©Height); |
6001 if (copyX != x || | 6048 if (copyX != x || |
6002 copyY != y || | 6049 copyY != y || |
6003 copyWidth != width || | 6050 copyWidth != width || |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6526 // pending. | 6573 // pending. |
6527 if (!UpdateOffscreenFrameBufferSize()) { | 6574 if (!UpdateOffscreenFrameBufferSize()) { |
6528 LOG(ERROR) << "Context lost because reallocation of offscreen FBO " | 6575 LOG(ERROR) << "Context lost because reallocation of offscreen FBO " |
6529 << "failed."; | 6576 << "failed."; |
6530 return error::kLostContext; | 6577 return error::kLostContext; |
6531 } | 6578 } |
6532 | 6579 |
6533 if (IsOffscreenBufferMultisampled()) { | 6580 if (IsOffscreenBufferMultisampled()) { |
6534 // For multisampled buffers, bind the resolved frame buffer so that | 6581 // For multisampled buffers, bind the resolved frame buffer so that |
6535 // callbacks can call ReadPixels or CopyTexImage2D. | 6582 // callbacks can call ReadPixels or CopyTexImage2D. |
6536 ScopedResolvedFrameBufferBinder binder(this, true); | 6583 ScopedResolvedFrameBufferBinder binder(this, true, false); |
6537 if (swap_buffers_callback_.get()) { | 6584 if (swap_buffers_callback_.get()) { |
6538 swap_buffers_callback_->Run(); | 6585 swap_buffers_callback_->Run(); |
6539 } | 6586 } |
6540 return error::kNoError; | 6587 return error::kNoError; |
6541 } else { | 6588 } else { |
6542 ScopedFrameBufferBinder binder(this, | 6589 ScopedFrameBufferBinder binder(this, |
6543 offscreen_target_frame_buffer_->id()); | 6590 offscreen_target_frame_buffer_->id()); |
6544 | 6591 |
6545 if (surface_->IsOffscreen()) { | 6592 if (surface_->IsOffscreen()) { |
6546 // Copy the target frame buffer to the saved offscreen texture. | 6593 // Copy the target frame buffer to the saved offscreen texture. |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6792 return false; | 6839 return false; |
6793 } | 6840 } |
6794 | 6841 |
6795 // Include the auto-generated part of this file. We split this because it means | 6842 // Include the auto-generated part of this file. We split this because it means |
6796 // we can easily edit the non-auto generated parts right here in this file | 6843 // we can easily edit the non-auto generated parts right here in this file |
6797 // instead of having to edit some template or the code generator. | 6844 // instead of having to edit some template or the code generator. |
6798 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 6845 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
6799 | 6846 |
6800 } // namespace gles2 | 6847 } // namespace gles2 |
6801 } // namespace gpu | 6848 } // namespace gpu |
OLD | NEW |