Chromium Code Reviews| Index: content/common/gpu/texture_image_transport_surface.cc |
| diff --git a/content/common/gpu/texture_image_transport_surface.cc b/content/common/gpu/texture_image_transport_surface.cc |
| index e9649f539a8c9c7ec355f597cb2655be0498d84f..63e8f5dd8d2986900e5e9d7b2b86ba35071fca05 100644 |
| --- a/content/common/gpu/texture_image_transport_surface.cc |
| +++ b/content/common/gpu/texture_image_transport_surface.cc |
| @@ -56,7 +56,9 @@ TextureImageTransportSurface::TextureImageTransportSurface( |
| const gfx::GLSurfaceHandle& handle) |
| : fbo_id_(0), |
| front_(0), |
| - stub_destroyed_(false) { |
| + stub_destroyed_(false), |
| + backbuffer_allocated_(true), |
| + frontbuffer_allocated_(true) { |
| GpuChannel* parent_channel = manager->LookupChannel(handle.parent_client_id); |
| DCHECK(parent_channel); |
| GpuCommandBufferStub* parent_stub = parent_channel->LookupCommandBuffer( |
| @@ -129,7 +131,7 @@ bool TextureImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { |
| if (!fbo_id_) { |
| glGenFramebuffersEXT(1, &fbo_id_); |
| glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_); |
| - CreateBackTexture(gfx::Size(1, 1)); |
| + CreateTexture(back(), gfx::Size(1, 1)); |
| #ifndef NDEBUG |
| GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| @@ -147,19 +149,26 @@ unsigned int TextureImageTransportSurface::GetBackingFrameBufferObject() { |
| return fbo_id_; |
| } |
| -void TextureImageTransportSurface::SetBufferAllocation( |
| - BufferAllocationState state) { |
| +void TextureImageTransportSurface::SetBackbufferAllocation(bool allocated) { |
| + if (backbuffer_allocated_ == allocated) |
| + return; |
| + if (!helper_->MakeCurrent()) |
| + return; |
| + if (allocated) |
| + CreateTexture(back(), textures_[back()].size); |
| + else |
| + RequestReleaseTexture(back()); |
| +} |
| + |
| +void TextureImageTransportSurface::SetFrontbufferAllocation(bool allocated) { |
| + if (frontbuffer_allocated_ == allocated) |
| + return; |
| if (!helper_->MakeCurrent()) |
| return; |
| - switch (state) { |
| - case BUFFER_ALLOCATION_FRONT_AND_BACK: |
| - CreateBackTexture(textures_[back()].size); |
| - break; |
| - case BUFFER_ALLOCATION_FRONT_ONLY: |
| - case BUFFER_ALLOCATION_NONE: |
| - ReleaseBackTexture(); |
| - break; |
| - }; |
| + if (allocated) |
| + CreateTexture(front(), textures_[front()].size); |
|
mmocny
2012/04/12 16:41:27
I am playing with delaying this recreation until a
|
| + else |
| + RequestReleaseTexture(front()); |
| } |
| void* TextureImageTransportSurface::GetShareHandle() { |
| @@ -175,7 +184,7 @@ void* TextureImageTransportSurface::GetConfig() { |
| } |
| void TextureImageTransportSurface::OnResize(gfx::Size size) { |
| - CreateBackTexture(size); |
| + CreateTexture(back(), size); |
| } |
| void TextureImageTransportSurface::OnWillDestroyStub( |
| @@ -189,14 +198,19 @@ void TextureImageTransportSurface::OnWillDestroyStub( |
| } |
| bool TextureImageTransportSurface::SwapBuffers() { |
| + DCHECK(backbuffer_allocated_); |
| + if (!frontbuffer_allocated_) { |
| + previous_damage_rect_ = gfx::Rect(textures_[back()].size); |
| + return true; |
| + } |
| glFlush(); |
| front_ = back(); |
| - previous_damage_rect_ = gfx::Rect(textures_[front_].size); |
| + previous_damage_rect_ = gfx::Rect(textures_[front()].size); |
| - DCHECK(textures_[front_].client_id != 0); |
| + DCHECK(textures_[front()].client_id != 0); |
| GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
| - params.surface_handle = textures_[front_].client_id; |
| + params.surface_handle = textures_[front()].client_id; |
| helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
| helper_->SetScheduled(false); |
| return true; |
| @@ -204,6 +218,11 @@ bool TextureImageTransportSurface::SwapBuffers() { |
| bool TextureImageTransportSurface::PostSubBuffer( |
| int x, int y, int width, int height) { |
| + DCHECK(backbuffer_allocated_); |
| + if (!frontbuffer_allocated_) { |
| + previous_damage_rect_ = gfx::Rect(textures_[back()].size); |
|
mmocny
2012/04/12 16:41:27
I think I got this backwards, previous_damage_rect
|
| + return true; |
| + } |
| if (!parent_stub_.get()) |
| return false; |
| @@ -212,13 +231,13 @@ bool TextureImageTransportSurface::PostSubBuffer( |
| return false; |
| int back_texture_service_id = info->service_id(); |
| - info = GetParentInfo(textures_[front_].client_id); |
| + info = GetParentInfo(textures_[front()].client_id); |
| if (!info) |
| return false; |
| int front_texture_service_id = info->service_id(); |
| gfx::Size expected_size = textures_[back()].size; |
| - bool surfaces_same_size = textures_[front_].size == expected_size; |
| + bool surfaces_same_size = textures_[front()].size == expected_size; |
| const gfx::Rect new_damage_rect(x, y, width, height); |
| @@ -254,7 +273,7 @@ bool TextureImageTransportSurface::PostSubBuffer( |
| front_ = back(); |
| GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; |
| - params.surface_handle = textures_[front_].client_id; |
| + params.surface_handle = textures_[front()].client_id; |
| params.x = x; |
| params.y = y; |
| params.width = width; |
| @@ -287,12 +306,20 @@ void TextureImageTransportSurface::OnNewSurfaceACK( |
| uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { |
| } |
| +void TextureImageTransportSurface::OnReleaseSurfaceACK( |
| + uint64 surface_id, bool success) { |
| + if (success) |
| + ReleaseTexture(textures_[front()].client_id == surface_id ? |
| + front() : back()); |
| + helper_->SetScheduled(true); |
| +} |
| + |
| void TextureImageTransportSurface::OnBuffersSwappedACK() { |
| if (helper_->MakeCurrent()) { |
| - if (textures_[front_].size != textures_[back()].size) { |
| - CreateBackTexture(textures_[front_].size); |
| + if (textures_[front()].size != textures_[back()].size) { |
| + CreateTexture(back(), textures_[front()].size); |
| } else { |
| - AttachBackTextureToFBO(); |
| + AttachTextureToFBO(back()); |
| } |
| } |
| @@ -309,10 +336,23 @@ void TextureImageTransportSurface::OnResizeViewACK() { |
| NOTREACHED(); |
| } |
| -void TextureImageTransportSurface::ReleaseBackTexture() { |
| +void TextureImageTransportSurface::RequestReleaseTexture(int id) { |
| + Texture& texture = textures_[id]; |
| + if (!texture.sent_to_client) { |
| + ReleaseTexture(id); |
| + return; |
| + } |
| + GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
| + params.identifier = texture.client_id; |
| + helper_->SendAcceleratedSurfaceRelease(params); |
| + helper_->SetScheduled(false); |
| +} |
| + |
| +void TextureImageTransportSurface::ReleaseTexture(int id) { |
| if (!parent_stub_.get()) |
| return; |
| - TextureInfo* info = GetParentInfo(textures_[back()].client_id); |
| + Texture& texture = textures_[id]; |
| + TextureInfo* info = GetParentInfo(texture.client_id); |
| if (!info) |
| return; |
| @@ -327,12 +367,18 @@ void TextureImageTransportSurface::ReleaseBackTexture() { |
| } |
| glFlush(); |
| CHECK_GL_ERROR(); |
| + texture.sent_to_client = false; |
| + if (id == front()) |
| + frontbuffer_allocated_ = false; |
| + else |
| + backbuffer_allocated_ = false; |
| } |
| -void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { |
| +void TextureImageTransportSurface::CreateTexture( |
| + int id, const gfx::Size& size) { |
| if (!parent_stub_.get()) |
| return; |
| - Texture& texture = textures_[back()]; |
| + Texture& texture = textures_[id]; |
| TextureInfo* info = GetParentInfo(texture.client_id); |
| if (!info) |
| return; |
| @@ -377,7 +423,7 @@ void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { |
| CHECK_GL_ERROR(); |
| } |
| - AttachBackTextureToFBO(); |
| + AttachTextureToFBO(id); |
| GpuHostMsg_AcceleratedSurfaceNew_Params params; |
| params.width = size.width(); |
| @@ -385,12 +431,17 @@ void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { |
| params.surface_handle = texture.client_id; |
| helper_->SendAcceleratedSurfaceNew(params); |
| texture.sent_to_client = true; |
| + |
| + if (id == front()) |
| + frontbuffer_allocated_ = true; |
| + else |
| + backbuffer_allocated_ = true; |
| } |
| -void TextureImageTransportSurface::AttachBackTextureToFBO() { |
| +void TextureImageTransportSurface::AttachTextureToFBO(int id) { |
| if (!parent_stub_.get()) |
| return; |
| - TextureInfo* info = GetParentInfo(textures_[back()].client_id); |
| + TextureInfo* info = GetParentInfo(textures_[id].client_id); |
| if (!info) |
| return; |