| 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 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 10 #include "gpu/command_buffer/service/texture_manager.h" | 10 #include "gpu/command_buffer/service/texture_manager.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 } | 41 } |
| 42 | 42 |
| 43 class RenderbufferAttachment | 43 class RenderbufferAttachment |
| 44 : public Framebuffer::Attachment { | 44 : public Framebuffer::Attachment { |
| 45 public: | 45 public: |
| 46 explicit RenderbufferAttachment( | 46 explicit RenderbufferAttachment( |
| 47 Renderbuffer* renderbuffer) | 47 Renderbuffer* renderbuffer) |
| 48 : renderbuffer_(renderbuffer) { | 48 : renderbuffer_(renderbuffer) { |
| 49 } | 49 } |
| 50 | 50 |
| 51 virtual GLsizei width() const override { | 51 GLsizei width() const override { return renderbuffer_->width(); } |
| 52 return renderbuffer_->width(); | |
| 53 } | |
| 54 | 52 |
| 55 virtual GLsizei height() const override { | 53 GLsizei height() const override { return renderbuffer_->height(); } |
| 56 return renderbuffer_->height(); | |
| 57 } | |
| 58 | 54 |
| 59 virtual GLenum internal_format() const override { | 55 GLenum internal_format() const override { |
| 60 return renderbuffer_->internal_format(); | 56 return renderbuffer_->internal_format(); |
| 61 } | 57 } |
| 62 | 58 |
| 63 virtual GLenum texture_type() const override { | 59 GLenum texture_type() const override { return 0; } |
| 64 return 0; | |
| 65 } | |
| 66 | 60 |
| 67 virtual GLsizei samples() const override { | 61 GLsizei samples() const override { return renderbuffer_->samples(); } |
| 68 return renderbuffer_->samples(); | |
| 69 } | |
| 70 | 62 |
| 71 virtual GLuint object_name() const override { | 63 GLuint object_name() const override { return renderbuffer_->client_id(); } |
| 72 return renderbuffer_->client_id(); | |
| 73 } | |
| 74 | 64 |
| 75 virtual bool cleared() const override { | 65 bool cleared() const override { return renderbuffer_->cleared(); } |
| 76 return renderbuffer_->cleared(); | |
| 77 } | |
| 78 | 66 |
| 79 virtual void SetCleared( | 67 void SetCleared(RenderbufferManager* renderbuffer_manager, |
| 80 RenderbufferManager* renderbuffer_manager, | 68 TextureManager* /* texture_manager */, |
| 81 TextureManager* /* texture_manager */, | 69 bool cleared) override { |
| 82 bool cleared) override { | |
| 83 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); | 70 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); |
| 84 } | 71 } |
| 85 | 72 |
| 86 virtual bool IsTexture( | 73 bool IsTexture(TextureRef* /* texture */) const override { return false; } |
| 87 TextureRef* /* texture */) const override { | |
| 88 return false; | |
| 89 } | |
| 90 | 74 |
| 91 virtual bool IsRenderbuffer( | 75 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { |
| 92 Renderbuffer* renderbuffer) const override { | |
| 93 return renderbuffer_.get() == renderbuffer; | 76 return renderbuffer_.get() == renderbuffer; |
| 94 } | 77 } |
| 95 | 78 |
| 96 virtual bool CanRenderTo() const override { | 79 bool CanRenderTo() const override { return true; } |
| 97 return true; | |
| 98 } | |
| 99 | 80 |
| 100 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const override { | 81 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { |
| 101 // Nothing to do for renderbuffers. | 82 // Nothing to do for renderbuffers. |
| 102 } | 83 } |
| 103 | 84 |
| 104 virtual bool ValidForAttachmentType( | 85 bool ValidForAttachmentType(GLenum attachment_type, |
| 105 GLenum attachment_type, uint32 max_color_attachments) override { | 86 uint32 max_color_attachments) override { |
| 106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 87 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 107 attachment_type, max_color_attachments); | 88 attachment_type, max_color_attachments); |
| 108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); | 89 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); |
| 109 return (need & have) != 0; | 90 return (need & have) != 0; |
| 110 } | 91 } |
| 111 | 92 |
| 112 Renderbuffer* renderbuffer() const { | 93 Renderbuffer* renderbuffer() const { |
| 113 return renderbuffer_.get(); | 94 return renderbuffer_.get(); |
| 114 } | 95 } |
| 115 | 96 |
| 116 virtual size_t GetSignatureSize( | 97 size_t GetSignatureSize(TextureManager* texture_manager) const override { |
| 117 TextureManager* texture_manager) const override { | |
| 118 return renderbuffer_->GetSignatureSize(); | 98 return renderbuffer_->GetSignatureSize(); |
| 119 } | 99 } |
| 120 | 100 |
| 121 virtual void AddToSignature( | 101 void AddToSignature(TextureManager* texture_manager, |
| 122 TextureManager* texture_manager, std::string* signature) const override { | 102 std::string* signature) const override { |
| 123 DCHECK(signature); | 103 DCHECK(signature); |
| 124 renderbuffer_->AddToSignature(signature); | 104 renderbuffer_->AddToSignature(signature); |
| 125 } | 105 } |
| 126 | 106 |
| 127 virtual void OnWillRenderTo() const override {} | 107 void OnWillRenderTo() const override {} |
| 128 virtual void OnDidRenderTo() const override {} | 108 void OnDidRenderTo() const override {} |
| 129 virtual bool FormsFeedbackLoop( | 109 bool FormsFeedbackLoop(TextureRef* /* texture */, |
| 130 TextureRef* /* texture */, GLint /*level */) const override { | 110 GLint /*level */) const override { |
| 131 return false; | 111 return false; |
| 132 } | 112 } |
| 133 | 113 |
| 134 protected: | 114 protected: |
| 135 virtual ~RenderbufferAttachment() { } | 115 ~RenderbufferAttachment() override {} |
| 136 | 116 |
| 137 private: | 117 private: |
| 138 scoped_refptr<Renderbuffer> renderbuffer_; | 118 scoped_refptr<Renderbuffer> renderbuffer_; |
| 139 | 119 |
| 140 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); | 120 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); |
| 141 }; | 121 }; |
| 142 | 122 |
| 143 class TextureAttachment | 123 class TextureAttachment |
| 144 : public Framebuffer::Attachment { | 124 : public Framebuffer::Attachment { |
| 145 public: | 125 public: |
| 146 TextureAttachment( | 126 TextureAttachment( |
| 147 TextureRef* texture_ref, GLenum target, GLint level, GLsizei samples) | 127 TextureRef* texture_ref, GLenum target, GLint level, GLsizei samples) |
| 148 : texture_ref_(texture_ref), | 128 : texture_ref_(texture_ref), |
| 149 target_(target), | 129 target_(target), |
| 150 level_(level), | 130 level_(level), |
| 151 samples_(samples) { | 131 samples_(samples) { |
| 152 } | 132 } |
| 153 | 133 |
| 154 virtual GLsizei width() const override { | 134 GLsizei width() const override { |
| 155 GLsizei temp_width = 0; | 135 GLsizei temp_width = 0; |
| 156 GLsizei temp_height = 0; | 136 GLsizei temp_height = 0; |
| 157 texture_ref_->texture()->GetLevelSize( | 137 texture_ref_->texture()->GetLevelSize( |
| 158 target_, level_, &temp_width, &temp_height); | 138 target_, level_, &temp_width, &temp_height); |
| 159 return temp_width; | 139 return temp_width; |
| 160 } | 140 } |
| 161 | 141 |
| 162 virtual GLsizei height() const override { | 142 GLsizei height() const override { |
| 163 GLsizei temp_width = 0; | 143 GLsizei temp_width = 0; |
| 164 GLsizei temp_height = 0; | 144 GLsizei temp_height = 0; |
| 165 texture_ref_->texture()->GetLevelSize( | 145 texture_ref_->texture()->GetLevelSize( |
| 166 target_, level_, &temp_width, &temp_height); | 146 target_, level_, &temp_width, &temp_height); |
| 167 return temp_height; | 147 return temp_height; |
| 168 } | 148 } |
| 169 | 149 |
| 170 virtual GLenum internal_format() const override { | 150 GLenum internal_format() const override { |
| 171 GLenum temp_type = 0; | 151 GLenum temp_type = 0; |
| 172 GLenum temp_internal_format = 0; | 152 GLenum temp_internal_format = 0; |
| 173 texture_ref_->texture()->GetLevelType( | 153 texture_ref_->texture()->GetLevelType( |
| 174 target_, level_, &temp_type, &temp_internal_format); | 154 target_, level_, &temp_type, &temp_internal_format); |
| 175 return temp_internal_format; | 155 return temp_internal_format; |
| 176 } | 156 } |
| 177 | 157 |
| 178 virtual GLenum texture_type() const override { | 158 GLenum texture_type() const override { |
| 179 GLenum temp_type = 0; | 159 GLenum temp_type = 0; |
| 180 GLenum temp_internal_format = 0; | 160 GLenum temp_internal_format = 0; |
| 181 texture_ref_->texture()->GetLevelType( | 161 texture_ref_->texture()->GetLevelType( |
| 182 target_, level_, &temp_type, &temp_internal_format); | 162 target_, level_, &temp_type, &temp_internal_format); |
| 183 return temp_type; | 163 return temp_type; |
| 184 } | 164 } |
| 185 | 165 |
| 186 virtual GLsizei samples() const override { | 166 GLsizei samples() const override { return samples_; } |
| 187 return samples_; | |
| 188 } | |
| 189 | 167 |
| 190 virtual GLuint object_name() const override { | 168 GLuint object_name() const override { return texture_ref_->client_id(); } |
| 191 return texture_ref_->client_id(); | |
| 192 } | |
| 193 | 169 |
| 194 virtual bool cleared() const override { | 170 bool cleared() const override { |
| 195 return texture_ref_->texture()->IsLevelCleared(target_, level_); | 171 return texture_ref_->texture()->IsLevelCleared(target_, level_); |
| 196 } | 172 } |
| 197 | 173 |
| 198 virtual void SetCleared( | 174 void SetCleared(RenderbufferManager* /* renderbuffer_manager */, |
| 199 RenderbufferManager* /* renderbuffer_manager */, | 175 TextureManager* texture_manager, |
| 200 TextureManager* texture_manager, | 176 bool cleared) override { |
| 201 bool cleared) override { | |
| 202 texture_manager->SetLevelCleared( | 177 texture_manager->SetLevelCleared( |
| 203 texture_ref_.get(), target_, level_, cleared); | 178 texture_ref_.get(), target_, level_, cleared); |
| 204 } | 179 } |
| 205 | 180 |
| 206 virtual bool IsTexture(TextureRef* texture) const override { | 181 bool IsTexture(TextureRef* texture) const override { |
| 207 return texture == texture_ref_.get(); | 182 return texture == texture_ref_.get(); |
| 208 } | 183 } |
| 209 | 184 |
| 210 virtual bool IsRenderbuffer( | 185 bool IsRenderbuffer(Renderbuffer* /* renderbuffer */) const override { |
| 211 Renderbuffer* /* renderbuffer */) | |
| 212 const override { | |
| 213 return false; | 186 return false; |
| 214 } | 187 } |
| 215 | 188 |
| 216 TextureRef* texture() const { | 189 TextureRef* texture() const { |
| 217 return texture_ref_.get(); | 190 return texture_ref_.get(); |
| 218 } | 191 } |
| 219 | 192 |
| 220 virtual bool CanRenderTo() const override { | 193 bool CanRenderTo() const override { |
| 221 return texture_ref_->texture()->CanRenderTo(); | 194 return texture_ref_->texture()->CanRenderTo(); |
| 222 } | 195 } |
| 223 | 196 |
| 224 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) | 197 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { |
| 225 const override { | |
| 226 texture_ref_->texture()->DetachFromFramebuffer(); | 198 texture_ref_->texture()->DetachFromFramebuffer(); |
| 227 framebuffer->OnTextureRefDetached(texture_ref_.get()); | 199 framebuffer->OnTextureRefDetached(texture_ref_.get()); |
| 228 } | 200 } |
| 229 | 201 |
| 230 virtual bool ValidForAttachmentType( | 202 bool ValidForAttachmentType(GLenum attachment_type, |
| 231 GLenum attachment_type, uint32 max_color_attachments) override { | 203 uint32 max_color_attachments) override { |
| 232 GLenum type = 0; | 204 GLenum type = 0; |
| 233 GLenum internal_format = 0; | 205 GLenum internal_format = 0; |
| 234 if (!texture_ref_->texture()->GetLevelType( | 206 if (!texture_ref_->texture()->GetLevelType( |
| 235 target_, level_, &type, &internal_format)) { | 207 target_, level_, &type, &internal_format)) { |
| 236 return false; | 208 return false; |
| 237 } | 209 } |
| 238 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 210 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
| 239 attachment_type, max_color_attachments); | 211 attachment_type, max_color_attachments); |
| 240 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); | 212 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); |
| 241 | 213 |
| 242 // Workaround for NVIDIA drivers that incorrectly expose these formats as | 214 // Workaround for NVIDIA drivers that incorrectly expose these formats as |
| 243 // renderable: | 215 // renderable: |
| 244 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || | 216 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || |
| 245 internal_format == GL_LUMINANCE_ALPHA) { | 217 internal_format == GL_LUMINANCE_ALPHA) { |
| 246 return false; | 218 return false; |
| 247 } | 219 } |
| 248 return (need & have) != 0; | 220 return (need & have) != 0; |
| 249 } | 221 } |
| 250 | 222 |
| 251 virtual size_t GetSignatureSize( | 223 size_t GetSignatureSize(TextureManager* texture_manager) const override { |
| 252 TextureManager* texture_manager) const override { | |
| 253 return texture_manager->GetSignatureSize(); | 224 return texture_manager->GetSignatureSize(); |
| 254 } | 225 } |
| 255 | 226 |
| 256 virtual void AddToSignature( | 227 void AddToSignature(TextureManager* texture_manager, |
| 257 TextureManager* texture_manager, std::string* signature) const override { | 228 std::string* signature) const override { |
| 258 DCHECK(signature); | 229 DCHECK(signature); |
| 259 texture_manager->AddToSignature( | 230 texture_manager->AddToSignature( |
| 260 texture_ref_.get(), target_, level_, signature); | 231 texture_ref_.get(), target_, level_, signature); |
| 261 } | 232 } |
| 262 | 233 |
| 263 virtual void OnWillRenderTo() const override { | 234 void OnWillRenderTo() const override { |
| 264 texture_ref_->texture()->OnWillModifyPixels(); | 235 texture_ref_->texture()->OnWillModifyPixels(); |
| 265 } | 236 } |
| 266 | 237 |
| 267 virtual void OnDidRenderTo() const override { | 238 void OnDidRenderTo() const override { |
| 268 texture_ref_->texture()->OnDidModifyPixels(); | 239 texture_ref_->texture()->OnDidModifyPixels(); |
| 269 } | 240 } |
| 270 | 241 |
| 271 virtual bool FormsFeedbackLoop( | 242 bool FormsFeedbackLoop(TextureRef* texture, GLint level) const override { |
| 272 TextureRef* texture, GLint level) const override { | |
| 273 return texture == texture_ref_.get() && level == level_; | 243 return texture == texture_ref_.get() && level == level_; |
| 274 } | 244 } |
| 275 | 245 |
| 276 protected: | 246 protected: |
| 277 virtual ~TextureAttachment() {} | 247 ~TextureAttachment() override {} |
| 278 | 248 |
| 279 private: | 249 private: |
| 280 scoped_refptr<TextureRef> texture_ref_; | 250 scoped_refptr<TextureRef> texture_ref_; |
| 281 GLenum target_; | 251 GLenum target_; |
| 282 GLint level_; | 252 GLint level_; |
| 283 GLsizei samples_; | 253 GLsizei samples_; |
| 284 | 254 |
| 285 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); | 255 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); |
| 286 }; | 256 }; |
| 287 | 257 |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 ++it) { | 733 ++it) { |
| 764 TextureDetachObserver* observer = *it; | 734 TextureDetachObserver* observer = *it; |
| 765 observer->OnTextureRefDetachedFromFramebuffer(texture); | 735 observer->OnTextureRefDetachedFromFramebuffer(texture); |
| 766 } | 736 } |
| 767 } | 737 } |
| 768 | 738 |
| 769 } // namespace gles2 | 739 } // namespace gles2 |
| 770 } // namespace gpu | 740 } // namespace gpu |
| 771 | 741 |
| 772 | 742 |
| OLD | NEW |