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