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; |