Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Unified Diff: content/common/gpu/texture_image_transport_surface.cc

Issue 10052018: Drop frontbuffers with ui-use-gpu-process, synchronized with browser, decoupled from backbuffer dro… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor cleanup Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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/11 22:58:36 Maybe I should be using back() surface size here
+ 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);
+ 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;
« no previous file with comments | « content/common/gpu/texture_image_transport_surface.h ('k') | content/port/browser/render_widget_host_view_port.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698