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

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

Issue 8060045: Use shared D3D9 texture to transport the compositor's backing buffer to the browser... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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/image_transport_surface_mac.cc ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/common/gpu/image_transport_surface_mac.cc ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698