Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |