diff options
Diffstat (limited to 'gpu/command_buffer/service/framebuffer_manager.cc')
-rw-r--r-- | gpu/command_buffer/service/framebuffer_manager.cc | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc index aa30cd3..194fe37 100644 --- a/gpu/command_buffer/service/framebuffer_manager.cc +++ b/gpu/command_buffer/service/framebuffer_manager.cc @@ -93,7 +93,7 @@ class RenderbufferAttachment return true; } - virtual void DetachFromFramebuffer() const OVERRIDE { + virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const OVERRIDE { // Nothing to do for renderbuffers. } @@ -197,8 +197,10 @@ class TextureAttachment return texture_ref_->texture()->CanRenderTo(); } - virtual void DetachFromFramebuffer() const OVERRIDE { + virtual void DetachFromFramebuffer(Framebuffer* framebuffer) + const OVERRIDE { texture_ref_->texture()->DetachFromFramebuffer(); + framebuffer->OnTextureRefDetached(texture_ref_.get()); } virtual bool ValidForAttachmentType( @@ -241,6 +243,10 @@ class TextureAttachment DISALLOW_COPY_AND_ASSIGN(TextureAttachment); }; +FramebufferManager::TextureDetachObserver::TextureDetachObserver() {} + +FramebufferManager::TextureDetachObserver::~TextureDetachObserver() {} + FramebufferManager::FramebufferManager( uint32 max_draw_buffers, uint32 max_color_attachments) : framebuffer_state_change_count_(1), @@ -263,7 +269,7 @@ void Framebuffer::MarkAsDeleted() { deleted_ = true; while (!attachments_.empty()) { Attachment* attachment = attachments_.begin()->second.get(); - attachment->DetachFromFramebuffer(); + attachment->DetachFromFramebuffer(this); attachments_.erase(attachments_.begin()); } } @@ -548,7 +554,7 @@ void Framebuffer::AttachRenderbuffer( GLenum attachment, Renderbuffer* renderbuffer) { const Attachment* a = GetAttachment(attachment); if (a) - a->DetachFromFramebuffer(); + a->DetachFromFramebuffer(this); if (renderbuffer) { attachments_[attachment] = scoped_refptr<Attachment>( new RenderbufferAttachment(renderbuffer)); @@ -563,7 +569,7 @@ void Framebuffer::AttachTexture( GLint level, GLsizei samples) { const Attachment* a = GetAttachment(attachment); if (a) - a->DetachFromFramebuffer(); + a->DetachFromFramebuffer(this); if (texture_ref) { attachments_[attachment] = scoped_refptr<Attachment>( new TextureAttachment(texture_ref, target, level, samples)); @@ -584,6 +590,10 @@ const Framebuffer::Attachment* return NULL; } +void Framebuffer::OnTextureRefDetached(TextureRef* texture) { + manager_->OnTextureRefDetached(texture); +} + bool FramebufferManager::GetClientId( GLuint service_id, GLuint* client_id) const { // This doesn't need to be fast. It's only used during slow queries. @@ -621,6 +631,12 @@ bool FramebufferManager::IsComplete( framebuffer_state_change_count_; } +void FramebufferManager::OnTextureRefDetached(TextureRef* texture) { + FOR_EACH_OBSERVER(TextureDetachObserver, + texture_detach_observers_, + OnTextureRefDetachedFromFramebuffer(texture)); +} + } // namespace gles2 } // namespace gpu |