OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "content/browser/android/in_process/synchronous_compositor_output_surfa
ce.h" | 5 #include "content/browser/android/in_process/synchronous_compositor_output_surfa
ce.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "cc/output/begin_frame_args.h" | 9 #include "cc/output/begin_frame_args.h" |
10 #include "cc/output/compositor_frame.h" | 10 #include "cc/output/compositor_frame.h" |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 } | 179 } |
180 SynchronousCompositorOutputSurfaceDelegate* delegate = GetDelegate(); | 180 SynchronousCompositorOutputSurfaceDelegate* delegate = GetDelegate(); |
181 if (delegate) | 181 if (delegate) |
182 delegate->UpdateFrameMetaData(frame->metadata); | 182 delegate->UpdateFrameMetaData(frame->metadata); |
183 | 183 |
184 did_swap_buffer_ = true; | 184 did_swap_buffer_ = true; |
185 DidSwapBuffers(); | 185 DidSwapBuffers(); |
186 } | 186 } |
187 | 187 |
188 namespace { | 188 namespace { |
189 void AdjustTransformForClip(gfx::Transform* transform, gfx::Rect clip) { | 189 void AdjustTransform(gfx::Transform* transform, gfx::Rect viewport) { |
190 // The system-provided transform translates us from the screen origin to the | 190 // CC's draw origin starts at the viewport. |
191 // origin of the clip rect, but CC's draw origin starts at the clip. | 191 transform->matrix().postTranslate(-viewport.x(), -viewport.y(), 0); |
192 transform->matrix().postTranslate(-clip.x(), -clip.y(), 0); | |
193 } | 192 } |
194 } // namespace | 193 } // namespace |
195 | 194 |
196 bool SynchronousCompositorOutputSurface::InitializeHwDraw( | 195 bool SynchronousCompositorOutputSurface::InitializeHwDraw( |
197 scoped_refptr<gfx::GLSurface> surface, | 196 scoped_refptr<gfx::GLSurface> surface, |
198 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { | 197 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { |
199 DCHECK(CalledOnValidThread()); | 198 DCHECK(CalledOnValidThread()); |
200 DCHECK(HasClient()); | 199 DCHECK(HasClient()); |
201 DCHECK(!context_provider_); | 200 DCHECK(!context_provider_); |
202 DCHECK(surface); | 201 DCHECK(surface); |
203 | 202 |
204 scoped_refptr<cc::ContextProvider> onscreen_context_provider = | 203 scoped_refptr<cc::ContextProvider> onscreen_context_provider = |
205 webkit::gpu::ContextProviderInProcess::Create( | 204 webkit::gpu::ContextProviderInProcess::Create( |
206 CreateWebGraphicsContext3D(surface)); | 205 CreateWebGraphicsContext3D(surface)); |
207 return InitializeAndSetContext3d(onscreen_context_provider, | 206 return InitializeAndSetContext3d(onscreen_context_provider, |
208 offscreen_context_provider); | 207 offscreen_context_provider); |
209 } | 208 } |
210 | 209 |
211 void SynchronousCompositorOutputSurface::ReleaseHwDraw() { | 210 void SynchronousCompositorOutputSurface::ReleaseHwDraw() { |
212 cc::OutputSurface::ReleaseGL(); | 211 cc::OutputSurface::ReleaseGL(); |
213 } | 212 } |
214 | 213 |
215 bool SynchronousCompositorOutputSurface::DemandDrawHw( | 214 bool SynchronousCompositorOutputSurface::DemandDrawHw( |
216 gfx::Size surface_size, | 215 gfx::Size surface_size, |
217 const gfx::Transform& transform, | 216 const gfx::Transform& transform, |
| 217 gfx::Rect viewport, |
218 gfx::Rect clip, | 218 gfx::Rect clip, |
219 bool stencil_enabled) { | 219 bool stencil_enabled) { |
220 DCHECK(CalledOnValidThread()); | 220 DCHECK(CalledOnValidThread()); |
221 DCHECK(HasClient()); | 221 DCHECK(HasClient()); |
222 DCHECK(context_provider_); | 222 DCHECK(context_provider_); |
223 | 223 |
224 gfx::Transform adjusted_transform = transform; | |
225 AdjustTransformForClip(&adjusted_transform, clip); | |
226 surface_size_ = surface_size; | 224 surface_size_ = surface_size; |
227 SetExternalDrawConstraints(adjusted_transform, clip); | |
228 SetExternalStencilTest(stencil_enabled); | 225 SetExternalStencilTest(stencil_enabled); |
229 InvokeComposite(clip.size()); | 226 InvokeComposite(transform, viewport, clip, true); |
230 | 227 |
231 return did_swap_buffer_; | 228 return did_swap_buffer_; |
232 } | 229 } |
233 | 230 |
234 bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) { | 231 bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) { |
235 DCHECK(CalledOnValidThread()); | 232 DCHECK(CalledOnValidThread()); |
236 DCHECK(canvas); | 233 DCHECK(canvas); |
237 DCHECK(!current_sw_canvas_); | 234 DCHECK(!current_sw_canvas_); |
238 base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas); | 235 base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas); |
239 | 236 |
240 SkIRect canvas_clip; | 237 SkIRect canvas_clip; |
241 canvas->getClipDeviceBounds(&canvas_clip); | 238 canvas->getClipDeviceBounds(&canvas_clip); |
242 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip); | 239 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip); |
243 | 240 |
244 gfx::Transform transform(gfx::Transform::kSkipInitialization); | 241 gfx::Transform transform(gfx::Transform::kSkipInitialization); |
245 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. | 242 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. |
246 AdjustTransformForClip(&transform, clip); | |
247 | 243 |
248 surface_size_ = gfx::Size(canvas->getDeviceSize().width(), | 244 surface_size_ = gfx::Size(canvas->getDeviceSize().width(), |
249 canvas->getDeviceSize().height()); | 245 canvas->getDeviceSize().height()); |
250 SetExternalDrawConstraints(transform, clip); | |
251 SetExternalStencilTest(false); | 246 SetExternalStencilTest(false); |
252 | 247 |
253 InvokeComposite(clip.size()); | 248 InvokeComposite(transform, clip, clip, false); |
254 | 249 |
255 return did_swap_buffer_; | 250 return did_swap_buffer_; |
256 } | 251 } |
257 | 252 |
258 void SynchronousCompositorOutputSurface::InvokeComposite( | 253 void SynchronousCompositorOutputSurface::InvokeComposite( |
259 gfx::Size damage_size) { | 254 const gfx::Transform& transform, |
| 255 gfx::Rect viewport, |
| 256 gfx::Rect clip, |
| 257 bool valid_for_tile_management) { |
260 DCHECK(!invoking_composite_); | 258 DCHECK(!invoking_composite_); |
261 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true); | 259 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true); |
262 did_swap_buffer_ = false; | 260 did_swap_buffer_ = false; |
263 SetNeedsRedrawRect(gfx::Rect(damage_size)); | 261 |
| 262 gfx::Transform adjusted_transform = transform; |
| 263 AdjustTransform(&adjusted_transform, viewport); |
| 264 SetExternalDrawConstraints( |
| 265 adjusted_transform, viewport, clip, valid_for_tile_management); |
| 266 SetNeedsRedrawRect(gfx::Rect(viewport.size())); |
| 267 |
264 if (needs_begin_frame_) | 268 if (needs_begin_frame_) |
265 BeginFrame(cc::BeginFrameArgs::CreateForSynchronousCompositor()); | 269 BeginFrame(cc::BeginFrameArgs::CreateForSynchronousCompositor()); |
266 | 270 |
| 271 // After software draws (which might move the viewport arbitrarily), restore |
| 272 // the previous hardware viewport to allow CC's tile manager to prioritize |
| 273 // properly. |
| 274 if (valid_for_tile_management) { |
| 275 cached_hw_transform_ = adjusted_transform; |
| 276 cached_hw_viewport_ = viewport; |
| 277 cached_hw_clip_ = clip; |
| 278 } else { |
| 279 SetExternalDrawConstraints( |
| 280 cached_hw_transform_, cached_hw_viewport_, cached_hw_clip_, true); |
| 281 } |
| 282 |
267 if (did_swap_buffer_) | 283 if (did_swap_buffer_) |
268 OnSwapBuffersComplete(NULL); | 284 OnSwapBuffersComplete(NULL); |
269 } | 285 } |
270 | 286 |
271 void SynchronousCompositorOutputSurface::PostCheckForRetroactiveBeginFrame() { | 287 void SynchronousCompositorOutputSurface::PostCheckForRetroactiveBeginFrame() { |
272 // Synchronous compositor cannot perform retroactive begin frames, so | 288 // Synchronous compositor cannot perform retroactive begin frames, so |
273 // intentionally no-op here. | 289 // intentionally no-op here. |
274 } | 290 } |
275 | 291 |
276 // Not using base::NonThreadSafe as we want to enforce a more exacting threading | 292 // Not using base::NonThreadSafe as we want to enforce a more exacting threading |
277 // requirement: SynchronousCompositorOutputSurface() must only be used on the UI | 293 // requirement: SynchronousCompositorOutputSurface() must only be used on the UI |
278 // thread. | 294 // thread. |
279 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const { | 295 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const { |
280 return BrowserThread::CurrentlyOn(BrowserThread::UI); | 296 return BrowserThread::CurrentlyOn(BrowserThread::UI); |
281 } | 297 } |
282 | 298 |
283 SynchronousCompositorOutputSurfaceDelegate* | 299 SynchronousCompositorOutputSurfaceDelegate* |
284 SynchronousCompositorOutputSurface::GetDelegate() { | 300 SynchronousCompositorOutputSurface::GetDelegate() { |
285 return SynchronousCompositorImpl::FromRoutingID(routing_id_); | 301 return SynchronousCompositorImpl::FromRoutingID(routing_id_); |
286 } | 302 } |
287 | 303 |
288 } // namespace content | 304 } // namespace content |
OLD | NEW |