| Index: content/common/gpu/image_transport_surface_win.cc | 
| =================================================================== | 
| --- content/common/gpu/image_transport_surface_win.cc	(revision 0) | 
| +++ content/common/gpu/image_transport_surface_win.cc	(revision 0) | 
| @@ -0,0 +1,175 @@ | 
| +// Copyright (c) 2011 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. | 
| + | 
| +#if defined(ENABLE_GPU) | 
| + | 
| +#include "content/common/gpu/image_transport_surface.h" | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/compiler_specific.h" | 
| +#include "base/memory/scoped_ptr.h" | 
| +#include "base/memory/weak_ptr.h" | 
| +#include "base/win/windows_version.h" | 
| +#include "content/common/gpu/gpu_messages.h" | 
| +#include "ui/gfx/gl/gl_bindings.h" | 
| +#include "ui/gfx/gl/gl_context.h" | 
| +#include "ui/gfx/gl/gl_implementation.h" | 
| +#include "ui/gfx/gl/gl_surface_egl.h" | 
| +#include "ui/gfx/native_widget_types.h" | 
| + | 
| +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, | 
| +                               int32 render_view_id, | 
| +                               int32 renderer_id, | 
| +                               int32 command_buffer_id); | 
| + | 
| +  // GLSurface implementation | 
| +  virtual bool Initialize(); | 
| +  virtual void Destroy(); | 
| +  virtual bool IsOffscreen(); | 
| +  virtual bool SwapBuffers(); | 
| + | 
| + protected: | 
| +  // ImageTransportSurface implementation | 
| +  virtual void OnNewSurfaceACK(uint64 surface_id, | 
| +                               TransportDIB::Handle shm_handle) OVERRIDE; | 
| +  virtual void OnBuffersSwappedACK() OVERRIDE; | 
| +  virtual void OnResizeViewACK() OVERRIDE; | 
| +  virtual void OnResize(gfx::Size size) OVERRIDE; | 
| + | 
| + private: | 
| +  virtual ~PbufferImageTransportSurface(); | 
| +  void SendBuffersSwapped(); | 
| + | 
| +  scoped_ptr<ImageTransportHelper> helper_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(PbufferImageTransportSurface); | 
| +}; | 
| + | 
| +PbufferImageTransportSurface::PbufferImageTransportSurface( | 
| +    GpuChannelManager* manager, | 
| +    int32 render_view_id, | 
| +    int32 renderer_id, | 
| +    int32 command_buffer_id) | 
| +        : GLSurfaceAdapter(new gfx::PbufferGLSurfaceEGL(false, | 
| +                                                        gfx::Size(1, 1))) { | 
| +  helper_.reset(new ImageTransportHelper(this, | 
| +                                         manager, | 
| +                                         render_view_id, | 
| +                                         renderer_id, | 
| +                                         command_buffer_id, | 
| +                                         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::IsOffscreen() { | 
| +  return false; | 
| +} | 
| + | 
| +bool PbufferImageTransportSurface::SwapBuffers() { | 
| +  HANDLE surface_handle = GetShareHandle(); | 
| +  if (!surface_handle) | 
| +    return false; | 
| + | 
| +  helper_->DeferToFence(base::Bind( | 
| +      &PbufferImageTransportSurface::SendBuffersSwapped, | 
| +      AsWeakPtr())); | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +void PbufferImageTransportSurface::SendBuffersSwapped() { | 
| +  GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 
| +  params.surface_id = reinterpret_cast<int64>(GetShareHandle()); | 
| +  params.size = GetSize(); | 
| +  helper_->SendAcceleratedSurfaceBuffersSwapped(params); | 
| + | 
| +  helper_->SetScheduled(false); | 
| +} | 
| + | 
| +void PbufferImageTransportSurface::OnBuffersSwappedACK() { | 
| +  helper_->SetScheduled(true); | 
| +} | 
| + | 
| +void PbufferImageTransportSurface::OnNewSurfaceACK( | 
| +    uint64 surface_id, | 
| +    TransportDIB::Handle shm_handle) { | 
| +  NOTIMPLEMENTED(); | 
| +} | 
| + | 
| +void PbufferImageTransportSurface::OnResizeViewACK() { | 
| +  NOTIMPLEMENTED(); | 
| +} | 
| + | 
| +void PbufferImageTransportSurface::OnResize(gfx::Size size) { | 
| +  Resize(size); | 
| +} | 
| + | 
| +}  // namespace anonymous | 
| + | 
| +// static | 
| +scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( | 
| +    GpuChannelManager* manager, | 
| +    int32 render_view_id, | 
| +    int32 renderer_id, | 
| +    int32 command_buffer_id, | 
| +    gfx::PluginWindowHandle handle) { | 
| +  scoped_refptr<gfx::GLSurface> surface; | 
| + | 
| +  base::win::OSInfo* os_info = base::win::OSInfo::GetInstance(); | 
| + | 
| +  if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 
| +      os_info->version() >= base::win::VERSION_VISTA) { | 
| +    surface = new PbufferImageTransportSurface(manager, | 
| +                                               render_view_id, | 
| +                                               renderer_id, | 
| +                                               command_buffer_id); | 
| +  } else { | 
| +    surface = gfx::GLSurface::CreateViewGLSurface(false, handle); | 
| +    if (!surface.get()) | 
| +      return NULL; | 
| + | 
| +    surface = new PassThroughImageTransportSurface(manager, | 
| +                                                   render_view_id, | 
| +                                                   renderer_id, | 
| +                                                   command_buffer_id, | 
| +                                                   surface.get()); | 
| +  } | 
| + | 
| +  if (surface->Initialize()) | 
| +    return surface; | 
| +  else | 
| +    return NULL; | 
| +} | 
| + | 
| +#endif  // ENABLE_GPU | 
|  | 
| Property changes on: content\common\gpu\image_transport_surface_win.cc | 
| ___________________________________________________________________ | 
| Added: svn:eol-style | 
| + LF | 
|  | 
|  |