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 30 matching lines...) Expand all Loading... | |
| 41 bound_draw_framebuffer(NULL) { | 41 bound_draw_framebuffer(NULL) { |
| 42 } | 42 } |
| 43 | 43 |
| 44 DecoderFramebufferState::~DecoderFramebufferState() { | 44 DecoderFramebufferState::~DecoderFramebufferState() { |
| 45 } | 45 } |
| 46 | 46 |
| 47 class RenderbufferAttachment | 47 class RenderbufferAttachment |
| 48 : public Framebuffer::Attachment { | 48 : public Framebuffer::Attachment { |
| 49 public: | 49 public: |
| 50 explicit RenderbufferAttachment( | 50 explicit RenderbufferAttachment( |
| 51 Renderbuffer* renderbuffer) | 51 Renderbuffer* renderbuffer, GLenum attachment) |
| 52 : renderbuffer_(renderbuffer) { | 52 : renderbuffer_(renderbuffer), |
| 53 attachment_(attachment) { | |
| 54 is_depth_stencil_ = renderbuffer ? | |
| 55 Framebuffer::IsDepthStencilFormat(internal_format()) : false; | |
| 53 } | 56 } |
| 54 | 57 |
| 55 GLsizei width() const override { return renderbuffer_->width(); } | 58 GLsizei width() const override { return renderbuffer_->width(); } |
| 56 | 59 |
| 57 GLsizei height() const override { return renderbuffer_->height(); } | 60 GLsizei height() const override { return renderbuffer_->height(); } |
| 58 | 61 |
| 59 GLenum internal_format() const override { | 62 GLenum internal_format() const override { |
| 60 return renderbuffer_->internal_format(); | 63 return renderbuffer_->internal_format(); |
| 61 } | 64 } |
| 62 | 65 |
| 63 GLenum texture_type() const override { | 66 GLenum texture_type() const override { |
| 64 return TextureManager::ExtractTypeFromStorageFormat( | 67 return TextureManager::ExtractTypeFromStorageFormat( |
| 65 renderbuffer_->internal_format()); | 68 renderbuffer_->internal_format()); |
| 66 } | 69 } |
| 67 | 70 |
| 68 GLsizei samples() const override { return renderbuffer_->samples(); } | 71 GLsizei samples() const override { return renderbuffer_->samples(); } |
| 69 | 72 |
| 70 GLuint object_name() const override { return renderbuffer_->client_id(); } | 73 GLuint object_name() const override { return renderbuffer_->client_id(); } |
| 71 | 74 |
| 72 bool cleared() const override { return renderbuffer_->cleared(); } | 75 GLenum attachment() const override { return attachment_; } |
| 76 | |
| 77 bool IsDepthStencil() const override { return is_depth_stencil_; } | |
| 78 | |
| 79 bool cleared() const override { | |
| 80 if (!is_depth_stencil_) | |
| 81 return renderbuffer_->cleared(); | |
| 82 else | |
| 83 return renderbuffer_->cleared(attachment_); | |
| 84 } | |
| 73 | 85 |
| 74 void SetCleared(RenderbufferManager* renderbuffer_manager, | 86 void SetCleared(RenderbufferManager* renderbuffer_manager, |
| 75 TextureManager* /* texture_manager */, | 87 TextureManager* /* texture_manager */, |
| 76 bool cleared) override { | 88 bool cleared) override { |
| 77 DCHECK(renderbuffer_manager); | 89 DCHECK(renderbuffer_manager); |
| 78 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); | 90 if (!is_depth_stencil_) |
| 91 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); | |
| 92 else | |
| 93 renderbuffer_manager->SetCleared(renderbuffer_.get(), | |
| 94 attachment_, | |
| 95 cleared); | |
| 79 } | 96 } |
| 80 | 97 |
| 81 bool IsPartiallyCleared() const override { return false; } | 98 bool IsPartiallyCleared() const override { return false; } |
| 82 | 99 |
| 83 bool IsTextureAttachment() const override { return false; } | 100 bool IsTextureAttachment() const override { return false; } |
| 84 bool IsRenderbufferAttachment() const override { return true; } | 101 bool IsRenderbufferAttachment() const override { return true; } |
| 85 | 102 |
| 86 bool IsTexture(TextureRef* /* texture */) const override { return false; } | 103 bool IsTexture(TextureRef* /* texture */) const override { return false; } |
| 87 | 104 |
| 88 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { | 105 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 } | 149 } |
| 133 | 150 |
| 134 bool EmulatingRGB() const override { return false; } | 151 bool EmulatingRGB() const override { return false; } |
| 135 | 152 |
| 136 protected: | 153 protected: |
| 137 ~RenderbufferAttachment() override {} | 154 ~RenderbufferAttachment() override {} |
| 138 | 155 |
| 139 private: | 156 private: |
| 140 scoped_refptr<Renderbuffer> renderbuffer_; | 157 scoped_refptr<Renderbuffer> renderbuffer_; |
| 141 | 158 |
| 159 GLenum attachment_; | |
| 160 bool is_depth_stencil_; | |
| 161 | |
| 142 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); | 162 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); |
| 143 }; | 163 }; |
| 144 | 164 |
| 145 class TextureAttachment | 165 class TextureAttachment |
| 146 : public Framebuffer::Attachment { | 166 : public Framebuffer::Attachment { |
| 147 public: | 167 public: |
| 148 TextureAttachment( | 168 TextureAttachment( |
| 149 TextureRef* texture_ref, GLenum target, GLint level, | 169 TextureRef* texture_ref, GLenum target, GLint level, |
| 150 GLsizei samples, GLint layer) | 170 GLsizei samples, GLint layer, GLenum attachment) |
| 151 : texture_ref_(texture_ref), | 171 : texture_ref_(texture_ref), |
| 152 target_(target), | 172 target_(target), |
| 153 level_(level), | 173 level_(level), |
| 154 samples_(samples), | 174 samples_(samples), |
| 155 layer_(layer) { | 175 layer_(layer), |
| 176 attachment_(attachment) { | |
| 177 is_depth_stencil_ = texture_ref ? | |
| 178 Framebuffer::IsDepthStencilFormat(internal_format()) : false; | |
| 156 } | 179 } |
| 157 | 180 |
| 158 GLsizei width() const override { | 181 GLsizei width() const override { |
| 159 GLsizei temp_width = 0; | 182 GLsizei temp_width = 0; |
| 160 GLsizei temp_height = 0; | 183 GLsizei temp_height = 0; |
| 161 texture_ref_->texture()->GetLevelSize( | 184 texture_ref_->texture()->GetLevelSize( |
| 162 target_, level_, &temp_width, &temp_height, nullptr); | 185 target_, level_, &temp_width, &temp_height, nullptr); |
| 163 return temp_width; | 186 return temp_width; |
| 164 } | 187 } |
| 165 | 188 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 190 GLsizei samples() const override { return samples_; } | 213 GLsizei samples() const override { return samples_; } |
| 191 | 214 |
| 192 GLint layer() const { return layer_; } | 215 GLint layer() const { return layer_; } |
| 193 | 216 |
| 194 GLenum target() const { return target_; } | 217 GLenum target() const { return target_; } |
| 195 | 218 |
| 196 GLint level() const { return level_; } | 219 GLint level() const { return level_; } |
| 197 | 220 |
| 198 GLuint object_name() const override { return texture_ref_->client_id(); } | 221 GLuint object_name() const override { return texture_ref_->client_id(); } |
| 199 | 222 |
| 223 GLenum attachment() const override { return attachment_; } | |
| 224 | |
| 225 bool IsDepthStencil() const override { return is_depth_stencil_; } | |
| 226 | |
| 200 bool cleared() const override { | 227 bool cleared() const override { |
| 201 return texture_ref_->texture()->IsLevelCleared(target_, level_); | 228 if (!is_depth_stencil_) |
| 229 return texture_ref_->texture()->IsLevelCleared(target_, level_); | |
| 230 else | |
| 231 return texture_ref_->texture()->IsLevelCleared(target_, level_, | |
| 232 attachment_); | |
| 202 } | 233 } |
| 203 | 234 |
| 204 void SetCleared(RenderbufferManager* /* renderbuffer_manager */, | 235 void SetCleared(RenderbufferManager* /* renderbuffer_manager */, |
| 205 TextureManager* texture_manager, | 236 TextureManager* texture_manager, |
| 206 bool cleared) override { | 237 bool cleared) override { |
| 207 DCHECK(texture_manager); | 238 DCHECK(texture_manager); |
| 208 texture_manager->SetLevelCleared( | 239 if (!is_depth_stencil_) |
| 209 texture_ref_.get(), target_, level_, cleared); | 240 texture_manager->SetLevelCleared( |
| 241 texture_ref_.get(), target_, level_, cleared); | |
| 242 else | |
| 243 texture_manager->SetLevelCleared( | |
| 244 texture_ref_.get(), target_, level_, attachment_, cleared); | |
| 210 } | 245 } |
| 211 | 246 |
| 212 bool IsPartiallyCleared() const override { | 247 bool IsPartiallyCleared() const override { |
| 213 return texture_ref_->texture()->IsLevelPartiallyCleared(target_, level_); | 248 return texture_ref_->texture()->IsLevelPartiallyCleared(target_, level_); |
| 214 } | 249 } |
| 215 | 250 |
| 216 bool IsTextureAttachment() const override { return true; } | 251 bool IsTextureAttachment() const override { return true; } |
| 217 bool IsRenderbufferAttachment() const override { return false; } | 252 bool IsRenderbufferAttachment() const override { return false; } |
| 218 | 253 |
| 219 bool IsTexture(TextureRef* texture) const override { | 254 bool IsTexture(TextureRef* texture) const override { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 protected: | 331 protected: |
| 297 ~TextureAttachment() override {} | 332 ~TextureAttachment() override {} |
| 298 | 333 |
| 299 private: | 334 private: |
| 300 scoped_refptr<TextureRef> texture_ref_; | 335 scoped_refptr<TextureRef> texture_ref_; |
| 301 GLenum target_; | 336 GLenum target_; |
| 302 GLint level_; | 337 GLint level_; |
| 303 GLsizei samples_; | 338 GLsizei samples_; |
| 304 GLint layer_; | 339 GLint layer_; |
| 305 | 340 |
| 341 GLenum attachment_; | |
| 342 bool is_depth_stencil_; | |
| 343 | |
| 306 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); | 344 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); |
| 307 }; | 345 }; |
| 308 | 346 |
| 309 FramebufferManager::FramebufferManager( | 347 FramebufferManager::FramebufferManager( |
| 310 uint32_t max_draw_buffers, | 348 uint32_t max_draw_buffers, |
| 311 uint32_t max_color_attachments, | 349 uint32_t max_color_attachments, |
| 312 ContextType context_type, | 350 ContextType context_type, |
| 313 const scoped_refptr<FramebufferCompletenessCache>& | 351 const scoped_refptr<FramebufferCompletenessCache>& |
| 314 framebuffer_combo_complete_cache) | 352 framebuffer_combo_complete_cache) |
| 315 : framebuffer_state_change_count_(1), | 353 : framebuffer_state_change_count_(1), |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 GLenum attachment, | 567 GLenum attachment, |
| 530 bool cleared) { | 568 bool cleared) { |
| 531 AttachmentMap::iterator it = attachments_.find(attachment); | 569 AttachmentMap::iterator it = attachments_.find(attachment); |
| 532 if (it != attachments_.end()) { | 570 if (it != attachments_.end()) { |
| 533 Attachment* a = it->second.get(); | 571 Attachment* a = it->second.get(); |
| 534 if (a->cleared() != cleared) { | 572 if (a->cleared() != cleared) { |
| 535 a->SetCleared(renderbuffer_manager, | 573 a->SetCleared(renderbuffer_manager, |
| 536 texture_manager, | 574 texture_manager, |
| 537 cleared); | 575 cleared); |
| 538 } | 576 } |
| 577 } else if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { | |
|
qiankun
2016/07/14 06:48:21
What about move the else branch out of MarkAttachm
| |
| 578 MarkAttachmentAsCleared(renderbuffer_manager, texture_manager, | |
| 579 GL_DEPTH_ATTACHMENT, cleared); | |
| 580 MarkAttachmentAsCleared(renderbuffer_manager, texture_manager, | |
| 581 GL_STENCIL_ATTACHMENT, cleared); | |
| 539 } | 582 } |
| 540 } | 583 } |
| 541 | 584 |
| 542 void Framebuffer::MarkAttachmentsAsCleared( | 585 void Framebuffer::MarkAttachmentsAsCleared( |
| 543 RenderbufferManager* renderbuffer_manager, | 586 RenderbufferManager* renderbuffer_manager, |
| 544 TextureManager* texture_manager, | 587 TextureManager* texture_manager, |
| 545 bool cleared) { | 588 bool cleared) { |
| 546 for (AttachmentMap::iterator it = attachments_.begin(); | 589 for (AttachmentMap::iterator it = attachments_.begin(); |
| 547 it != attachments_.end(); ++it) { | 590 it != attachments_.end(); ++it) { |
| 548 Attachment* attachment = it->second.get(); | 591 Attachment* attachment = it->second.get(); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 GLenum result = glCheckFramebufferStatusEXT(target); | 760 GLenum result = glCheckFramebufferStatusEXT(target); |
| 718 | 761 |
| 719 if (result == GL_FRAMEBUFFER_COMPLETE) { | 762 if (result == GL_FRAMEBUFFER_COMPLETE) { |
| 720 manager_->GetFramebufferComboCompleteCache()->SetComplete(signature); | 763 manager_->GetFramebufferComboCompleteCache()->SetComplete(signature); |
| 721 } | 764 } |
| 722 | 765 |
| 723 return result; | 766 return result; |
| 724 } | 767 } |
| 725 | 768 |
| 726 bool Framebuffer::IsCleared() const { | 769 bool Framebuffer::IsCleared() const { |
| 727 // are all the attachments cleaared? | 770 // are all the attachments cleared? |
| 728 for (AttachmentMap::const_iterator it = attachments_.begin(); | 771 for (AttachmentMap::const_iterator it = attachments_.begin(); |
| 729 it != attachments_.end(); ++it) { | 772 it != attachments_.end(); ++it) { |
| 730 Attachment* attachment = it->second.get(); | 773 Attachment* attachment = it->second.get(); |
| 731 if (!attachment->cleared()) { | 774 if (!attachment->cleared()) { |
| 732 return false; | 775 return false; |
| 733 } | 776 } |
| 734 } | 777 } |
| 735 return true; | 778 return true; |
| 736 } | 779 } |
| 737 | 780 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 840 } | 883 } |
| 841 } | 884 } |
| 842 | 885 |
| 843 void Framebuffer::AttachRenderbuffer( | 886 void Framebuffer::AttachRenderbuffer( |
| 844 GLenum attachment, Renderbuffer* renderbuffer) { | 887 GLenum attachment, Renderbuffer* renderbuffer) { |
| 845 const Attachment* a = GetAttachment(attachment); | 888 const Attachment* a = GetAttachment(attachment); |
| 846 if (a) | 889 if (a) |
| 847 a->DetachFromFramebuffer(this); | 890 a->DetachFromFramebuffer(this); |
| 848 if (renderbuffer) { | 891 if (renderbuffer) { |
| 849 attachments_[attachment] = scoped_refptr<Attachment>( | 892 attachments_[attachment] = scoped_refptr<Attachment>( |
| 850 new RenderbufferAttachment(renderbuffer)); | 893 new RenderbufferAttachment(renderbuffer, attachment)); |
| 851 } else { | 894 } else { |
| 852 attachments_.erase(attachment); | 895 attachments_.erase(attachment); |
| 853 } | 896 } |
| 854 framebuffer_complete_state_count_id_ = 0; | 897 framebuffer_complete_state_count_id_ = 0; |
| 855 } | 898 } |
| 856 | 899 |
| 857 void Framebuffer::AttachTexture( | 900 void Framebuffer::AttachTexture( |
| 858 GLenum attachment, TextureRef* texture_ref, GLenum target, | 901 GLenum attachment, TextureRef* texture_ref, GLenum target, |
| 859 GLint level, GLsizei samples) { | 902 GLint level, GLsizei samples) { |
| 860 const Attachment* a = GetAttachment(attachment); | 903 const Attachment* a = GetAttachment(attachment); |
| 861 if (a) | 904 if (a) |
| 862 a->DetachFromFramebuffer(this); | 905 a->DetachFromFramebuffer(this); |
| 863 if (texture_ref) { | 906 if (texture_ref) { |
| 864 attachments_[attachment] = scoped_refptr<Attachment>( | 907 attachments_[attachment] = scoped_refptr<Attachment>( |
| 865 new TextureAttachment(texture_ref, target, level, samples, 0)); | 908 new TextureAttachment(texture_ref, target, level, |
| 909 samples, 0, attachment)); | |
| 866 texture_ref->texture()->AttachToFramebuffer(); | 910 texture_ref->texture()->AttachToFramebuffer(); |
| 867 } else { | 911 } else { |
| 868 attachments_.erase(attachment); | 912 attachments_.erase(attachment); |
| 869 } | 913 } |
| 870 framebuffer_complete_state_count_id_ = 0; | 914 framebuffer_complete_state_count_id_ = 0; |
| 871 } | 915 } |
| 872 | 916 |
| 873 void Framebuffer::AttachTextureLayer( | 917 void Framebuffer::AttachTextureLayer( |
| 874 GLenum attachment, TextureRef* texture_ref, GLenum target, | 918 GLenum attachment, TextureRef* texture_ref, GLenum target, |
| 875 GLint level, GLint layer) { | 919 GLint level, GLint layer) { |
| 876 const Attachment* a = GetAttachment(attachment); | 920 const Attachment* a = GetAttachment(attachment); |
| 877 if (a) | 921 if (a) |
| 878 a->DetachFromFramebuffer(this); | 922 a->DetachFromFramebuffer(this); |
| 879 if (texture_ref) { | 923 if (texture_ref) { |
| 880 attachments_[attachment] = scoped_refptr<Attachment>( | 924 attachments_[attachment] = scoped_refptr<Attachment>( |
| 881 new TextureAttachment(texture_ref, target, level, 0, layer)); | 925 new TextureAttachment(texture_ref, target, level, |
| 926 0, layer, attachment)); | |
| 882 texture_ref->texture()->AttachToFramebuffer(); | 927 texture_ref->texture()->AttachToFramebuffer(); |
| 883 } else { | 928 } else { |
| 884 attachments_.erase(attachment); | 929 attachments_.erase(attachment); |
| 885 } | 930 } |
| 886 framebuffer_complete_state_count_id_ = 0; | 931 framebuffer_complete_state_count_id_ = 0; |
| 887 } | 932 } |
| 888 | 933 |
| 889 const Framebuffer::Attachment* | 934 const Framebuffer::Attachment* |
| 890 Framebuffer::GetAttachment( | 935 Framebuffer::GetAttachment( |
| 891 GLenum attachment) const { | 936 GLenum attachment) const { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 934 | 979 |
| 935 bool FramebufferManager::IsComplete( | 980 bool FramebufferManager::IsComplete( |
| 936 Framebuffer* framebuffer) { | 981 Framebuffer* framebuffer) { |
| 937 DCHECK(framebuffer); | 982 DCHECK(framebuffer); |
| 938 return framebuffer->framebuffer_complete_state_count_id() == | 983 return framebuffer->framebuffer_complete_state_count_id() == |
| 939 framebuffer_state_change_count_; | 984 framebuffer_state_change_count_; |
| 940 } | 985 } |
| 941 | 986 |
| 942 } // namespace gles2 | 987 } // namespace gles2 |
| 943 } // namespace gpu | 988 } // namespace gpu |
| OLD | NEW |