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

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

Issue 12717013: Add reference-counting for mailbox textures. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add optional 'pool' reference while textures are in mailbox Created 7 years, 9 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
« no previous file with comments | « content/common/gpu/texture_image_transport_surface.h ('k') | gpu/command_buffer/service/context_group.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 5eeb2a178b011460c11daa63719bd7c694c1f9ae..ac6daf0cf59f6b7142b71027563f1ac2d51cc52a 100644
--- a/content/common/gpu/texture_image_transport_surface.cc
+++ b/content/common/gpu/texture_image_transport_surface.cc
@@ -30,17 +30,15 @@ TextureImageTransportSurface::TextureImageTransportSurface(
GpuCommandBufferStub* stub,
const gfx::GLSurfaceHandle& handle)
: fbo_id_(0),
- backbuffer_(CreateTextureDefinition(gfx::Size(), 0)),
+ backbuffer_(&TextureDefinition::kEmptyTexture2D),
stub_destroyed_(false),
backbuffer_suggested_allocation_(true),
frontbuffer_suggested_allocation_(true),
handle_(handle),
is_swap_buffers_pending_(false),
did_unschedule_(false) {
- helper_.reset(new ImageTransportHelper(this,
- manager,
- stub,
- gfx::kNullPluginWindow));
+ helper_.reset(
+ new ImageTransportHelper(this, manager, stub, gfx::kNullPluginWindow));
}
TextureImageTransportSurface::~TextureImageTransportSurface() {
@@ -107,8 +105,6 @@ bool TextureImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) {
return true;
}
- context_ = context;
-
if (!fbo_id_) {
glGenFramebuffersEXT(1, &fbo_id_);
glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_id_);
@@ -213,10 +209,6 @@ bool TextureImageTransportSurface::SwapBuffers() {
glFlush();
ProduceTexture();
- // Do not allow destruction while we are still waiting for a swap ACK,
- // so we do not leak a texture in the mailbox.
- AddRef();
-
helper_->SendAcceleratedSurfaceBuffersSwapped(params);
DCHECK(!is_swap_buffers_pending_);
@@ -254,10 +246,6 @@ bool TextureImageTransportSurface::PostSubBuffer(
glFlush();
ProduceTexture();
- // Do not allow destruction while we are still waiting for a swap ACK,
- // so we do not leak a texture in the mailbox.
- AddRef();
-
helper_->SendAcceleratedSurfacePostSubBuffer(params);
DCHECK(!is_swap_buffers_pending_);
@@ -300,14 +288,13 @@ void TextureImageTransportSurface::OnBufferPresented(
this,
params.mailbox_name));
}
-
- // Careful, we might get deleted now if we were only waiting for
- // a final swap ACK.
- Release();
}
void TextureImageTransportSurface::BufferPresentedImpl(
const std::string& mailbox_name) {
+ if (stub_destroyed_)
+ return;
+
DCHECK(!backbuffer_->service_id());
if (!mailbox_name.empty()) {
DCHECK(mailbox_name.length() == GL_MAILBOX_SIZE_CHROMIUM);
@@ -316,17 +303,6 @@ void TextureImageTransportSurface::BufferPresentedImpl(
ConsumeTexture();
}
- if (stub_destroyed_ && backbuffer_->service_id()) {
- // TODO(sievers): Remove this after changes to the mailbox to take ownership
- // of the service ids.
- DCHECK(context_.get() && surface_.get());
- uint32 service_id = backbuffer_->ReleaseServiceId();
- if (context_->MakeCurrent(surface_.get()))
- glDeleteTextures(1, &service_id);
-
- return;
- }
-
DCHECK(is_swap_buffers_pending_);
is_swap_buffers_pending_ = false;
@@ -360,9 +336,8 @@ void TextureImageTransportSurface::ReleaseBackTexture() {
if (!backbuffer_->service_id())
return;
- uint32 service_id = backbuffer_->ReleaseServiceId();
- glDeleteTextures(1, &service_id);
- backbuffer_.reset(CreateTextureDefinition(gfx::Size(), 0));
+ StopUsingSharedTexture(backbuffer_, true);
+ backbuffer_ = &TextureDefinition::kEmptyTexture2D;
mailbox_name_ = MailboxName();
glFlush();
CHECK_GL_ERROR();
@@ -376,7 +351,7 @@ void TextureImageTransportSurface::CreateBackTexture() {
if (backbuffer_->service_id() && backbuffer_size() == current_size_)
return;
- uint32 service_id = backbuffer_->ReleaseServiceId();
+ uint32 service_id = backbuffer_->service_id();
VLOG(1) << "Allocating new backbuffer texture";
@@ -391,7 +366,8 @@ void TextureImageTransportSurface::CreateBackTexture() {
->feature_info()
->workarounds()
.delete_instead_of_resize_fbo) {
- glDeleteTextures(1, &service_id);
+ StopUsingSharedTexture(backbuffer_, true);
+ backbuffer_ = NULL;
service_id = 0;
mailbox_name_ = MailboxName();
}
@@ -406,8 +382,13 @@ void TextureImageTransportSurface::CreateBackTexture() {
glGenTextures(1, &service_id);
}
- backbuffer_.reset(
- CreateTextureDefinition(current_size_, service_id));
+ if (!backbuffer_ || !backbuffer_->service_id()) {
+ backbuffer_ = CreateTextureDefinition(current_size_, service_id);
+ StartUsingSharedTexture(backbuffer_);
+ } else {
+ backbuffer_->level_infos()[0][0].width = current_size_.width();
+ backbuffer_->level_infos()[0][0].height = current_size_.height();
+ }
{
ScopedTextureBinder texture_binder(service_id);
@@ -444,6 +425,7 @@ void TextureImageTransportSurface::AttachBackTextureToFBO() {
TextureDefinition* TextureImageTransportSurface::CreateTextureDefinition(
gfx::Size size, int service_id) {
+ DCHECK(service_id && !size.IsEmpty());
TextureDefinition::LevelInfo info(
GL_TEXTURE_2D, GL_RGBA, size.width(), size.height(), 1,
0, GL_RGBA, GL_UNSIGNED_BYTE, true);
@@ -467,11 +449,12 @@ TextureDefinition* TextureImageTransportSurface::CreateTextureDefinition(
void TextureImageTransportSurface::ConsumeTexture() {
DCHECK(!backbuffer_->service_id());
- backbuffer_.reset(mailbox_manager_->ConsumeTexture(
- GL_TEXTURE_2D, mailbox_name_));
+ backbuffer_ = mailbox_manager_->ConsumeTexture(GL_TEXTURE_2D, mailbox_name_);
if (!backbuffer_) {
mailbox_name_ = MailboxName();
- backbuffer_.reset(CreateTextureDefinition(gfx::Size(), 0));
+ backbuffer_ = &TextureDefinition::kEmptyTexture2D;
+ } else {
+ StartUsingSharedTexture(backbuffer_);
}
}
@@ -486,11 +469,14 @@ void TextureImageTransportSurface::ProduceTexture() {
bool success = mailbox_manager_->ProduceTexture(
GL_TEXTURE_2D,
mailbox_name_,
- backbuffer_.release(),
- NULL);
+ backbuffer_,
+ std::make_pair(MailboxManager::TEXTURE_POOL_FOR_SURFACE,
+ helper_->stub()->surface_id()));
+ bool deleted = StopUsingSharedTexture(backbuffer_, true);
+ DCHECK(!deleted);
DCHECK(success);
mailbox_name_ = MailboxName();
- backbuffer_.reset(CreateTextureDefinition(gfx::Size(), 0));
+ backbuffer_ = &TextureDefinition::kEmptyTexture2D;
}
} // namespace content
« no previous file with comments | « content/common/gpu/texture_image_transport_surface.h ('k') | gpu/command_buffer/service/context_group.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698