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

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

Issue 2611403002: Fix a bug in drawBuffers optimization. (Closed)
Patch Set: update Created 3 years, 11 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/framebuffer_manager.h" 5 #include "gpu/command_buffer/service/framebuffer_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 void Framebuffer::RestoreDrawBuffers() const { 518 void Framebuffer::RestoreDrawBuffers() const {
519 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get()); 519 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get());
520 } 520 }
521 521
522 bool Framebuffer::ValidateAndAdjustDrawBuffers( 522 bool Framebuffer::ValidateAndAdjustDrawBuffers(
523 uint32_t fragment_output_type_mask, uint32_t fragment_output_written_mask) { 523 uint32_t fragment_output_type_mask, uint32_t fragment_output_written_mask) {
524 uint32_t mask = draw_buffer_bound_mask_ & fragment_output_written_mask; 524 uint32_t mask = draw_buffer_bound_mask_ & fragment_output_written_mask;
525 if ((mask & fragment_output_type_mask) != (mask & draw_buffer_type_mask_)) 525 if ((mask & fragment_output_type_mask) != (mask & draw_buffer_type_mask_))
526 return false; 526 return false;
527 527
528 if (mask != adjusted_draw_buffer_bound_mask_) { 528 AdjustDrawBuffersImpl(mask);
529 // This won't be reached in every draw/clear call - only when framebuffer
530 // or program has changed.
531 for (uint32_t ii = 0; ii < manager_->max_draw_buffers_; ++ii) {
532 adjusted_draw_buffers_[ii] = draw_buffers_[ii];
533 uint32_t shift_bits = ii * 2;
534 uint32_t buffer_mask = 0x3 << shift_bits;
535 if ((buffer_mask & mask) == 0u) {
536 adjusted_draw_buffers_[ii] = GL_NONE;
537 }
538 }
539 adjusted_draw_buffer_bound_mask_ = mask;
540 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get());
541 }
542 return true; 529 return true;
543 } 530 }
544 531
532 void Framebuffer::AdjustDrawBuffers() {
533 AdjustDrawBuffersImpl(draw_buffer_bound_mask_);
534 }
535
536 void Framebuffer::AdjustDrawBuffersImpl(uint32_t desired_mask) {
537 if (desired_mask == adjusted_draw_buffer_bound_mask_) {
538 return;
539 }
540 // This won't be reached in every clear call - only when framebuffer has
541 // changed.
542 for (uint32_t ii = 0; ii < manager_->max_draw_buffers_; ++ii) {
543 adjusted_draw_buffers_[ii] = draw_buffers_[ii];
544 if (adjusted_draw_buffers_[ii] == GL_NONE) {
545 continue;
546 }
547 uint32_t shift_bits = ii * 2;
548 uint32_t buffer_mask = 0x3 << shift_bits;
549 if ((buffer_mask & desired_mask) == 0u) {
550 adjusted_draw_buffers_[ii] = GL_NONE;
551 }
552 }
553 adjusted_draw_buffer_bound_mask_ = desired_mask;
554 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get());
555 }
556
545 bool Framebuffer::ContainsActiveIntegerAttachments() const { 557 bool Framebuffer::ContainsActiveIntegerAttachments() const {
546 // 0x55555555 broadcasts SHADER_VARIABLE_FLOAT to all slots. 558 // 0x55555555 broadcasts SHADER_VARIABLE_FLOAT to all slots.
547 uint32_t mask = 0x55555555u * SHADER_VARIABLE_FLOAT; 559 uint32_t mask = 0x55555555u * SHADER_VARIABLE_FLOAT;
548 mask &= draw_buffer_bound_mask_; 560 mask &= draw_buffer_bound_mask_;
549 return draw_buffer_type_mask_ != mask; 561 return draw_buffer_type_mask_ != mask;
550 } 562 }
551 563
552 void Framebuffer::ClearUnclearedIntOr3DTexturesOrPartiallyClearedTextures( 564 void Framebuffer::ClearUnclearedIntOr3DTexturesOrPartiallyClearedTextures(
553 GLES2Decoder* decoder, TextureManager* texture_manager) { 565 GLES2Decoder* decoder, TextureManager* texture_manager) {
554 for (AttachmentMap::const_iterator it = attachments_.begin(); 566 for (AttachmentMap::const_iterator it = attachments_.begin();
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 1068
1057 bool FramebufferManager::IsComplete( 1069 bool FramebufferManager::IsComplete(
1058 Framebuffer* framebuffer) { 1070 Framebuffer* framebuffer) {
1059 DCHECK(framebuffer); 1071 DCHECK(framebuffer);
1060 return framebuffer->framebuffer_complete_state_count_id() == 1072 return framebuffer->framebuffer_complete_state_count_id() ==
1061 framebuffer_state_change_count_; 1073 framebuffer_state_change_count_;
1062 } 1074 }
1063 1075
1064 } // namespace gles2 1076 } // namespace gles2
1065 } // namespace gpu 1077 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698