OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/callback.h" | 9 #include "base/callback.h" |
10 #include "content/common/gpu/gpu_channel.h" | 10 #include "content/common/gpu/gpu_channel.h" |
11 #include "content/common/gpu/gpu_channel_manager.h" | 11 #include "content/common/gpu/gpu_channel_manager.h" |
12 #include "content/common/gpu/gpu_command_buffer_stub.h" | 12 #include "content/common/gpu/gpu_command_buffer_stub.h" |
13 #include "content/common/gpu/gpu_messages.h" | 13 #include "content/common/gpu/gpu_messages.h" |
14 #include "gpu/command_buffer/service/gpu_scheduler.h" | 14 #include "gpu/command_buffer/service/gpu_scheduler.h" |
15 | 15 |
16 ImageTransportSurface::ImageTransportSurface() { | |
17 } | |
18 | |
19 ImageTransportSurface::~ImageTransportSurface() { | |
20 } | |
21 | |
22 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, | 16 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, |
23 GpuChannelManager* manager, | 17 GpuChannelManager* manager, |
24 int32 render_view_id, | 18 int32 render_view_id, |
25 int32 renderer_id, | 19 int32 renderer_id, |
26 int32 command_buffer_id, | 20 int32 command_buffer_id, |
27 gfx::PluginWindowHandle handle) | 21 gfx::PluginWindowHandle handle) |
28 : surface_(surface), | 22 : surface_(surface), |
29 manager_(manager), | 23 manager_(manager), |
30 render_view_id_(render_view_id), | 24 render_view_id_(render_view_id), |
31 renderer_id_(renderer_id), | 25 renderer_id_(renderer_id), |
(...skipping 22 matching lines...) Expand all Loading... |
54 void ImageTransportHelper::Destroy() { | 48 void ImageTransportHelper::Destroy() { |
55 } | 49 } |
56 | 50 |
57 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 51 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
58 bool handled = true; | 52 bool handled = true; |
59 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 53 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
60 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, | 54 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, |
61 OnBuffersSwappedACK) | 55 OnBuffersSwappedACK) |
62 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 56 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, |
63 OnNewSurfaceACK) | 57 OnNewSurfaceACK) |
64 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | |
65 IPC_MESSAGE_UNHANDLED(handled = false) | 58 IPC_MESSAGE_UNHANDLED(handled = false) |
66 IPC_END_MESSAGE_MAP() | 59 IPC_END_MESSAGE_MAP() |
67 return handled; | 60 return handled; |
68 } | 61 } |
69 | 62 |
70 void ImageTransportHelper::SendAcceleratedSurfaceRelease( | 63 void ImageTransportHelper::SendAcceleratedSurfaceRelease( |
71 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { | 64 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { |
72 params.renderer_id = renderer_id_; | 65 params.renderer_id = renderer_id_; |
73 params.render_view_id = render_view_id_; | 66 params.render_view_id = render_view_id_; |
74 params.route_id = route_id_; | 67 params.route_id = route_id_; |
(...skipping 15 matching lines...) Expand all Loading... |
90 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { | 83 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { |
91 params.renderer_id = renderer_id_; | 84 params.renderer_id = renderer_id_; |
92 params.render_view_id = render_view_id_; | 85 params.render_view_id = render_view_id_; |
93 params.route_id = route_id_; | 86 params.route_id = route_id_; |
94 #if defined(OS_MACOSX) | 87 #if defined(OS_MACOSX) |
95 params.window = handle_; | 88 params.window = handle_; |
96 #endif | 89 #endif |
97 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 90 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
98 } | 91 } |
99 | 92 |
100 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | |
101 manager_->Send(new GpuHostMsg_ResizeView(renderer_id_, | |
102 render_view_id_, | |
103 route_id_, | |
104 size)); | |
105 } | |
106 | |
107 void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 93 void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
108 gpu::GpuScheduler* scheduler = Scheduler(); | 94 gpu::GpuScheduler* scheduler = Scheduler(); |
109 if (!scheduler) | 95 if (!scheduler) |
110 return; | 96 return; |
111 | 97 |
112 scheduler->SetScheduled(is_scheduled); | 98 scheduler->SetScheduled(is_scheduled); |
113 } | 99 } |
114 | 100 |
115 void ImageTransportHelper::DeferToFence(base::Closure task) { | |
116 gpu::GpuScheduler* scheduler = Scheduler(); | |
117 DCHECK(scheduler); | |
118 | |
119 scheduler->DeferToFence(task); | |
120 } | |
121 | |
122 void ImageTransportHelper::OnBuffersSwappedACK() { | 101 void ImageTransportHelper::OnBuffersSwappedACK() { |
123 surface_->OnBuffersSwappedACK(); | 102 surface_->OnBuffersSwappedACK(); |
124 } | 103 } |
125 | 104 |
126 void ImageTransportHelper::OnNewSurfaceACK( | 105 void ImageTransportHelper::OnNewSurfaceACK( |
127 uint64 surface_id, | 106 uint64 surface_id, |
128 TransportDIB::Handle shm_handle) { | 107 TransportDIB::Handle shm_handle) { |
129 surface_->OnNewSurfaceACK(surface_id, shm_handle); | 108 surface_->OnNewSurfaceACK(surface_id, shm_handle); |
130 } | 109 } |
131 | 110 |
132 void ImageTransportHelper::OnResizeViewACK() { | |
133 surface_->OnResizeViewACK(); | |
134 } | |
135 | |
136 void ImageTransportHelper::Resize(gfx::Size size) { | 111 void ImageTransportHelper::Resize(gfx::Size size) { |
137 // On windows, the surface is recreated and, in case the newly allocated | |
138 // surface happens to have the same address, it should be invalidated on the | |
139 // decoder so that future calls to MakeCurrent do not early out on the | |
140 // assumption that neither the context or surface have actually changed. | |
141 #if defined(OS_WIN) | |
142 Decoder()->ReleaseCurrent(); | |
143 #endif | |
144 | |
145 surface_->OnResize(size); | 112 surface_->OnResize(size); |
146 | |
147 #if defined(OS_WIN) | |
148 Decoder()->MakeCurrent(); | |
149 SetSwapInterval(); | |
150 #endif | |
151 } | |
152 | |
153 void ImageTransportHelper::SetSwapInterval() { | |
154 GpuChannel* channel = manager_->LookupChannel(renderer_id_); | |
155 if (!channel) | |
156 return; | |
157 | |
158 GpuCommandBufferStub* stub = | |
159 channel->LookupCommandBuffer(command_buffer_id_); | |
160 if (!stub) | |
161 return; | |
162 | |
163 stub->SetSwapInterval(); | |
164 } | 113 } |
165 | 114 |
166 bool ImageTransportHelper::MakeCurrent() { | 115 bool ImageTransportHelper::MakeCurrent() { |
167 gpu::gles2::GLES2Decoder* decoder = Decoder(); | 116 gpu::gles2::GLES2Decoder* decoder = Decoder(); |
168 if (!decoder) | 117 if (!decoder) |
169 return false; | 118 return false; |
170 return decoder->MakeCurrent(); | 119 return decoder->MakeCurrent(); |
171 } | 120 } |
172 | 121 |
173 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { | 122 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { |
(...skipping 15 matching lines...) Expand all Loading... |
189 return NULL; | 138 return NULL; |
190 | 139 |
191 GpuCommandBufferStub* stub = | 140 GpuCommandBufferStub* stub = |
192 channel->LookupCommandBuffer(command_buffer_id_); | 141 channel->LookupCommandBuffer(command_buffer_id_); |
193 if (!stub) | 142 if (!stub) |
194 return NULL; | 143 return NULL; |
195 | 144 |
196 return stub->decoder(); | 145 return stub->decoder(); |
197 } | 146 } |
198 | 147 |
199 PassThroughImageTransportSurface::PassThroughImageTransportSurface( | |
200 GpuChannelManager* manager, | |
201 int32 render_view_id, | |
202 int32 renderer_id, | |
203 int32 command_buffer_id, | |
204 gfx::GLSurface* surface) : GLSurfaceAdapter(surface) { | |
205 helper_.reset(new ImageTransportHelper(this, | |
206 manager, | |
207 render_view_id, | |
208 renderer_id, | |
209 command_buffer_id, | |
210 gfx::kNullPluginWindow)); | |
211 } | |
212 | |
213 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { | |
214 } | |
215 | |
216 bool PassThroughImageTransportSurface::Initialize() { | |
217 // The surface is assumed to have already been initialized. | |
218 return helper_->Initialize(); | |
219 } | |
220 | |
221 void PassThroughImageTransportSurface::Destroy() { | |
222 helper_->Destroy(); | |
223 GLSurfaceAdapter::Destroy(); | |
224 } | |
225 | |
226 void PassThroughImageTransportSurface::OnNewSurfaceACK( | |
227 uint64 surface_id, TransportDIB::Handle surface_handle) { | |
228 } | |
229 | |
230 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { | |
231 } | |
232 | |
233 void PassThroughImageTransportSurface::OnResizeViewACK() { | |
234 helper_->SetScheduled(true); | |
235 } | |
236 | |
237 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { | |
238 helper_->SendResizeView(size); | |
239 helper_->SetScheduled(false); | |
240 } | |
241 | |
242 #endif // defined(ENABLE_GPU) | 148 #endif // defined(ENABLE_GPU) |
OLD | NEW |