OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 #include "cc/output/software_renderer.h" | 5 #include "cc/output/software_renderer.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/base/math_util.h" | 8 #include "cc/base/math_util.h" |
9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
10 #include "cc/output/compositor_frame_ack.h" | 10 #include "cc/output/compositor_frame_ack.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 SoftwareRenderer::~SoftwareRenderer() {} | 88 SoftwareRenderer::~SoftwareRenderer() {} |
89 | 89 |
90 const RendererCapabilities& SoftwareRenderer::Capabilities() const { | 90 const RendererCapabilities& SoftwareRenderer::Capabilities() const { |
91 return capabilities_; | 91 return capabilities_; |
92 } | 92 } |
93 | 93 |
94 void SoftwareRenderer::ViewportChanged() { | 94 void SoftwareRenderer::ViewportChanged() { |
95 output_device_->Resize(ViewportSize()); | 95 output_device_->Resize(ViewportSize()); |
96 } | 96 } |
97 | 97 |
98 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame& frame) { | 98 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
99 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); | 99 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); |
100 root_canvas_ = output_device_->BeginPaint( | 100 root_canvas_ = output_device_->BeginPaint( |
101 gfx::ToEnclosingRect(frame.root_damage_rect)); | 101 gfx::ToEnclosingRect(frame->root_damage_rect)); |
102 } | 102 } |
103 | 103 |
104 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame& frame) { | 104 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
105 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); | 105 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); |
106 current_framebuffer_lock_.reset(); | 106 current_framebuffer_lock_.reset(); |
107 current_canvas_ = NULL; | 107 current_canvas_ = NULL; |
108 root_canvas_ = NULL; | 108 root_canvas_ = NULL; |
109 if (Settings().compositor_frame_message) { | 109 if (Settings().compositor_frame_message) { |
110 compositor_frame_.metadata = client_->MakeCompositorFrameMetadata(); | 110 compositor_frame_.metadata = client_->MakeCompositorFrameMetadata(); |
111 output_device_->EndPaint(compositor_frame_.software_frame_data.get()); | 111 output_device_->EndPaint(compositor_frame_.software_frame_data.get()); |
112 } else { | 112 } else { |
113 output_device_->EndPaint(NULL); | 113 output_device_->EndPaint(NULL); |
114 } | 114 } |
(...skipping 26 matching lines...) Expand all Loading... |
141 // rendering, but the underlying effect we want is to clear any existing | 141 // rendering, but the underlying effect we want is to clear any existing |
142 // clipRect on the current SkCanvas. This is done by setting clipRect to | 142 // clipRect on the current SkCanvas. This is done by setting clipRect to |
143 // the viewport's dimensions. | 143 // the viewport's dimensions. |
144 is_scissor_enabled_ = false; | 144 is_scissor_enabled_ = false; |
145 SkDevice* device = current_canvas_->getDevice(); | 145 SkDevice* device = current_canvas_->getDevice(); |
146 SetClipRect(gfx::Rect(device->width(), device->height())); | 146 SetClipRect(gfx::Rect(device->width(), device->height())); |
147 } | 147 } |
148 | 148 |
149 void SoftwareRenderer::Finish() {} | 149 void SoftwareRenderer::Finish() {} |
150 | 150 |
151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame& frame) { | 151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
152 current_framebuffer_lock_.reset(); | 152 current_framebuffer_lock_.reset(); |
153 current_canvas_ = root_canvas_; | 153 current_canvas_ = root_canvas_; |
154 } | 154 } |
155 | 155 |
156 bool SoftwareRenderer::BindFramebufferToTexture( | 156 bool SoftwareRenderer::BindFramebufferToTexture( |
157 DrawingFrame& frame, | 157 DrawingFrame* frame, |
158 const ScopedResource* texture, | 158 const ScopedResource* texture, |
159 gfx::Rect framebuffer_rect) { | 159 gfx::Rect framebuffer_rect) { |
160 current_framebuffer_lock_ = make_scoped_ptr( | 160 current_framebuffer_lock_ = make_scoped_ptr( |
161 new ResourceProvider::ScopedWriteLockSoftware( | 161 new ResourceProvider::ScopedWriteLockSoftware( |
162 resource_provider_, texture->id())); | 162 resource_provider_, texture->id())); |
163 current_canvas_ = current_framebuffer_lock_->sk_canvas(); | 163 current_canvas_ = current_framebuffer_lock_->sk_canvas(); |
164 InitializeMatrices(frame, framebuffer_rect, false); | 164 InitializeMatrices(frame, framebuffer_rect, false); |
165 SetDrawViewportSize(framebuffer_rect.size()); | 165 SetDrawViewportSize(framebuffer_rect.size()); |
166 | 166 |
167 return true; | 167 return true; |
(...skipping 15 matching lines...) Expand all Loading... |
183 | 183 |
184 void SoftwareRenderer::ClearCanvas(SkColor color) { | 184 void SoftwareRenderer::ClearCanvas(SkColor color) { |
185 // SkCanvas::clear doesn't respect the current clipping region | 185 // SkCanvas::clear doesn't respect the current clipping region |
186 // so we SkCanvas::drawColor instead if scissoring is active. | 186 // so we SkCanvas::drawColor instead if scissoring is active. |
187 if (is_scissor_enabled_) | 187 if (is_scissor_enabled_) |
188 current_canvas_->drawColor(color, SkXfermode::kSrc_Mode); | 188 current_canvas_->drawColor(color, SkXfermode::kSrc_Mode); |
189 else | 189 else |
190 current_canvas_->clear(color); | 190 current_canvas_->clear(color); |
191 } | 191 } |
192 | 192 |
193 void SoftwareRenderer::ClearFramebuffer(DrawingFrame& frame) { | 193 void SoftwareRenderer::ClearFramebuffer(DrawingFrame* frame) { |
194 if (frame.current_render_pass->has_transparent_background) { | 194 if (frame->current_render_pass->has_transparent_background) { |
195 ClearCanvas(SkColorSetARGB(0, 0, 0, 0)); | 195 ClearCanvas(SkColorSetARGB(0, 0, 0, 0)); |
196 } else { | 196 } else { |
197 #ifndef NDEBUG | 197 #ifndef NDEBUG |
198 // On DEBUG builds, opaque render passes are cleared to blue | 198 // On DEBUG builds, opaque render passes are cleared to blue |
199 // to easily see regions that were not drawn on the screen. | 199 // to easily see regions that were not drawn on the screen. |
200 ClearCanvas(SkColorSetARGB(255, 0, 0, 255)); | 200 ClearCanvas(SkColorSetARGB(255, 0, 0, 255)); |
201 #endif | 201 #endif |
202 } | 202 } |
203 } | 203 } |
204 | 204 |
205 void SoftwareRenderer::SetDrawViewportSize(gfx::Size viewport_size) {} | 205 void SoftwareRenderer::SetDrawViewportSize(gfx::Size viewport_size) {} |
206 | 206 |
207 bool SoftwareRenderer::IsSoftwareResource( | 207 bool SoftwareRenderer::IsSoftwareResource( |
208 ResourceProvider::ResourceId resource_id) const { | 208 ResourceProvider::ResourceId resource_id) const { |
209 switch (resource_provider_->GetResourceType(resource_id)) { | 209 switch (resource_provider_->GetResourceType(resource_id)) { |
210 case ResourceProvider::GLTexture: | 210 case ResourceProvider::GLTexture: |
211 return false; | 211 return false; |
212 case ResourceProvider::Bitmap: | 212 case ResourceProvider::Bitmap: |
213 return true; | 213 return true; |
214 } | 214 } |
215 | 215 |
216 LOG(FATAL) << "Invalid resource type."; | 216 LOG(FATAL) << "Invalid resource type."; |
217 return false; | 217 return false; |
218 } | 218 } |
219 | 219 |
220 void SoftwareRenderer::DoDrawQuad(DrawingFrame& frame, const DrawQuad* quad) { | 220 void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { |
221 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); | 221 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); |
222 gfx::Transform quad_rect_matrix; | 222 gfx::Transform quad_rect_matrix; |
223 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); | 223 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); |
224 gfx::Transform contents_device_transform = | 224 gfx::Transform contents_device_transform = |
225 frame.window_matrix * frame.projection_matrix * quad_rect_matrix; | 225 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
226 contents_device_transform.FlattenTo2d(); | 226 contents_device_transform.FlattenTo2d(); |
227 SkMatrix sk_device_matrix; | 227 SkMatrix sk_device_matrix; |
228 ToSkMatrix(&sk_device_matrix, contents_device_transform); | 228 ToSkMatrix(&sk_device_matrix, contents_device_transform); |
229 current_canvas_->setMatrix(sk_device_matrix); | 229 current_canvas_->setMatrix(sk_device_matrix); |
230 | 230 |
231 current_paint_.reset(); | 231 current_paint_.reset(); |
232 if (!IsScaleAndTranslate(sk_device_matrix)) { | 232 if (!IsScaleAndTranslate(sk_device_matrix)) { |
233 current_paint_.setAntiAlias(true); | 233 current_paint_.setAntiAlias(true); |
234 current_paint_.setFilterBitmap(true); | 234 current_paint_.setFilterBitmap(true); |
235 } | 235 } |
(...skipping 22 matching lines...) Expand all Loading... |
258 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); | 258 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); |
259 break; | 259 break; |
260 default: | 260 default: |
261 DrawUnsupportedQuad(frame, quad); | 261 DrawUnsupportedQuad(frame, quad); |
262 break; | 262 break; |
263 } | 263 } |
264 | 264 |
265 current_canvas_->resetMatrix(); | 265 current_canvas_->resetMatrix(); |
266 } | 266 } |
267 | 267 |
268 void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame& frame, | 268 void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, |
269 const DebugBorderDrawQuad* quad) { | 269 const DebugBorderDrawQuad* quad) { |
270 // We need to apply the matrix manually to have pixel-sized stroke width. | 270 // We need to apply the matrix manually to have pixel-sized stroke width. |
271 SkPoint vertices[4]; | 271 SkPoint vertices[4]; |
272 gfx::RectFToSkRect(QuadVertexRect()).toQuad(vertices); | 272 gfx::RectFToSkRect(QuadVertexRect()).toQuad(vertices); |
273 SkPoint transformed_vertices[4]; | 273 SkPoint transformed_vertices[4]; |
274 current_canvas_->getTotalMatrix().mapPoints(transformed_vertices, | 274 current_canvas_->getTotalMatrix().mapPoints(transformed_vertices, |
275 vertices, | 275 vertices, |
276 4); | 276 4); |
277 current_canvas_->resetMatrix(); | 277 current_canvas_->resetMatrix(); |
278 | 278 |
279 current_paint_.setColor(quad->color); | 279 current_paint_.setColor(quad->color); |
280 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); | 280 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); |
281 current_paint_.setStyle(SkPaint::kStroke_Style); | 281 current_paint_.setStyle(SkPaint::kStroke_Style); |
282 current_paint_.setStrokeWidth(quad->width); | 282 current_paint_.setStrokeWidth(quad->width); |
283 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, | 283 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, |
284 4, transformed_vertices, current_paint_); | 284 4, transformed_vertices, current_paint_); |
285 } | 285 } |
286 | 286 |
287 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame& frame, | 287 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |
288 const SolidColorDrawQuad* quad) { | 288 const SolidColorDrawQuad* quad) { |
289 current_paint_.setColor(quad->color); | 289 current_paint_.setColor(quad->color); |
290 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); | 290 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); |
291 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), | 291 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), |
292 current_paint_); | 292 current_paint_); |
293 } | 293 } |
294 | 294 |
295 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame& frame, | 295 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, |
296 const TextureDrawQuad* quad) { | 296 const TextureDrawQuad* quad) { |
297 if (!IsSoftwareResource(quad->resource_id)) { | 297 if (!IsSoftwareResource(quad->resource_id)) { |
298 DrawUnsupportedQuad(frame, quad); | 298 DrawUnsupportedQuad(frame, quad); |
299 return; | 299 return; |
300 } | 300 } |
301 | 301 |
302 // FIXME: Add support for non-premultiplied alpha. | 302 // FIXME: Add support for non-premultiplied alpha. |
303 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 303 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
304 quad->resource_id); | 304 quad->resource_id); |
305 const SkBitmap* bitmap = lock.sk_bitmap(); | 305 const SkBitmap* bitmap = lock.sk_bitmap(); |
306 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left, | 306 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left, |
307 quad->uv_bottom_right), | 307 quad->uv_bottom_right), |
308 bitmap->width(), | 308 bitmap->width(), |
309 bitmap->height()); | 309 bitmap->height()); |
310 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); | 310 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); |
311 if (quad->flipped) | 311 if (quad->flipped) |
312 current_canvas_->scale(1, -1); | 312 current_canvas_->scale(1, -1); |
313 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, | 313 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, |
314 gfx::RectFToSkRect(QuadVertexRect()), | 314 gfx::RectFToSkRect(QuadVertexRect()), |
315 ¤t_paint_); | 315 ¤t_paint_); |
316 } | 316 } |
317 | 317 |
318 void SoftwareRenderer::DrawTileQuad(const DrawingFrame& frame, | 318 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, |
319 const TileDrawQuad* quad) { | 319 const TileDrawQuad* quad) { |
320 DCHECK(IsSoftwareResource(quad->resource_id)); | 320 DCHECK(IsSoftwareResource(quad->resource_id)); |
321 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 321 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
322 quad->resource_id); | 322 quad->resource_id); |
323 | 323 |
324 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); | 324 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); |
325 current_paint_.setFilterBitmap(true); | 325 current_paint_.setFilterBitmap(true); |
326 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, | 326 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, |
327 gfx::RectFToSkRect(QuadVertexRect()), | 327 gfx::RectFToSkRect(QuadVertexRect()), |
328 ¤t_paint_); | 328 ¤t_paint_); |
329 } | 329 } |
330 | 330 |
331 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame& frame, | 331 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame, |
332 const RenderPassDrawQuad* quad) { | 332 const RenderPassDrawQuad* quad) { |
333 CachedResource* content_texture = | 333 CachedResource* content_texture = |
334 render_pass_textures_.get(quad->render_pass_id); | 334 render_pass_textures_.get(quad->render_pass_id); |
335 if (!content_texture || !content_texture->id()) | 335 if (!content_texture || !content_texture->id()) |
336 return; | 336 return; |
337 | 337 |
338 DCHECK(IsSoftwareResource(content_texture->id())); | 338 DCHECK(IsSoftwareResource(content_texture->id())); |
339 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 339 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
340 content_texture->id()); | 340 content_texture->id()); |
341 | 341 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 mask_rasterizer->addLayer(mask_paint); | 387 mask_rasterizer->addLayer(mask_paint); |
388 | 388 |
389 current_paint_.setRasterizer(mask_rasterizer.get()); | 389 current_paint_.setRasterizer(mask_rasterizer.get()); |
390 current_canvas_->drawRect(dest_rect, current_paint_); | 390 current_canvas_->drawRect(dest_rect, current_paint_); |
391 } else { | 391 } else { |
392 // FIXME: Apply background filters and blend with content | 392 // FIXME: Apply background filters and blend with content |
393 current_canvas_->drawRect(dest_rect, current_paint_); | 393 current_canvas_->drawRect(dest_rect, current_paint_); |
394 } | 394 } |
395 } | 395 } |
396 | 396 |
397 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame& frame, | 397 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame, |
398 const DrawQuad* quad) { | 398 const DrawQuad* quad) { |
399 #ifndef NDEBUG | 399 #ifndef NDEBUG |
400 current_paint_.setColor(SK_ColorWHITE); | 400 current_paint_.setColor(SK_ColorWHITE); |
401 #else | 401 #else |
402 current_paint_.setColor(SK_ColorMAGENTA); | 402 current_paint_.setColor(SK_ColorMAGENTA); |
403 #endif | 403 #endif |
404 current_paint_.setAlpha(quad->opacity() * 255); | 404 current_paint_.setAlpha(quad->opacity() * 255); |
405 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), | 405 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), |
406 current_paint_); | 406 current_paint_); |
407 } | 407 } |
408 | 408 |
409 void SoftwareRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { | 409 void SoftwareRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { |
410 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels"); | 410 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels"); |
411 SkBitmap subset_bitmap; | 411 SkBitmap subset_bitmap; |
412 output_device_->CopyToBitmap(rect, &subset_bitmap); | 412 output_device_->CopyToBitmap(rect, &subset_bitmap); |
413 subset_bitmap.copyPixelsTo(pixels, | 413 subset_bitmap.copyPixelsTo(pixels, |
414 4 * rect.width() * rect.height(), | 414 4 * rect.width() * rect.height(), |
415 4 * rect.width()); | 415 4 * rect.width()); |
416 } | 416 } |
417 | 417 |
418 void SoftwareRenderer::SetVisible(bool visible) { | 418 void SoftwareRenderer::SetVisible(bool visible) { |
419 if (visible_ == visible) | 419 if (visible_ == visible) |
420 return; | 420 return; |
421 visible_ = visible; | 421 visible_ = visible; |
422 } | 422 } |
423 | 423 |
424 } // namespace cc | 424 } // namespace cc |
OLD | NEW |