Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(336)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 7795015: Delay resize of the front buffer until the swap for offscreen buffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2516 matching lines...) Expand 10 before | Expand all | Expand 10 after
2527 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 2527 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
2528 glClearStencil(0); 2528 glClearStencil(0);
2529 glStencilMaskSeparate(GL_FRONT, -1); 2529 glStencilMaskSeparate(GL_FRONT, -1);
2530 glStencilMaskSeparate(GL_BACK, -1); 2530 glStencilMaskSeparate(GL_BACK, -1);
2531 glClearDepth(0); 2531 glClearDepth(0);
2532 glDepthMask(GL_TRUE); 2532 glDepthMask(GL_TRUE);
2533 glDisable(GL_SCISSOR_TEST); 2533 glDisable(GL_SCISSOR_TEST);
2534 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 2534 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2535 RestoreClearState(); 2535 RestoreClearState();
2536 } 2536 }
2537
2538 // Workaround for NVIDIA driver bug on OS X; crbug.com/89557,
2539 // crbug.com/94103. TODO(kbr): figure out reproduction so Apple will
2540 // fix this.
2541 if (needs_mac_nvidia_driver_workaround_) {
2542 offscreen_saved_frame_buffer_->Create();
2543 glFinish();
2544 }
2545
2546 // Allocate the offscreen saved color texture.
2547 DCHECK(offscreen_saved_color_format_);
2548 offscreen_saved_color_texture_->AllocateStorage(
2549 offscreen_size_, offscreen_saved_color_format_);
2550
2551 offscreen_saved_frame_buffer_->AttachRenderTexture(
2552 offscreen_saved_color_texture_.get());
2553 if (offscreen_saved_frame_buffer_->CheckStatus() !=
2554 GL_FRAMEBUFFER_COMPLETE) {
2555 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed "
2556 << "because offscreen saved FBO was incomplete.";
2557 return false;
2558 }
2559
2560 // Destroy the offscreen resolved framebuffers.
2561 if (offscreen_resolved_frame_buffer_.get())
2562 offscreen_resolved_frame_buffer_->Destroy();
2563 if (offscreen_resolved_color_texture_.get())
2564 offscreen_resolved_color_texture_->Destroy();
2565 offscreen_resolved_color_texture_.reset();
2566 offscreen_resolved_frame_buffer_.reset();
2567
2568 // Clear the offscreen color texture.
2569 {
2570 ScopedFrameBufferBinder binder(this, offscreen_saved_frame_buffer_->id());
2571 glClearColor(0, 0, 0, 0);
2572 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
2573 glDisable(GL_SCISSOR_TEST);
2574 glClear(GL_COLOR_BUFFER_BIT);
2575 RestoreClearState();
2576 }
2577
2578 UpdateParentTextureInfo();
2579
2580 return true; 2537 return true;
2581 } 2538 }
2582 2539
2583 error::Error GLES2DecoderImpl::HandleResizeCHROMIUM( 2540 error::Error GLES2DecoderImpl::HandleResizeCHROMIUM(
2584 uint32 immediate_data_size, const gles2::ResizeCHROMIUM& c) { 2541 uint32 immediate_data_size, const gles2::ResizeCHROMIUM& c) {
2585 GLuint width = static_cast<GLuint>(c.width); 2542 GLuint width = static_cast<GLuint>(c.width);
2586 GLuint height = static_cast<GLuint>(c.height); 2543 GLuint height = static_cast<GLuint>(c.height);
2587 TRACE_EVENT2("gpu", "glResizeChromium", "width", width, "height", height); 2544 TRACE_EVENT2("gpu", "glResizeChromium", "width", width, "height", height);
2588 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(TOUCH_UI) 2545 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(TOUCH_UI)
2589 // Make sure that we are done drawing to the back buffer before resizing. 2546 // Make sure that we are done drawing to the back buffer before resizing.
(...skipping 3985 matching lines...) Expand 10 before | Expand all | Expand 10 after
6575 error::Error GLES2DecoderImpl::HandleSwapBuffers( 6532 error::Error GLES2DecoderImpl::HandleSwapBuffers(
6576 uint32 immediate_data_size, const gles2::SwapBuffers& c) { 6533 uint32 immediate_data_size, const gles2::SwapBuffers& c) {
6577 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); 6534 bool is_offscreen = !!offscreen_target_frame_buffer_.get();
6578 int this_frame_number = frame_number_++; 6535 int this_frame_number = frame_number_++;
6579 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleSwapBuffers", 6536 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleSwapBuffers",
6580 "offscreen", is_offscreen, 6537 "offscreen", is_offscreen,
6581 "frame", this_frame_number); 6538 "frame", this_frame_number);
6582 // If offscreen then don't actually SwapBuffers to the display. Just copy 6539 // If offscreen then don't actually SwapBuffers to the display. Just copy
6583 // the rendered frame to another frame buffer. 6540 // the rendered frame to another frame buffer.
6584 if (is_offscreen) { 6541 if (is_offscreen) {
6542 if (offscreen_size_ != offscreen_saved_color_texture_->size()) {
6543 // Workaround for NVIDIA driver bug on OS X; crbug.com/89557,
6544 // crbug.com/94163. TODO(kbr): figure out reproduction so Apple will
6545 // fix this.
6546 if (needs_mac_nvidia_driver_workaround_) {
6547 offscreen_saved_frame_buffer_->Create();
6548 glFinish();
6549 }
6550
6551 // Allocate the offscreen saved color texture.
6552 DCHECK(offscreen_saved_color_format_);
6553 offscreen_saved_color_texture_->AllocateStorage(
6554 offscreen_size_, offscreen_saved_color_format_);
6555
6556 offscreen_saved_frame_buffer_->AttachRenderTexture(
6557 offscreen_saved_color_texture_.get());
6558 if (offscreen_saved_frame_buffer_->CheckStatus() !=
6559 GL_FRAMEBUFFER_COMPLETE) {
6560 LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed "
6561 << "because offscreen saved FBO was incomplete.";
6562 return error::kLostContext;
6563 }
6564
6565 // Destroy the offscreen resolved framebuffers.
6566 if (offscreen_resolved_frame_buffer_.get())
6567 offscreen_resolved_frame_buffer_->Destroy();
6568 if (offscreen_resolved_color_texture_.get())
6569 offscreen_resolved_color_texture_->Destroy();
6570 offscreen_resolved_color_texture_.reset();
6571 offscreen_resolved_frame_buffer_.reset();
6572
6573 // Clear the offscreen color texture.
6574 // TODO(piman): Is this still necessary?
Ken Russell (switch to Gerrit) 2011/08/30 22:47:13 I'm quite sure it is -- if the offscreen color tex
6575 {
6576 ScopedFrameBufferBinder binder(this,
6577 offscreen_saved_frame_buffer_->id());
6578 glClearColor(0, 0, 0, 0);
6579 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
6580 glDisable(GL_SCISSOR_TEST);
6581 glClear(GL_COLOR_BUFFER_BIT);
6582 RestoreClearState();
6583 }
6584
6585 UpdateParentTextureInfo();
6586 }
6587
6585 ScopedGLErrorSuppressor suppressor(this); 6588 ScopedGLErrorSuppressor suppressor(this);
6586 6589
6587 if (IsOffscreenBufferMultisampled()) { 6590 if (IsOffscreenBufferMultisampled()) {
6588 // For multisampled buffers, bind the resolved frame buffer so that 6591 // For multisampled buffers, bind the resolved frame buffer so that
6589 // callbacks can call ReadPixels or CopyTexImage2D. 6592 // callbacks can call ReadPixels or CopyTexImage2D.
6590 ScopedResolvedFrameBufferBinder binder(this, true, false); 6593 ScopedResolvedFrameBufferBinder binder(this, true, false);
6591 #if defined(OS_MACOSX) 6594 #if defined(OS_MACOSX)
6592 if (swap_buffers_callback_.get()) { 6595 if (swap_buffers_callback_.get()) {
6593 swap_buffers_callback_->Run(); 6596 swap_buffers_callback_->Run();
6594 } 6597 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
6842 return false; 6845 return false;
6843 } 6846 }
6844 6847
6845 // Include the auto-generated part of this file. We split this because it means 6848 // Include the auto-generated part of this file. We split this because it means
6846 // we can easily edit the non-auto generated parts right here in this file 6849 // we can easily edit the non-auto generated parts right here in this file
6847 // instead of having to edit some template or the code generator. 6850 // instead of having to edit some template or the code generator.
6848 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 6851 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
6849 6852
6850 } // namespace gles2 6853 } // namespace gles2
6851 } // namespace gpu 6854 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698