Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: cc/software_renderer.cc

Issue 11967033: [CLOSED] In-browser software compositing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix the lack SkCanvas::clear scissoring. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/software_renderer.h ('k') | cc/software_renderer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « cc/software_renderer.h ('k') | cc/software_renderer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698