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/software_renderer.h" | 5 #include "cc/software_renderer.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/debug_border_draw_quad.h" | 8 #include "cc/debug_border_draw_quad.h" |
9 #include "cc/math_util.h" | 9 #include "cc/math_util.h" |
10 #include "cc/render_pass_draw_quad.h" | 10 #include "cc/render_pass_draw_quad.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 , m_outputDevice(outputDevice) | 62 , m_outputDevice(outputDevice) |
63 , m_skCurrentCanvas(0) | 63 , m_skCurrentCanvas(0) |
64 { | 64 { |
65 m_resourceProvider->setDefaultResourceType(ResourceProvider::Bitmap); | 65 m_resourceProvider->setDefaultResourceType(ResourceProvider::Bitmap); |
66 | 66 |
67 m_capabilities.maxTextureSize = m_resourceProvider->maxTextureSize(); | 67 m_capabilities.maxTextureSize = m_resourceProvider->maxTextureSize(); |
68 m_capabilities.bestTextureFormat = m_resourceProvider->bestTextureFormat(); | 68 m_capabilities.bestTextureFormat = m_resourceProvider->bestTextureFormat(); |
69 m_capabilities.usingSetVisibility = true; | 69 m_capabilities.usingSetVisibility = true; |
70 // The updater can access bitmaps while the SoftwareRenderer is using them. | 70 // The updater can access bitmaps while the SoftwareRenderer is using them. |
71 m_capabilities.allowPartialTextureUpdates = true; | 71 m_capabilities.allowPartialTextureUpdates = true; |
| 72 m_capabilities.usingPartialSwap = true; |
72 | 73 |
73 viewportChanged(); | 74 viewportChanged(); |
74 } | 75 } |
75 | 76 |
76 SoftwareRenderer::~SoftwareRenderer() | 77 SoftwareRenderer::~SoftwareRenderer() |
77 { | 78 { |
78 } | 79 } |
79 | 80 |
80 const RendererCapabilities& SoftwareRenderer::capabilities() const | 81 const RendererCapabilities& SoftwareRenderer::capabilities() const |
81 { | 82 { |
82 return m_capabilities; | 83 return m_capabilities; |
83 } | 84 } |
84 | 85 |
85 void SoftwareRenderer::viewportChanged() | 86 void SoftwareRenderer::viewportChanged() |
86 { | 87 { |
87 m_outputDevice->DidChangeViewportSize(viewportSize()); | 88 m_outputDevice->Resize(viewportSize()); |
88 } | 89 } |
89 | 90 |
90 void SoftwareRenderer::beginDrawingFrame(DrawingFrame& frame) | 91 void SoftwareRenderer::beginDrawingFrame(DrawingFrame& frame) |
91 { | 92 { |
92 TRACE_EVENT0("cc", "SoftwareRenderer::beginDrawingFrame"); | 93 TRACE_EVENT0("cc", "SoftwareRenderer::beginDrawingFrame"); |
93 m_skRootCanvas = make_scoped_ptr(new SkCanvas(m_outputDevice->Lock(true)->ge
tSkBitmap())); | 94 m_skRootCanvas = m_outputDevice->BeginPaint(); |
94 } | 95 } |
95 | 96 |
96 void SoftwareRenderer::finishDrawingFrame(DrawingFrame& frame) | 97 void SoftwareRenderer::finishDrawingFrame(DrawingFrame& frame) |
97 { | 98 { |
98 TRACE_EVENT0("cc", "SoftwareRenderer::finishDrawingFrame"); | 99 TRACE_EVENT0("cc", "SoftwareRenderer::finishDrawingFrame"); |
99 m_currentFramebufferLock.reset(); | 100 m_currentFramebufferLock.reset(); |
100 m_skCurrentCanvas = 0; | 101 m_skCurrentCanvas = NULL; |
101 m_skRootCanvas.reset(); | 102 m_skRootCanvas = NULL; |
102 m_outputDevice->Unlock(); | 103 m_outputDevice->EndPaint(gfx::ToEnclosingRect(frame.rootDamageRect)); |
103 } | 104 } |
104 | 105 |
105 bool SoftwareRenderer::flippedFramebuffer() const | 106 bool SoftwareRenderer::flippedFramebuffer() const |
106 { | 107 { |
107 return false; | 108 return false; |
108 } | 109 } |
109 | 110 |
110 void SoftwareRenderer::ensureScissorTestEnabled() | 111 void SoftwareRenderer::ensureScissorTestEnabled() |
111 { | 112 { |
112 // Nothing to do here. Current implementation of software rendering has no | 113 // Nothing to do here. Current implementation of software rendering has no |
(...skipping 11 matching lines...) Expand all Loading... |
124 m_skCurrentCanvas->clipRect(canvasRect, SkRegion::kReplace_Op); | 125 m_skCurrentCanvas->clipRect(canvasRect, SkRegion::kReplace_Op); |
125 } | 126 } |
126 | 127 |
127 void SoftwareRenderer::finish() | 128 void SoftwareRenderer::finish() |
128 { | 129 { |
129 } | 130 } |
130 | 131 |
131 void SoftwareRenderer::bindFramebufferToOutputSurface(DrawingFrame& frame) | 132 void SoftwareRenderer::bindFramebufferToOutputSurface(DrawingFrame& frame) |
132 { | 133 { |
133 m_currentFramebufferLock.reset(); | 134 m_currentFramebufferLock.reset(); |
134 m_skCurrentCanvas = m_skRootCanvas.get(); | 135 m_skCurrentCanvas = m_skRootCanvas; |
135 } | 136 } |
136 | 137 |
137 bool SoftwareRenderer::bindFramebufferToTexture(DrawingFrame& frame, const Scope
dResource* texture, const gfx::Rect& framebufferRect) | 138 bool SoftwareRenderer::bindFramebufferToTexture(DrawingFrame& frame, const Scope
dResource* texture, const gfx::Rect& framebufferRect) |
138 { | 139 { |
139 m_currentFramebufferLock = make_scoped_ptr(new ResourceProvider::ScopedWrite
LockSoftware(m_resourceProvider, texture->id())); | 140 m_currentFramebufferLock = make_scoped_ptr(new ResourceProvider::ScopedWrite
LockSoftware(m_resourceProvider, texture->id())); |
140 m_skCurrentCanvas = m_currentFramebufferLock->skCanvas(); | 141 m_skCurrentCanvas = m_currentFramebufferLock->skCanvas(); |
141 initializeMatrices(frame, framebufferRect, false); | 142 initializeMatrices(frame, framebufferRect, false); |
142 setDrawViewportSize(framebufferRect.size()); | 143 setDrawViewportSize(framebufferRect.size()); |
143 | 144 |
144 return true; | 145 return true; |
145 } | 146 } |
146 | 147 |
147 void SoftwareRenderer::setScissorTestRect(const gfx::Rect& scissorRect) | 148 void SoftwareRenderer::setScissorTestRect(const gfx::Rect& scissorRect) |
148 { | 149 { |
149 m_skCurrentCanvas->clipRect(gfx::RectToSkRect(scissorRect), SkRegion::kRepla
ce_Op); | 150 m_skCurrentCanvas->clipRect(gfx::RectToSkRect(scissorRect), SkRegion::kRepla
ce_Op); |
150 } | 151 } |
151 | 152 |
152 void SoftwareRenderer::clearFramebuffer(DrawingFrame& frame) | 153 void SoftwareRenderer::clearFramebuffer(DrawingFrame& frame) |
153 { | 154 { |
154 if (frame.currentRenderPass->has_transparent_background) { | 155 if (frame.currentRenderPass->has_transparent_background) { |
155 m_skCurrentCanvas->clear(SkColorSetARGB(0, 0, 0, 0)); | 156 m_skCurrentCanvas->clear(SkColorSetARGB(0, 0, 0, 0)); |
156 } else { | 157 } else { |
157 #ifndef NDEBUG | 158 #ifndef NDEBUG |
158 // On DEBUG builds, opaque render passes are cleared to blue to easily s
ee regions that were not drawn on the screen. | 159 // On DEBUG builds, opaque render passes are cleared to blue to easily s
ee regions that were not drawn on the screen. |
159 m_skCurrentCanvas->clear(SkColorSetARGB(255, 0, 0, 255)); | 160 SkPaint paint = m_skCurrentPaint; |
| 161 paint.setColor(SkColorSetARGB(255, 0, 0, 255)); |
| 162 m_skCurrentCanvas->drawPaint(paint); |
160 #endif | 163 #endif |
161 } | 164 } |
162 } | 165 } |
163 | 166 |
164 void SoftwareRenderer::setDrawViewportSize(const gfx::Size& viewportSize) | 167 void SoftwareRenderer::setDrawViewportSize(const gfx::Size& viewportSize) |
165 { | 168 { |
166 } | 169 } |
167 | 170 |
168 bool SoftwareRenderer::isSoftwareResource(ResourceProvider::ResourceId id) const | 171 bool SoftwareRenderer::isSoftwareResource(ResourceProvider::ResourceId id) const |
169 { | 172 { |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 bool SoftwareRenderer::swapBuffers() | 359 bool SoftwareRenderer::swapBuffers() |
357 { | 360 { |
358 if (m_client->hasImplThread()) | 361 if (m_client->hasImplThread()) |
359 m_client->onSwapBuffersComplete(); | 362 m_client->onSwapBuffersComplete(); |
360 return true; | 363 return true; |
361 } | 364 } |
362 | 365 |
363 void SoftwareRenderer::getFramebufferPixels(void *pixels, const gfx::Rect& rect) | 366 void SoftwareRenderer::getFramebufferPixels(void *pixels, const gfx::Rect& rect) |
364 { | 367 { |
365 TRACE_EVENT0("cc", "SoftwareRenderer::getFramebufferPixels"); | 368 TRACE_EVENT0("cc", "SoftwareRenderer::getFramebufferPixels"); |
366 SkBitmap fullBitmap = m_outputDevice->Lock(false)->getSkBitmap(); | |
367 SkBitmap subsetBitmap; | 369 SkBitmap subsetBitmap; |
368 SkIRect invertRect = SkIRect::MakeXYWH(rect.x(), viewportSize().height() - r
ect.bottom(), rect.width(), rect.height()); | 370 m_outputDevice->CopyToBitmap(rect, &subsetBitmap); |
369 fullBitmap.extractSubset(&subsetBitmap, invertRect); | 371 subsetBitmap.copyPixelsTo(pixels, |
370 subsetBitmap.copyPixelsTo(pixels, rect.width() * rect.height() * 4, rect.wid
th() * 4); | 372 4 * rect.width() * rect.height(), |
371 m_outputDevice->Unlock(); | 373 4 * rect.width()); |
372 } | 374 } |
373 | 375 |
374 void SoftwareRenderer::setVisible(bool visible) | 376 void SoftwareRenderer::setVisible(bool visible) |
375 { | 377 { |
376 if (m_visible == visible) | 378 if (m_visible == visible) |
377 return; | 379 return; |
378 m_visible = visible; | 380 m_visible = visible; |
379 } | 381 } |
380 | 382 |
381 } // namespace cc | 383 } // namespace cc |
OLD | NEW |