| Index: content/common/gpu/image_transport_surface_fbo_mac.cc
|
| diff --git a/content/common/gpu/image_transport_surface_fbo_mac.cc b/content/common/gpu/image_transport_surface_fbo_mac.cc
|
| deleted file mode 100644
|
| index 3e86a484fe9d0ce87b4168c1fbdc9356c2e3c681..0000000000000000000000000000000000000000
|
| --- a/content/common/gpu/image_transport_surface_fbo_mac.cc
|
| +++ /dev/null
|
| @@ -1,349 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/common/gpu/image_transport_surface_fbo_mac.h"
|
| -
|
| -#include "content/common/gpu/gpu_messages.h"
|
| -#include "content/common/gpu/image_transport_surface_iosurface_mac.h"
|
| -#include "ui/gfx/native_widget_types.h"
|
| -#include "ui/gl/gl_context.h"
|
| -#include "ui/gl/gl_implementation.h"
|
| -#include "ui/gl/gl_surface_osmesa.h"
|
| -
|
| -namespace content {
|
| -
|
| -ImageTransportSurfaceFBO::ImageTransportSurfaceFBO(
|
| - StorageProvider* storage_provider,
|
| - GpuChannelManager* manager,
|
| - GpuCommandBufferStub* stub,
|
| - gfx::PluginWindowHandle handle)
|
| - : storage_provider_(storage_provider),
|
| - backbuffer_suggested_allocation_(true),
|
| - frontbuffer_suggested_allocation_(true),
|
| - fbo_id_(0),
|
| - texture_id_(0),
|
| - depth_stencil_renderbuffer_id_(0),
|
| - has_complete_framebuffer_(false),
|
| - context_(NULL),
|
| - scale_factor_(1.f),
|
| - made_current_(false),
|
| - is_swap_buffers_pending_(false),
|
| - did_unschedule_(false) {
|
| - helper_.reset(new ImageTransportHelper(this, manager, stub, handle));
|
| -}
|
| -
|
| -ImageTransportSurfaceFBO::~ImageTransportSurfaceFBO() {
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::Initialize() {
|
| - // Only support IOSurfaces if the GL implementation is the native desktop GL.
|
| - // IO surfaces will not work with, for example, OSMesa software renderer
|
| - // GL contexts.
|
| - if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL &&
|
| - gfx::GetGLImplementation() != gfx::kGLImplementationAppleGL)
|
| - return false;
|
| -
|
| - if (!helper_->Initialize())
|
| - return false;
|
| -
|
| - helper_->stub()->AddDestructionObserver(this);
|
| - return true;
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::Destroy() {
|
| - DestroyFramebuffer();
|
| -
|
| - helper_->Destroy();
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::DeferDraws() {
|
| - // The command buffer hit a draw/clear command that could clobber the
|
| - // IOSurface in use by an earlier SwapBuffers. If a Swap is pending, abort
|
| - // processing of the command by returning true and unschedule until the Swap
|
| - // Ack arrives.
|
| - if(did_unschedule_)
|
| - return true; // Still unscheduled, so just return true.
|
| - if (is_swap_buffers_pending_) {
|
| - did_unschedule_ = true;
|
| - helper_->SetScheduled(false);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::IsOffscreen() {
|
| - return false;
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::OnMakeCurrent(gfx::GLContext* context) {
|
| - context_ = context;
|
| -
|
| - if (made_current_)
|
| - return true;
|
| -
|
| - OnResize(gfx::Size(1, 1), 1.f);
|
| -
|
| - made_current_ = true;
|
| - return true;
|
| -}
|
| -
|
| -unsigned int ImageTransportSurfaceFBO::GetBackingFrameBufferObject() {
|
| - return fbo_id_;
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::SetBackbufferAllocation(bool allocation) {
|
| - if (backbuffer_suggested_allocation_ == allocation)
|
| - return true;
|
| - backbuffer_suggested_allocation_ = allocation;
|
| - AdjustBufferAllocation();
|
| - return true;
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::SetFrontbufferAllocation(bool allocation) {
|
| - if (frontbuffer_suggested_allocation_ == allocation)
|
| - return;
|
| - frontbuffer_suggested_allocation_ = allocation;
|
| - AdjustBufferAllocation();
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::AdjustBufferAllocation() {
|
| - // On mac, the frontbuffer and backbuffer are the same buffer. The buffer is
|
| - // free'd when both the browser and gpu processes have Unref'd the IOSurface.
|
| - if (!backbuffer_suggested_allocation_ &&
|
| - !frontbuffer_suggested_allocation_ &&
|
| - has_complete_framebuffer_) {
|
| - DestroyFramebuffer();
|
| - helper_->Suspend();
|
| - } else if (backbuffer_suggested_allocation_ && !has_complete_framebuffer_) {
|
| - CreateFramebuffer();
|
| - }
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::SwapBuffers() {
|
| - DCHECK(backbuffer_suggested_allocation_);
|
| - if (!frontbuffer_suggested_allocation_)
|
| - return true;
|
| - glFlush();
|
| -
|
| - GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
|
| - params.surface_handle = storage_provider_->GetSurfaceHandle();
|
| - params.size = GetSize();
|
| - params.scale_factor = scale_factor_;
|
| - params.latency_info.swap(latency_info_);
|
| - helper_->SendAcceleratedSurfaceBuffersSwapped(params);
|
| -
|
| - DCHECK(!is_swap_buffers_pending_);
|
| - is_swap_buffers_pending_ = true;
|
| -
|
| - storage_provider_->WillSwapBuffers();
|
| - return true;
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::PostSubBuffer(
|
| - int x, int y, int width, int height) {
|
| - DCHECK(backbuffer_suggested_allocation_);
|
| - if (!frontbuffer_suggested_allocation_)
|
| - return true;
|
| - glFlush();
|
| -
|
| - GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
|
| - params.surface_handle = storage_provider_->GetSurfaceHandle();
|
| - params.x = x;
|
| - params.y = y;
|
| - params.width = width;
|
| - params.height = height;
|
| - params.surface_size = GetSize();
|
| - params.surface_scale_factor = scale_factor_;
|
| - params.latency_info.swap(latency_info_);
|
| - helper_->SendAcceleratedSurfacePostSubBuffer(params);
|
| -
|
| - DCHECK(!is_swap_buffers_pending_);
|
| - is_swap_buffers_pending_ = true;
|
| -
|
| - storage_provider_->WillSwapBuffers();
|
| - return true;
|
| -}
|
| -
|
| -bool ImageTransportSurfaceFBO::SupportsPostSubBuffer() {
|
| - return true;
|
| -}
|
| -
|
| -gfx::Size ImageTransportSurfaceFBO::GetSize() {
|
| - return size_;
|
| -}
|
| -
|
| -void* ImageTransportSurfaceFBO::GetHandle() {
|
| - return NULL;
|
| -}
|
| -
|
| -void* ImageTransportSurfaceFBO::GetDisplay() {
|
| - return NULL;
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::OnBufferPresented(
|
| - const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
|
| - DCHECK(is_swap_buffers_pending_);
|
| -
|
| - context_->share_group()->SetRendererID(params.renderer_id);
|
| - is_swap_buffers_pending_ = false;
|
| - if (did_unschedule_) {
|
| - did_unschedule_ = false;
|
| - helper_->SetScheduled(true);
|
| - }
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::OnResize(gfx::Size size,
|
| - float scale_factor) {
|
| - // This trace event is used in gpu_feature_browsertest.cc - the test will need
|
| - // to be updated if this event is changed or moved.
|
| - TRACE_EVENT2("gpu", "ImageTransportSurfaceFBO::OnResize",
|
| - "old_width", size_.width(), "new_width", size.width());
|
| - // Caching |context_| from OnMakeCurrent. It should still be current.
|
| - DCHECK(context_->IsCurrent(this));
|
| -
|
| - size_ = size;
|
| - scale_factor_ = scale_factor;
|
| -
|
| - CreateFramebuffer();
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::SetLatencyInfo(
|
| - const std::vector<ui::LatencyInfo>& latency_info) {
|
| - for (size_t i = 0; i < latency_info.size(); i++)
|
| - latency_info_.push_back(latency_info[i]);
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::WakeUpGpu() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::OnWillDestroyStub() {
|
| - helper_->stub()->RemoveDestructionObserver(this);
|
| - Destroy();
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::DestroyFramebuffer() {
|
| - // If we have resources to destroy, then make sure that we have a current
|
| - // context which we can use to delete the resources.
|
| - if (context_ || fbo_id_ || texture_id_ || depth_stencil_renderbuffer_id_) {
|
| - DCHECK(gfx::GLContext::GetCurrent() == context_);
|
| - DCHECK(context_->IsCurrent(this));
|
| - DCHECK(CGLGetCurrentContext());
|
| - }
|
| -
|
| - if (fbo_id_) {
|
| - glDeleteFramebuffersEXT(1, &fbo_id_);
|
| - fbo_id_ = 0;
|
| - }
|
| -
|
| - if (texture_id_) {
|
| - glDeleteTextures(1, &texture_id_);
|
| - texture_id_ = 0;
|
| - }
|
| -
|
| - if (depth_stencil_renderbuffer_id_) {
|
| - glDeleteRenderbuffersEXT(1, &depth_stencil_renderbuffer_id_);
|
| - depth_stencil_renderbuffer_id_ = 0;
|
| - }
|
| -
|
| - storage_provider_->FreeColorBufferStorage();
|
| -
|
| - has_complete_framebuffer_ = false;
|
| -}
|
| -
|
| -void ImageTransportSurfaceFBO::CreateFramebuffer() {
|
| - gfx::Size new_rounded_size = storage_provider_->GetRoundedSize(size_);
|
| -
|
| - // Only recreate surface when the rounded up size has changed.
|
| - if (has_complete_framebuffer_ && new_rounded_size == rounded_size_)
|
| - return;
|
| -
|
| - // This trace event is used in gpu_feature_browsertest.cc - the test will need
|
| - // to be updated if this event is changed or moved.
|
| - TRACE_EVENT2("gpu", "ImageTransportSurfaceFBO::CreateFramebuffer",
|
| - "width", new_rounded_size.width(),
|
| - "height", new_rounded_size.height());
|
| -
|
| - rounded_size_ = new_rounded_size;
|
| -
|
| - // GL_TEXTURE_RECTANGLE_ARB is the best supported render target on
|
| - // Mac OS X and is required for IOSurface interoperability.
|
| - GLint previous_texture_id = 0;
|
| - glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &previous_texture_id);
|
| -
|
| - // Free the old IO Surface first to reduce memory fragmentation.
|
| - DestroyFramebuffer();
|
| -
|
| - glGenFramebuffersEXT(1, &fbo_id_);
|
| - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id_);
|
| -
|
| - glGenTextures(1, &texture_id_);
|
| -
|
| - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_id_);
|
| - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
| - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| -
|
| - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
|
| - GL_COLOR_ATTACHMENT0_EXT,
|
| - GL_TEXTURE_RECTANGLE_ARB,
|
| - texture_id_,
|
| - 0);
|
| -
|
| - // Search through the provided attributes; if the caller has
|
| - // requested a stencil buffer, try to get one.
|
| -
|
| - int32 stencil_bits =
|
| - helper_->stub()->GetRequestedAttribute(EGL_STENCIL_SIZE);
|
| - if (stencil_bits > 0) {
|
| - // Create and bind the stencil buffer
|
| - bool has_packed_depth_stencil =
|
| - GLSurface::ExtensionsContain(
|
| - reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
|
| - "GL_EXT_packed_depth_stencil");
|
| -
|
| - if (has_packed_depth_stencil) {
|
| - glGenRenderbuffersEXT(1, &depth_stencil_renderbuffer_id_);
|
| - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,
|
| - depth_stencil_renderbuffer_id_);
|
| - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT,
|
| - rounded_size_.width(), rounded_size_.height());
|
| - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
| - GL_STENCIL_ATTACHMENT_EXT,
|
| - GL_RENDERBUFFER_EXT,
|
| - depth_stencil_renderbuffer_id_);
|
| - }
|
| -
|
| - // If we asked for stencil but the extension isn't present,
|
| - // it's OK to silently fail; subsequent code will/must check
|
| - // for the presence of a stencil buffer before attempting to
|
| - // do stencil-based operations.
|
| - }
|
| -
|
| - bool allocated_color_buffer = storage_provider_->AllocateColorBufferStorage(
|
| - static_cast<CGLContextObj>(context_->GetHandle()), texture_id_,
|
| - rounded_size_, scale_factor_);
|
| - if (!allocated_color_buffer) {
|
| - DLOG(ERROR) << "Failed to allocate color buffer storage.";
|
| - DestroyFramebuffer();
|
| - return;
|
| - }
|
| -
|
| - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
| - if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
|
| - DLOG(ERROR) << "Framebuffer was incomplete: " << status;
|
| - DestroyFramebuffer();
|
| - return;
|
| - }
|
| -
|
| - has_complete_framebuffer_ = true;
|
| -
|
| - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, previous_texture_id);
|
| - // The FBO remains bound for this GL context.
|
| -}
|
| -
|
| -} // namespace content
|
|
|