OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
6 | 6 |
7 #include "content/common/gpu/image_transport_surface.h" | 7 #include "content/common/gpu/image_transport_surface.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 namespace { | 24 namespace { |
25 | 25 |
26 // We are backed by an Pbuffer offscreen surface through which ANGLE provides | 26 // We are backed by an Pbuffer offscreen surface through which ANGLE provides |
27 // a handle to the corresponding render target texture through an extension. | 27 // a handle to the corresponding render target texture through an extension. |
28 class PbufferImageTransportSurface | 28 class PbufferImageTransportSurface |
29 : public gfx::GLSurfaceAdapter, | 29 : public gfx::GLSurfaceAdapter, |
30 public ImageTransportSurface, | 30 public ImageTransportSurface, |
31 public base::SupportsWeakPtr<PbufferImageTransportSurface> { | 31 public base::SupportsWeakPtr<PbufferImageTransportSurface> { |
32 public: | 32 public: |
33 PbufferImageTransportSurface(GpuChannelManager* manager, | 33 PbufferImageTransportSurface(GpuChannelManager* manager, |
34 int32 render_view_id, | 34 GpuCommandBufferStub* stub); |
35 int32 client_id, | |
36 int32 command_buffer_id); | |
37 | 35 |
38 // gfx::GLSurface implementation | 36 // gfx::GLSurface implementation |
39 virtual bool Initialize() OVERRIDE; | 37 virtual bool Initialize() OVERRIDE; |
40 virtual void Destroy() OVERRIDE; | 38 virtual void Destroy() OVERRIDE; |
41 virtual bool IsOffscreen() OVERRIDE; | 39 virtual bool IsOffscreen() OVERRIDE; |
42 virtual bool SwapBuffers() OVERRIDE; | 40 virtual bool SwapBuffers() OVERRIDE; |
43 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; | 41 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; |
44 virtual std::string GetExtensions() OVERRIDE; | 42 virtual std::string GetExtensions() OVERRIDE; |
45 virtual void SetVisible(bool visible) OVERRIDE; | 43 virtual void SetVisible(bool visible) OVERRIDE; |
46 | 44 |
(...skipping 16 matching lines...) Expand all Loading... |
63 // Size to resize to when the surface becomes visible. | 61 // Size to resize to when the surface becomes visible. |
64 gfx::Size visible_size_; | 62 gfx::Size visible_size_; |
65 | 63 |
66 scoped_ptr<ImageTransportHelper> helper_; | 64 scoped_ptr<ImageTransportHelper> helper_; |
67 | 65 |
68 DISALLOW_COPY_AND_ASSIGN(PbufferImageTransportSurface); | 66 DISALLOW_COPY_AND_ASSIGN(PbufferImageTransportSurface); |
69 }; | 67 }; |
70 | 68 |
71 PbufferImageTransportSurface::PbufferImageTransportSurface( | 69 PbufferImageTransportSurface::PbufferImageTransportSurface( |
72 GpuChannelManager* manager, | 70 GpuChannelManager* manager, |
73 int32 render_view_id, | 71 GpuCommandBufferStub* stub) |
74 int32 client_id, | 72 : GLSurfaceAdapter(new gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1))), |
75 int32 command_buffer_id) | 73 is_visible_(true) { |
76 : GLSurfaceAdapter(new gfx::PbufferGLSurfaceEGL(false, | |
77 gfx::Size(1, 1))), | |
78 is_visible_(true) { | |
79 helper_.reset(new ImageTransportHelper(this, | 74 helper_.reset(new ImageTransportHelper(this, |
80 manager, | 75 manager, |
81 render_view_id, | 76 stub, |
82 client_id, | |
83 command_buffer_id, | |
84 gfx::kNullPluginWindow)); | 77 gfx::kNullPluginWindow)); |
85 } | 78 } |
86 | 79 |
87 PbufferImageTransportSurface::~PbufferImageTransportSurface() { | 80 PbufferImageTransportSurface::~PbufferImageTransportSurface() { |
88 Destroy(); | 81 Destroy(); |
89 } | 82 } |
90 | 83 |
91 bool PbufferImageTransportSurface::Initialize() { | 84 bool PbufferImageTransportSurface::Initialize() { |
92 // Only support this path if the GL implementation is ANGLE. | 85 // Only support this path if the GL implementation is ANGLE. |
93 // IO surfaces will not work with, for example, OSMesa software renderer | 86 // IO surfaces will not work with, for example, OSMesa software renderer |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 Resize(size); | 172 Resize(size); |
180 | 173 |
181 visible_size_ = size; | 174 visible_size_ = size; |
182 } | 175 } |
183 | 176 |
184 } // namespace anonymous | 177 } // namespace anonymous |
185 | 178 |
186 // static | 179 // static |
187 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( | 180 scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateSurface( |
188 GpuChannelManager* manager, | 181 GpuChannelManager* manager, |
189 int32 render_view_id, | 182 GpuCommandBufferStub* stub, |
190 int32 client_id, | |
191 int32 command_buffer_id, | |
192 gfx::PluginWindowHandle handle) { | 183 gfx::PluginWindowHandle handle) { |
193 scoped_refptr<gfx::GLSurface> surface; | 184 scoped_refptr<gfx::GLSurface> surface; |
194 | 185 |
195 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 186 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && |
196 !CommandLine::ForCurrentProcess()->HasSwitch( | 187 !CommandLine::ForCurrentProcess()->HasSwitch( |
197 switches::kDisableImageTransportSurface)) { | 188 switches::kDisableImageTransportSurface)) { |
198 const char* extensions = eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), | 189 const char* extensions = eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), |
199 EGL_EXTENSIONS); | 190 EGL_EXTENSIONS); |
200 if (strstr(extensions, "EGL_ANGLE_query_surface_pointer") && | 191 if (strstr(extensions, "EGL_ANGLE_query_surface_pointer") && |
201 strstr(extensions, "EGL_ANGLE_surface_d3d_texture_2d_share_handle")) { | 192 strstr(extensions, "EGL_ANGLE_surface_d3d_texture_2d_share_handle")) { |
202 surface = new PbufferImageTransportSurface(manager, | 193 surface = new PbufferImageTransportSurface(manager, stub); |
203 render_view_id, | |
204 client_id, | |
205 command_buffer_id); | |
206 } | 194 } |
207 } | 195 } |
208 | 196 |
209 if (!surface.get()) { | 197 if (!surface.get()) { |
210 surface = gfx::GLSurface::CreateViewGLSurface(false, handle); | 198 surface = gfx::GLSurface::CreateViewGLSurface(false, handle); |
211 if (!surface.get()) | 199 if (!surface.get()) |
212 return NULL; | 200 return NULL; |
213 | 201 |
214 surface = new PassThroughImageTransportSurface(manager, | 202 surface = new PassThroughImageTransportSurface(manager, |
215 render_view_id, | 203 stub, |
216 client_id, | |
217 command_buffer_id, | |
218 surface.get()); | 204 surface.get()); |
219 } | 205 } |
220 | 206 |
221 if (surface->Initialize()) | 207 if (surface->Initialize()) |
222 return surface; | 208 return surface; |
223 else | 209 else |
224 return NULL; | 210 return NULL; |
225 } | 211 } |
226 | 212 |
227 #endif // ENABLE_GPU | 213 #endif // ENABLE_GPU |
OLD | NEW |