summaryrefslogtreecommitdiffstats
path: root/chromium/content/common/gpu/image_transport_surface_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/common/gpu/image_transport_surface_win.cc')
-rw-r--r--chromium/content/common/gpu/image_transport_surface_win.cc256
1 files changed, 2 insertions, 254 deletions
diff --git a/chromium/content/common/gpu/image_transport_surface_win.cc b/chromium/content/common/gpu/image_transport_surface_win.cc
index bd381ee4458..efa64dda4ae 100644
--- a/chromium/content/common/gpu/image_transport_surface_win.cc
+++ b/chromium/content/common/gpu/image_transport_surface_win.cc
@@ -19,236 +19,6 @@
#include "ui/gl/gl_surface_egl.h"
namespace content {
-namespace {
-
-// We are backed by an Pbuffer offscreen surface through which ANGLE provides
-// a handle to the corresponding render target texture through an extension.
-class PbufferImageTransportSurface
- : public gfx::GLSurfaceAdapter,
- public ImageTransportSurface,
- public base::SupportsWeakPtr<PbufferImageTransportSurface> {
- public:
- PbufferImageTransportSurface(GpuChannelManager* manager,
- GpuCommandBufferStub* stub);
-
- // gfx::GLSurface implementation
- virtual bool Initialize() OVERRIDE;
- virtual void Destroy() OVERRIDE;
- virtual bool DeferDraws() OVERRIDE;
- virtual bool IsOffscreen() OVERRIDE;
- virtual bool SwapBuffers() OVERRIDE;
- virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
- virtual std::string GetExtensions() OVERRIDE;
- virtual bool SetBackbufferAllocation(bool allocated) OVERRIDE;
- virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
-
- protected:
- // ImageTransportSurface implementation
- virtual void OnBufferPresented(
- const AcceleratedSurfaceMsg_BufferPresented_Params& params) OVERRIDE;
- virtual void OnResizeViewACK() OVERRIDE;
- virtual void OnResize(gfx::Size size, float scale_factor) OVERRIDE;
- virtual void SetLatencyInfo(const ui::LatencyInfo&) OVERRIDE;
- virtual void WakeUpGpu() OVERRIDE;
- virtual gfx::Size GetSize() OVERRIDE;
-
- private:
- virtual ~PbufferImageTransportSurface();
- void SendBuffersSwapped();
- void DestroySurface();
-
- // Tracks the current buffer allocation state.
- bool backbuffer_suggested_allocation_;
- bool frontbuffer_suggested_allocation_;
-
- // Whether a SwapBuffers is pending.
- bool is_swap_buffers_pending_;
-
- // Whether we unscheduled command buffer because of pending SwapBuffers.
- bool did_unschedule_;
-
- // Size to resize to when the surface becomes visible.
- gfx::Size visible_size_;
-
- ui::LatencyInfo latency_info_;
-
- scoped_ptr<ImageTransportHelper> helper_;
-
- DISALLOW_COPY_AND_ASSIGN(PbufferImageTransportSurface);
-};
-
-PbufferImageTransportSurface::PbufferImageTransportSurface(
- GpuChannelManager* manager,
- GpuCommandBufferStub* stub)
- : GLSurfaceAdapter(new gfx::PbufferGLSurfaceEGL(gfx::Size(1, 1))),
- backbuffer_suggested_allocation_(true),
- frontbuffer_suggested_allocation_(true),
- is_swap_buffers_pending_(false),
- did_unschedule_(false) {
- helper_.reset(new ImageTransportHelper(this,
- manager,
- stub,
- gfx::kNullPluginWindow));
-}
-
-PbufferImageTransportSurface::~PbufferImageTransportSurface() {
- Destroy();
-}
-
-bool PbufferImageTransportSurface::Initialize() {
- // Only support this path if the GL implementation is ANGLE.
- // IO surfaces will not work with, for example, OSMesa software renderer
- // GL contexts.
- if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2)
- return false;
-
- if (!helper_->Initialize())
- return false;
-
- return GLSurfaceAdapter::Initialize();
-}
-
-void PbufferImageTransportSurface::Destroy() {
- helper_->Destroy();
- GLSurfaceAdapter::Destroy();
-}
-
-bool PbufferImageTransportSurface::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;
- if (is_swap_buffers_pending_) {
- did_unschedule_ = true;
- helper_->SetScheduled(false);
- return true;
- }
- return false;
-}
-
-bool PbufferImageTransportSurface::IsOffscreen() {
- return false;
-}
-
-bool PbufferImageTransportSurface::SwapBuffers() {
- DCHECK(backbuffer_suggested_allocation_);
- if (!frontbuffer_suggested_allocation_)
- return true;
-
- HANDLE surface_handle = GetShareHandle();
- if (!surface_handle)
- return false;
-
- // Don't send the surface to the browser until we hit the fence that
- // indicates the drawing to the surface has been completed.
- // TODO(jbates) unscheduling should be deferred until draw commands from the
- // next frame -- otherwise the GPU is potentially sitting idle.
- helper_->DeferToFence(base::Bind(
- &PbufferImageTransportSurface::SendBuffersSwapped,
- AsWeakPtr()));
-
- return true;
-}
-
-bool PbufferImageTransportSurface::PostSubBuffer(
- int x, int y, int width, int height) {
- NOTREACHED();
- return false;
-}
-
-bool PbufferImageTransportSurface::SetBackbufferAllocation(bool allocation) {
- if (backbuffer_suggested_allocation_ == allocation)
- return true;
- backbuffer_suggested_allocation_ = allocation;
-
- DestroySurface();
-
- if (backbuffer_suggested_allocation_ && visible_size_.GetArea() != 0)
- return Resize(visible_size_);
- else
- return Resize(gfx::Size(1, 1));
-}
-
-void PbufferImageTransportSurface::SetFrontbufferAllocation(bool allocation) {
- if (frontbuffer_suggested_allocation_ == allocation)
- return;
- frontbuffer_suggested_allocation_ = allocation;
-
- // We recreate frontbuffer by recreating backbuffer and swapping.
- // But we release frontbuffer by telling UI to release its handle on it.
- if (!frontbuffer_suggested_allocation_)
- helper_->Suspend();
-}
-
-void PbufferImageTransportSurface::DestroySurface() {
- helper_->SendAcceleratedSurfaceRelease();
-}
-
-std::string PbufferImageTransportSurface::GetExtensions() {
- std::string extensions = gfx::GLSurface::GetExtensions();
- extensions += extensions.empty() ? "" : " ";
- extensions += "GL_CHROMIUM_front_buffer_cached";
- return extensions;
-}
-
-void PbufferImageTransportSurface::SendBuffersSwapped() {
- GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
- params.surface_handle = reinterpret_cast<int64>(GetShareHandle());
- CHECK(params.surface_handle);
- params.size = GetSize();
- params.latency_info = latency_info_;
-
- helper_->SendAcceleratedSurfaceBuffersSwapped(params);
-
- DCHECK(!is_swap_buffers_pending_);
- is_swap_buffers_pending_ = true;
-}
-
-void PbufferImageTransportSurface::OnBufferPresented(
- const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
- if (!params.vsync_timebase.is_null() &&
- params.vsync_interval != base::TimeDelta()) {
- helper_->SendUpdateVSyncParameters(params.vsync_timebase,
- params.vsync_interval);
- }
- is_swap_buffers_pending_ = false;
- if (did_unschedule_) {
- did_unschedule_ = false;
- helper_->SetScheduled(true);
- }
-}
-
-void PbufferImageTransportSurface::OnResizeViewACK() {
- NOTREACHED();
-}
-
-void PbufferImageTransportSurface::OnResize(gfx::Size size,
- float scale_factor) {
- DCHECK(backbuffer_suggested_allocation_);
- DCHECK(frontbuffer_suggested_allocation_);
- Resize(size);
-
- DestroySurface();
-
- visible_size_ = size;
-}
-
-void PbufferImageTransportSurface::SetLatencyInfo(
- const ui::LatencyInfo& latency_info) {
- latency_info_ = latency_info;
-}
-
-void PbufferImageTransportSurface::WakeUpGpu() {
- NOTIMPLEMENTED();
-}
-
-gfx::Size PbufferImageTransportSurface::GetSize() {
- return GLSurfaceAdapter::GetSize();
-}
-
-} // namespace anonymous
// static
scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateNativeSurface(
@@ -256,35 +26,13 @@ scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateNativeSurface(
GpuCommandBufferStub* stub,
const gfx::GLSurfaceHandle& handle) {
DCHECK(handle.handle);
- DCHECK(handle.transport_type == gfx::NATIVE_DIRECT ||
- handle.transport_type == gfx::NATIVE_TRANSPORT);
- if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 &&
- !CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableImageTransportSurface)) {
- // This path handles two different cases.
- //
- // For post-Vista regular Windows, this surface will be used for
- // renderer compositors.
- //
- // For Aura Windows, this will be the surface for the browser compositor
- // (and the renderer compositors surface's will be
- // TextureImageTransportSurface above).
- const char* extensions = eglQueryString(
- gfx::GLSurfaceEGL::GetHardwareDisplay(), EGL_EXTENSIONS);
- if (extensions &&
- strstr(extensions, "EGL_ANGLE_query_surface_pointer") &&
- strstr(extensions, "EGL_ANGLE_surface_d3d_texture_2d_share_handle")) {
- return scoped_refptr<gfx::GLSurface>(
- new PbufferImageTransportSurface(manager, stub));
- }
- }
-
+ DCHECK_EQ(handle.transport_type, gfx::NATIVE_DIRECT);
scoped_refptr<gfx::GLSurface> surface =
gfx::GLSurface::CreateViewGLSurface(handle.handle);
if (!surface)
return surface;
return scoped_refptr<gfx::GLSurface>(new PassThroughImageTransportSurface(
- manager, stub, surface.get(), handle.is_transport()));
+ manager, stub, surface.get()));
}
} // namespace content