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

Unified Diff: cc/software_renderer.cc

Issue 12379055: Changed SoftwareOutputDevice interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698