Chromium Code Reviews| Index: gpu/command_buffer/service/framebuffer_manager.cc |
| diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc |
| index 0c5d96708e856d8e9c3d8578eb785c9f2d18c71e..a26483eb291b5655b5a41f3fc7cbbaac4182c991 100644 |
| --- a/gpu/command_buffer/service/framebuffer_manager.cc |
| +++ b/gpu/command_buffer/service/framebuffer_manager.cc |
| @@ -48,8 +48,11 @@ class RenderbufferAttachment |
| : public Framebuffer::Attachment { |
| public: |
| explicit RenderbufferAttachment( |
| - Renderbuffer* renderbuffer) |
| - : renderbuffer_(renderbuffer) { |
| + Renderbuffer* renderbuffer, GLenum attachment) |
| + : renderbuffer_(renderbuffer), |
| + attachment_(attachment) { |
| + is_depth_stencil_ = renderbuffer ? |
| + Framebuffer::IsDepthStencilFormat(internal_format()) : false; |
| } |
| GLsizei width() const override { return renderbuffer_->width(); } |
| @@ -69,13 +72,27 @@ class RenderbufferAttachment |
| GLuint object_name() const override { return renderbuffer_->client_id(); } |
| - bool cleared() const override { return renderbuffer_->cleared(); } |
| + GLenum attachment() const override { return attachment_; } |
| + |
| + bool IsDepthStencil() const override { return is_depth_stencil_; } |
| + |
| + bool cleared() const override { |
| + if (!is_depth_stencil_) |
| + return renderbuffer_->cleared(); |
| + else |
| + return renderbuffer_->cleared(attachment_); |
| + } |
| void SetCleared(RenderbufferManager* renderbuffer_manager, |
| TextureManager* /* texture_manager */, |
| bool cleared) override { |
| DCHECK(renderbuffer_manager); |
| - renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); |
| + if (!is_depth_stencil_) |
| + renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); |
| + else |
| + renderbuffer_manager->SetCleared(renderbuffer_.get(), |
| + attachment_, |
| + cleared); |
| } |
| bool IsPartiallyCleared() const override { return false; } |
| @@ -139,6 +156,9 @@ class RenderbufferAttachment |
| private: |
| scoped_refptr<Renderbuffer> renderbuffer_; |
| + GLenum attachment_; |
| + bool is_depth_stencil_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); |
| }; |
| @@ -147,12 +167,15 @@ class TextureAttachment |
| public: |
| TextureAttachment( |
| TextureRef* texture_ref, GLenum target, GLint level, |
| - GLsizei samples, GLint layer) |
| + GLsizei samples, GLint layer, GLenum attachment) |
| : texture_ref_(texture_ref), |
| target_(target), |
| level_(level), |
| samples_(samples), |
| - layer_(layer) { |
| + layer_(layer), |
| + attachment_(attachment) { |
| + is_depth_stencil_ = texture_ref ? |
| + Framebuffer::IsDepthStencilFormat(internal_format()) : false; |
| } |
| GLsizei width() const override { |
| @@ -197,16 +220,28 @@ class TextureAttachment |
| GLuint object_name() const override { return texture_ref_->client_id(); } |
| + GLenum attachment() const override { return attachment_; } |
| + |
| + bool IsDepthStencil() const override { return is_depth_stencil_; } |
| + |
| bool cleared() const override { |
| - return texture_ref_->texture()->IsLevelCleared(target_, level_); |
| + if (!is_depth_stencil_) |
| + return texture_ref_->texture()->IsLevelCleared(target_, level_); |
| + else |
| + return texture_ref_->texture()->IsLevelCleared(target_, level_, |
| + attachment_); |
| } |
| void SetCleared(RenderbufferManager* /* renderbuffer_manager */, |
| TextureManager* texture_manager, |
| bool cleared) override { |
| DCHECK(texture_manager); |
| - texture_manager->SetLevelCleared( |
| - texture_ref_.get(), target_, level_, cleared); |
| + if (!is_depth_stencil_) |
| + texture_manager->SetLevelCleared( |
| + texture_ref_.get(), target_, level_, cleared); |
| + else |
| + texture_manager->SetLevelCleared( |
| + texture_ref_.get(), target_, level_, attachment_, cleared); |
| } |
| bool IsPartiallyCleared() const override { |
| @@ -303,6 +338,9 @@ class TextureAttachment |
| GLsizei samples_; |
| GLint layer_; |
| + GLenum attachment_; |
| + bool is_depth_stencil_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(TextureAttachment); |
| }; |
| @@ -536,6 +574,11 @@ void Framebuffer::MarkAttachmentAsCleared( |
| texture_manager, |
| cleared); |
| } |
| + } else if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { |
|
qiankun
2016/07/14 06:48:21
What about move the else branch out of MarkAttachm
|
| + MarkAttachmentAsCleared(renderbuffer_manager, texture_manager, |
| + GL_DEPTH_ATTACHMENT, cleared); |
| + MarkAttachmentAsCleared(renderbuffer_manager, texture_manager, |
| + GL_STENCIL_ATTACHMENT, cleared); |
| } |
| } |
| @@ -724,7 +767,7 @@ GLenum Framebuffer::GetStatus( |
| } |
| bool Framebuffer::IsCleared() const { |
| - // are all the attachments cleaared? |
| + // are all the attachments cleared? |
| for (AttachmentMap::const_iterator it = attachments_.begin(); |
| it != attachments_.end(); ++it) { |
| Attachment* attachment = it->second.get(); |
| @@ -847,7 +890,7 @@ void Framebuffer::AttachRenderbuffer( |
| a->DetachFromFramebuffer(this); |
| if (renderbuffer) { |
| attachments_[attachment] = scoped_refptr<Attachment>( |
| - new RenderbufferAttachment(renderbuffer)); |
| + new RenderbufferAttachment(renderbuffer, attachment)); |
| } else { |
| attachments_.erase(attachment); |
| } |
| @@ -862,7 +905,8 @@ void Framebuffer::AttachTexture( |
| a->DetachFromFramebuffer(this); |
| if (texture_ref) { |
| attachments_[attachment] = scoped_refptr<Attachment>( |
| - new TextureAttachment(texture_ref, target, level, samples, 0)); |
| + new TextureAttachment(texture_ref, target, level, |
| + samples, 0, attachment)); |
| texture_ref->texture()->AttachToFramebuffer(); |
| } else { |
| attachments_.erase(attachment); |
| @@ -878,7 +922,8 @@ void Framebuffer::AttachTextureLayer( |
| a->DetachFromFramebuffer(this); |
| if (texture_ref) { |
| attachments_[attachment] = scoped_refptr<Attachment>( |
| - new TextureAttachment(texture_ref, target, level, 0, layer)); |
| + new TextureAttachment(texture_ref, target, level, |
| + 0, layer, attachment)); |
| texture_ref->texture()->AttachToFramebuffer(); |
| } else { |
| attachments_.erase(attachment); |