Chromium Code Reviews| Index: cc/software_renderer.cc |
| diff --git a/cc/software_renderer.cc b/cc/software_renderer.cc |
| index e1764c79a4c24b69c6ebb5bfcefb94f202b21054..9b025c8f13e6c6646863535870db602b024b687f 100644 |
| --- a/cc/software_renderer.cc |
| +++ b/cc/software_renderer.cc |
| @@ -5,8 +5,12 @@ |
| #include "cc/software_renderer.h" |
| #include "base/debug/trace_event.h" |
| +#include "cc/compositor_frame.h" |
| +#include "cc/compositor_frame_ack.h" |
| +#include "cc/compositor_frame_metadata.h" |
| #include "cc/debug_border_draw_quad.h" |
| #include "cc/math_util.h" |
| +#include "cc/output_surface.h" |
| #include "cc/render_pass_draw_quad.h" |
| #include "cc/software_output_device.h" |
| #include "cc/solid_color_draw_quad.h" |
| @@ -52,16 +56,19 @@ bool isScaleAndTranslate(const SkMatrix& matrix) |
| } // anonymous namespace |
| -scoped_ptr<SoftwareRenderer> SoftwareRenderer::create(RendererClient* client, ResourceProvider* resourceProvider, SoftwareOutputDevice* outputDevice) |
| +scoped_ptr<SoftwareRenderer> SoftwareRenderer::create(RendererClient* client, OutputSurface* outputSurface, ResourceProvider* resourceProvider) |
| { |
| - return make_scoped_ptr(new SoftwareRenderer(client, resourceProvider, outputDevice)); |
| + return make_scoped_ptr(new SoftwareRenderer(client, outputSurface, resourceProvider)); |
| } |
| -SoftwareRenderer::SoftwareRenderer(RendererClient* client, ResourceProvider* resourceProvider, SoftwareOutputDevice* outputDevice) |
| +SoftwareRenderer::SoftwareRenderer(RendererClient* client, |
| + OutputSurface* outputSurface, |
| + ResourceProvider* resourceProvider) |
| : DirectRenderer(client, resourceProvider) |
| + , m_outputSurface(outputSurface) |
| , m_visible(true) |
| , m_isScissorEnabled(false) |
| - , m_outputDevice(outputDevice) |
| + , m_outputDevice(outputSurface->software_device()) |
| , m_skCurrentCanvas(0) |
| { |
| m_resourceProvider->setDefaultResourceType(ResourceProvider::Bitmap); |
| @@ -72,6 +79,9 @@ SoftwareRenderer::SoftwareRenderer(RendererClient* client, ResourceProvider* res |
| // The updater can access bitmaps while the SoftwareRenderer is using them. |
| m_capabilities.allowPartialTextureUpdates = true; |
| m_capabilities.usingPartialSwap = true; |
| + if (m_client->hasImplThread()) |
| + m_capabilities.usingSwapCompleteCallback = true; |
| + m_compositorFrame.software_frame_data.reset(new SoftwareFrameData()); |
| viewportChanged(); |
| } |
| @@ -87,22 +97,42 @@ const RendererCapabilities& SoftwareRenderer::capabilities() const |
| void SoftwareRenderer::viewportChanged() |
| { |
| - m_outputDevice->DidChangeViewportSize(viewportSize()); |
| + m_outputDevice->Resize(viewportSize()); |
| } |
| void SoftwareRenderer::beginDrawingFrame(DrawingFrame& frame) |
| { |
| TRACE_EVENT0("cc", "SoftwareRenderer::beginDrawingFrame"); |
| - m_skRootCanvas = make_scoped_ptr(new SkCanvas(m_outputDevice->Lock(true)->getSkBitmap())); |
| + m_skRootCanvas = m_outputDevice->BeginPaint( |
| + gfx::ToEnclosingRect(frame.rootDamageRect)); |
| } |
| void SoftwareRenderer::finishDrawingFrame(DrawingFrame& frame) |
| { |
| TRACE_EVENT0("cc", "SoftwareRenderer::finishDrawingFrame"); |
| m_currentFramebufferLock.reset(); |
| - m_skCurrentCanvas = 0; |
| - m_skRootCanvas.reset(); |
| - m_outputDevice->Unlock(); |
| + m_skCurrentCanvas = NULL; |
| + m_skRootCanvas = NULL; |
| + if (settings().compositorFrameMessage) { |
| + m_compositorFrame.metadata = m_client->makeCompositorFrameMetadata(); |
| + m_outputDevice->EndPaint(m_compositorFrame.software_frame_data.get()); |
| + } else { |
| + m_outputDevice->EndPaint(); |
| + } |
| +} |
| + |
| +bool SoftwareRenderer::swapBuffers() |
| +{ |
| + if (settings().compositorFrameMessage) |
| + m_outputSurface->SendFrameToParentCompositor(&m_compositorFrame); |
| + return true; |
| +} |
| + |
| +void SoftwareRenderer::receiveCompositorFrameAck(const CompositorFrameAck& ack) |
| +{ |
| + if (m_client->hasImplThread()) |
| + m_client->onSwapBuffersComplete(); |
| + m_outputDevice->ReclaimDIB(ack.last_content_dib); |
|
enne (OOO)
2013/03/01 23:51:34
It seems weird to land this function that calls Re
|
| } |
| bool SoftwareRenderer::flippedFramebuffer() const |
| @@ -134,7 +164,7 @@ void SoftwareRenderer::finish() |
| void SoftwareRenderer::bindFramebufferToOutputSurface(DrawingFrame& frame) |
| { |
| m_currentFramebufferLock.reset(); |
| - m_skCurrentCanvas = m_skRootCanvas.get(); |
| + m_skCurrentCanvas = m_skRootCanvas; |
| } |
| bool SoftwareRenderer::bindFramebufferToTexture(DrawingFrame& frame, const ScopedResource* texture, const gfx::Rect& framebufferRect) |
| @@ -374,22 +404,14 @@ void SoftwareRenderer::drawUnsupportedQuad(const DrawingFrame& frame, const Draw |
| m_skCurrentCanvas->drawRect(gfx::RectFToSkRect(quadVertexRect()), m_skCurrentPaint); |
| } |
| -bool SoftwareRenderer::swapBuffers() |
| -{ |
| - if (m_client->hasImplThread()) |
| - m_client->onSwapBuffersComplete(); |
| - return true; |
| -} |
| - |
| void SoftwareRenderer::getFramebufferPixels(void *pixels, const gfx::Rect& rect) |
| { |
| TRACE_EVENT0("cc", "SoftwareRenderer::getFramebufferPixels"); |
| - SkBitmap fullBitmap = m_outputDevice->Lock(false)->getSkBitmap(); |
| SkBitmap subsetBitmap; |
| - SkIRect invertRect = SkIRect::MakeXYWH(rect.x(), viewportSize().height() - rect.bottom(), rect.width(), rect.height()); |
| - fullBitmap.extractSubset(&subsetBitmap, invertRect); |
| - subsetBitmap.copyPixelsTo(pixels, rect.width() * rect.height() * 4, rect.width() * 4); |
| - m_outputDevice->Unlock(); |
| + m_outputDevice->CopyToBitmap(rect, &subsetBitmap); |
| + subsetBitmap.copyPixelsTo(pixels, |
| + 4 * rect.width() * rect.height(), |
| + 4 * rect.width()); |
| } |
| void SoftwareRenderer::setVisible(bool visible) |