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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 void SynchronousCompositorOutputSurface::ReleaseHwDraw() { | 155 void SynchronousCompositorOutputSurface::ReleaseHwDraw() { |
156 DCHECK(CalledOnValidThread()); | 156 DCHECK(CalledOnValidThread()); |
157 cc::OutputSurface::ReleaseGL(); | 157 cc::OutputSurface::ReleaseGL(); |
158 } | 158 } |
159 | 159 |
160 scoped_ptr<cc::CompositorFrame> | 160 scoped_ptr<cc::CompositorFrame> |
161 SynchronousCompositorOutputSurface::DemandDrawHw( | 161 SynchronousCompositorOutputSurface::DemandDrawHw( |
162 gfx::Size surface_size, | 162 gfx::Size surface_size, |
163 const gfx::Transform& transform, | 163 const gfx::Transform& transform, |
164 gfx::Rect viewport, | 164 gfx::Rect viewport, |
165 gfx::Rect clip) { | 165 gfx::Rect clip, |
| 166 gfx::Rect external_tiling_rect, |
| 167 gfx::Transform external_tiling_transform) { |
166 DCHECK(CalledOnValidThread()); | 168 DCHECK(CalledOnValidThread()); |
167 DCHECK(HasClient()); | 169 DCHECK(HasClient()); |
168 DCHECK(context_provider_); | 170 DCHECK(context_provider_); |
169 | 171 |
170 surface_size_ = surface_size; | 172 surface_size_ = surface_size; |
171 InvokeComposite(transform, viewport, clip, true); | 173 InvokeComposite(transform, |
| 174 viewport, |
| 175 clip, |
| 176 external_tiling_rect, |
| 177 external_tiling_transform, |
| 178 true); |
172 | 179 |
173 return frame_holder_.Pass(); | 180 return frame_holder_.Pass(); |
174 } | 181 } |
175 | 182 |
176 scoped_ptr<cc::CompositorFrame> | 183 scoped_ptr<cc::CompositorFrame> |
177 SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) { | 184 SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) { |
178 DCHECK(CalledOnValidThread()); | 185 DCHECK(CalledOnValidThread()); |
179 DCHECK(canvas); | 186 DCHECK(canvas); |
180 DCHECK(!current_sw_canvas_); | 187 DCHECK(!current_sw_canvas_); |
181 base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas); | 188 base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas); |
182 | 189 |
183 SkIRect canvas_clip; | 190 SkIRect canvas_clip; |
184 canvas->getClipDeviceBounds(&canvas_clip); | 191 canvas->getClipDeviceBounds(&canvas_clip); |
185 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip); | 192 gfx::Rect clip = gfx::SkIRectToRect(canvas_clip); |
186 | 193 |
187 gfx::Transform transform(gfx::Transform::kSkipInitialization); | 194 gfx::Transform transform(gfx::Transform::kSkipInitialization); |
188 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. | 195 transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4. |
189 | 196 |
190 surface_size_ = gfx::Size(canvas->getDeviceSize().width(), | 197 surface_size_ = gfx::Size(canvas->getDeviceSize().width(), |
191 canvas->getDeviceSize().height()); | 198 canvas->getDeviceSize().height()); |
192 | 199 |
193 InvokeComposite(transform, clip, clip, false); | 200 // Resourceless software draw does not need viewport_for_tiling. |
| 201 gfx::Rect empty; |
| 202 InvokeComposite(transform, clip, clip, empty, gfx::Transform(), false); |
194 | 203 |
195 return frame_holder_.Pass(); | 204 return frame_holder_.Pass(); |
196 } | 205 } |
197 | 206 |
198 void SynchronousCompositorOutputSurface::InvokeComposite( | 207 void SynchronousCompositorOutputSurface::InvokeComposite( |
199 const gfx::Transform& transform, | 208 const gfx::Transform& transform, |
200 gfx::Rect viewport, | 209 gfx::Rect viewport, |
201 gfx::Rect clip, | 210 gfx::Rect clip, |
| 211 gfx::Rect external_tiling_rect, |
| 212 gfx::Transform external_tiling_transform, |
202 bool hardware_draw) { | 213 bool hardware_draw) { |
203 DCHECK(!invoking_composite_); | 214 DCHECK(!invoking_composite_); |
204 DCHECK(!frame_holder_.get()); | 215 DCHECK(!frame_holder_.get()); |
205 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true); | 216 base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true); |
206 | 217 |
207 gfx::Transform adjusted_transform = transform; | 218 gfx::Transform adjusted_transform = transform; |
208 AdjustTransform(&adjusted_transform, viewport); | 219 AdjustTransform(&adjusted_transform, viewport); |
209 SetExternalDrawConstraints( | 220 SetExternalDrawConstraints(adjusted_transform, |
210 adjusted_transform, viewport, clip, !hardware_draw); | 221 viewport, |
| 222 clip, |
| 223 external_tiling_rect, |
| 224 external_tiling_transform, |
| 225 !hardware_draw); |
211 SetNeedsRedrawRect(gfx::Rect(viewport.size())); | 226 SetNeedsRedrawRect(gfx::Rect(viewport.size())); |
212 client_->BeginFrame(cc::BeginFrameArgs::CreateForSynchronousCompositor()); | 227 client_->BeginFrame(cc::BeginFrameArgs::CreateForSynchronousCompositor()); |
213 | 228 |
214 // After software draws (which might move the viewport arbitrarily), restore | 229 // After software draws (which might move the viewport arbitrarily), restore |
215 // the previous hardware viewport to allow CC's tile manager to prioritize | 230 // the previous hardware viewport to allow CC's tile manager to prioritize |
216 // properly. | 231 // properly. |
217 if (hardware_draw) { | 232 if (hardware_draw) { |
218 cached_hw_transform_ = adjusted_transform; | 233 cached_hw_transform_ = adjusted_transform; |
219 cached_hw_viewport_ = viewport; | 234 cached_hw_viewport_ = viewport; |
220 cached_hw_clip_ = clip; | 235 cached_hw_clip_ = clip; |
| 236 cached_hw_external_tiling_rect_ = external_tiling_rect; |
| 237 cached_hw_external_tiling_transform_ = external_tiling_transform; |
221 } else { | 238 } else { |
222 bool resourceless_software_draw = false; | 239 bool resourceless_software_draw = false; |
223 SetExternalDrawConstraints(cached_hw_transform_, | 240 SetExternalDrawConstraints(cached_hw_transform_, |
224 cached_hw_viewport_, | 241 cached_hw_viewport_, |
225 cached_hw_clip_, | 242 cached_hw_clip_, |
| 243 cached_hw_external_tiling_rect_, |
| 244 cached_hw_external_tiling_transform_, |
226 resourceless_software_draw); | 245 resourceless_software_draw); |
227 } | 246 } |
228 | 247 |
229 if (frame_holder_.get()) | 248 if (frame_holder_.get()) |
230 client_->DidSwapBuffersComplete(); | 249 client_->DidSwapBuffersComplete(); |
231 | 250 |
232 SynchronousCompositorOutputSurfaceDelegate* delegate = GetDelegate(); | 251 SynchronousCompositorOutputSurfaceDelegate* delegate = GetDelegate(); |
233 if (delegate) | 252 if (delegate) |
234 delegate->SetContinuousInvalidate(needs_begin_frame_); | 253 delegate->SetContinuousInvalidate(needs_begin_frame_); |
235 } | 254 } |
(...skipping 19 matching lines...) Expand all Loading... |
255 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const { | 274 bool SynchronousCompositorOutputSurface::CalledOnValidThread() const { |
256 return BrowserThread::CurrentlyOn(BrowserThread::UI); | 275 return BrowserThread::CurrentlyOn(BrowserThread::UI); |
257 } | 276 } |
258 | 277 |
259 SynchronousCompositorOutputSurfaceDelegate* | 278 SynchronousCompositorOutputSurfaceDelegate* |
260 SynchronousCompositorOutputSurface::GetDelegate() { | 279 SynchronousCompositorOutputSurface::GetDelegate() { |
261 return SynchronousCompositorImpl::FromRoutingID(routing_id_); | 280 return SynchronousCompositorImpl::FromRoutingID(routing_id_); |
262 } | 281 } |
263 | 282 |
264 } // namespace content | 283 } // namespace content |
OLD | NEW |