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

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

Issue 2611403002: Fix a bug in drawBuffers optimization. (Closed)
Patch Set: 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 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 if (mask != adjusted_draw_buffer_bound_mask_) {
529 // This won't be reached in every draw/clear call - only when framebuffer 529 // This won't be reached in every draw call - only when framebuffer or
530 // or program has changed. 530 // program has changed.
531 for (uint32_t ii = 0; ii < manager_->max_draw_buffers_; ++ii) { 531 for (uint32_t ii = 0; ii < manager_->max_draw_buffers_; ++ii) {
532 adjusted_draw_buffers_[ii] = draw_buffers_[ii]; 532 adjusted_draw_buffers_[ii] = draw_buffers_[ii];
533 uint32_t shift_bits = ii * 2; 533 uint32_t shift_bits = ii * 2;
534 uint32_t buffer_mask = 0x3 << shift_bits; 534 uint32_t buffer_mask = 0x3 << shift_bits;
535 if ((buffer_mask & mask) == 0u) { 535 if ((buffer_mask & mask) == 0u) {
536 adjusted_draw_buffers_[ii] = GL_NONE; 536 adjusted_draw_buffers_[ii] = GL_NONE;
537 } 537 }
538 } 538 }
539 adjusted_draw_buffer_bound_mask_ = mask; 539 adjusted_draw_buffer_bound_mask_ = mask;
540 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get()); 540 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get());
541 } 541 }
542 return true; 542 return true;
543 } 543 }
544 544
545 void Framebuffer::AdjustDrawBuffers() {
546 if (draw_buffer_bound_mask_ == adjusted_draw_buffer_bound_mask_) {
547 return;
548 }
549 // This won't be reached in every clear call - only when framebuffer has
550 // changed.
551 for (uint32_t ii = 0; ii < manager_->max_draw_buffers_; ++ii) {
552 adjusted_draw_buffers_[ii] = draw_buffers_[ii];
553 uint32_t shift_bits = ii * 2;
554 uint32_t buffer_mask = 0x3 << shift_bits;
555 if ((buffer_mask & draw_buffer_bound_mask_) == 0u) {
556 adjusted_draw_buffers_[ii] = GL_NONE;
557 }
558 }
Ken Russell (switch to Gerrit) 2017/01/06 22:43:07 Per offline discussion: this is the same block of
Zhenyao Mo 2017/01/07 00:22:24 Done.
559 adjusted_draw_buffer_bound_mask_ = draw_buffer_bound_mask_;
560 glDrawBuffersARB(manager_->max_draw_buffers_, adjusted_draw_buffers_.get());
561 }
562
545 bool Framebuffer::ContainsActiveIntegerAttachments() const { 563 bool Framebuffer::ContainsActiveIntegerAttachments() const {
546 // 0x55555555 broadcasts SHADER_VARIABLE_FLOAT to all slots. 564 // 0x55555555 broadcasts SHADER_VARIABLE_FLOAT to all slots.
547 uint32_t mask = 0x55555555u * SHADER_VARIABLE_FLOAT; 565 uint32_t mask = 0x55555555u * SHADER_VARIABLE_FLOAT;
548 mask &= draw_buffer_bound_mask_; 566 mask &= draw_buffer_bound_mask_;
549 return draw_buffer_type_mask_ != mask; 567 return draw_buffer_type_mask_ != mask;
550 } 568 }
551 569
552 void Framebuffer::ClearUnclearedIntOr3DTexturesOrPartiallyClearedTextures( 570 void Framebuffer::ClearUnclearedIntOr3DTexturesOrPartiallyClearedTextures(
553 GLES2Decoder* decoder, TextureManager* texture_manager) { 571 GLES2Decoder* decoder, TextureManager* texture_manager) {
554 for (AttachmentMap::const_iterator it = attachments_.begin(); 572 for (AttachmentMap::const_iterator it = attachments_.begin();
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 1074
1057 bool FramebufferManager::IsComplete( 1075 bool FramebufferManager::IsComplete(
1058 Framebuffer* framebuffer) { 1076 Framebuffer* framebuffer) {
1059 DCHECK(framebuffer); 1077 DCHECK(framebuffer);
1060 return framebuffer->framebuffer_complete_state_count_id() == 1078 return framebuffer->framebuffer_complete_state_count_id() ==
1061 framebuffer_state_change_count_; 1079 framebuffer_state_change_count_;
1062 } 1080 }
1063 1081
1064 } // namespace gles2 1082 } // namespace gles2
1065 } // namespace gpu 1083 } // 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