https://bugs.webkit.org/show_bug.cgi?id=76732
Patch by Justin Novosad <junov@chromium.org> on 2012-02-01
Reviewed by Stephen White.
Source/WebCore:
No new tests: covered by existing canvas layout tests
Adding a new setting to enable deferred 2d canvas rendering.
Added support for deferred 2d canvas rendering in ImageBufferSkia
and Canvas2DLayerChromium, mostly plumbing. Deffered rendering
implementation is provided by skia (class SkDeferredCanvas).
* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::shouldDefer):
(WebCore):
(WebCore::HTMLCanvasElement::createImageBuffer):
* html/HTMLCanvasElement.h:
(HTMLCanvasElement):
* page/Settings.cpp:
(WebCore::Settings::Settings):
(WebCore::Settings::setAccelerated2dCanvasEnabled):
(WebCore):
(WebCore::Settings::setDeferred2dCanvasEnabled):
* page/Settings.h:
(Settings):
(WebCore::Settings::deferred2dCanvasEnabled):
* platform/graphics/ImageBuffer.h:
(WebCore::ImageBuffer::create):
(ImageBuffer):
* platform/graphics/cairo/ImageBufferCairo.cpp:
(WebCore::ImageBuffer::ImageBuffer):
* platform/graphics/cg/ImageBufferCG.cpp:
(WebCore::ImageBuffer::ImageBuffer):
* platform/graphics/chromium/Canvas2DLayerChromium.cpp:
(WebCore::Canvas2DLayerChromium::Canvas2DLayerChromium):
(WebCore):
(WebCore::Canvas2DLayerChromium::setCanvas):
(WebCore::Canvas2DLayerChromium::paintContentsIfDirty):
* platform/graphics/chromium/Canvas2DLayerChromium.h:
(Canvas2DLayerChromium):
* platform/graphics/qt/ImageBufferQt.cpp:
(WebCore::ImageBuffer::ImageBuffer):
* platform/graphics/skia/ImageBufferSkia.cpp:
(AcceleratedDeviceContext):
(WebCore::AcceleratedDeviceContext::AcceleratedDeviceContext):
(WebCore::AcceleratedDeviceContext::prepareForDraw):
(WebCore::AcceleratedDeviceContext::flush):
(WebCore):
(WebCore::createAcceleratedCanvas):
(WebCore::ImageBuffer::ImageBuffer):
* platform/graphics/wince/ImageBufferWinCE.cpp:
(WebCore::ImageBuffer::ImageBuffer):
* platform/graphics/wx/ImageBufferWx.cpp:
(WebCore::ImageBuffer::ImageBuffer):
Source/WebKit/chromium:
Adding a new setting for enabling deferred 2d canvas rendering
* public/WebSettings.h:
* src/WebSettingsImpl.cpp:
(WebKit::WebSettingsImpl::setDeferred2dCanvasEnabled):
(WebKit):
* src/WebSettingsImpl.h:
(WebSettingsImpl):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@106500
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-02-01 Justin Novosad <junov@chromium.org>
+
+ [Chromium] Enable deferred canvas rendering in the skia port
+ https://bugs.webkit.org/show_bug.cgi?id=76732
+
+ Reviewed by Stephen White.
+
+ No new tests: covered by existing canvas layout tests
+
+ Adding a new setting to enable deferred 2d canvas rendering.
+ Added support for deferred 2d canvas rendering in ImageBufferSkia
+ and Canvas2DLayerChromium, mostly plumbing. Deffered rendering
+ implementation is provided by skia (class SkDeferredCanvas).
+
+ * html/HTMLCanvasElement.cpp:
+ (WebCore::HTMLCanvasElement::shouldDefer):
+ (WebCore):
+ (WebCore::HTMLCanvasElement::createImageBuffer):
+ * html/HTMLCanvasElement.h:
+ (HTMLCanvasElement):
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ (WebCore::Settings::setAccelerated2dCanvasEnabled):
+ (WebCore):
+ (WebCore::Settings::setDeferred2dCanvasEnabled):
+ * page/Settings.h:
+ (Settings):
+ (WebCore::Settings::deferred2dCanvasEnabled):
+ * platform/graphics/ImageBuffer.h:
+ (WebCore::ImageBuffer::create):
+ (ImageBuffer):
+ * platform/graphics/cairo/ImageBufferCairo.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/cg/ImageBufferCG.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/chromium/Canvas2DLayerChromium.cpp:
+ (WebCore::Canvas2DLayerChromium::Canvas2DLayerChromium):
+ (WebCore):
+ (WebCore::Canvas2DLayerChromium::setCanvas):
+ (WebCore::Canvas2DLayerChromium::paintContentsIfDirty):
+ * platform/graphics/chromium/Canvas2DLayerChromium.h:
+ (Canvas2DLayerChromium):
+ * platform/graphics/qt/ImageBufferQt.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/skia/ImageBufferSkia.cpp:
+ (AcceleratedDeviceContext):
+ (WebCore::AcceleratedDeviceContext::AcceleratedDeviceContext):
+ (WebCore::AcceleratedDeviceContext::prepareForDraw):
+ (WebCore::AcceleratedDeviceContext::flush):
+ (WebCore):
+ (WebCore::createAcceleratedCanvas):
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/wince/ImageBufferWinCE.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/wx/ImageBufferWx.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+
2012-02-01 Ryosuke Niwa <rniwa@webkit.org>
Gcc build fix after r106482.
#endif
}
+bool HTMLCanvasElement::shouldDefer() const
+{
+#if USE(SKIA)
+ if (m_context && !m_context->is2d())
+ return false;
+
+ Settings* settings = document()->settings();
+ if (!settings || !settings->deferred2dCanvasEnabled())
+ return false;
+
+ return true;
+#else
+ return false;
+#endif
+}
+
void HTMLCanvasElement::createImageBuffer() const
{
ASSERT(!m_imageBuffer);
#else
Unaccelerated;
#endif
- m_imageBuffer = ImageBuffer::create(bufferSize, ColorSpaceDeviceRGB, renderingMode);
+ DeferralMode deferralMode = shouldDefer() ? Deferred : NonDeferred;
+ m_imageBuffer = ImageBuffer::create(bufferSize, ColorSpaceDeviceRGB, renderingMode, deferralMode);
if (!m_imageBuffer)
return;
m_imageBuffer->context()->scale(FloatSize(bufferSize.width() / logicalSize.width(), bufferSize.height() / logicalSize.height()));
void setSurfaceSize(const IntSize&);
+ bool shouldDefer() const;
+
HashSet<CanvasObserver*> m_observers;
IntSize m_size;
, m_privilegedWebGLExtensionsEnabled(false)
, m_webAudioEnabled(false)
, m_acceleratedCanvas2dEnabled(false)
+ , m_deferredCanvas2dEnabled(false)
, m_loadDeferringEnabled(true)
, m_tiledBackingStoreEnabled(false)
, m_paginateDuringLayoutEnabled(false)
m_acceleratedCanvas2dEnabled = enabled;
}
+void Settings::setDeferred2dCanvasEnabled(bool enabled)
+{
+ m_deferredCanvas2dEnabled = enabled;
+}
+
void Settings::setMinimumAccelerated2dCanvasSize(int numPixels)
{
m_minimumAccelerated2dCanvasSize = numPixels;
void setAccelerated2dCanvasEnabled(bool);
bool accelerated2dCanvasEnabled() const { return m_acceleratedCanvas2dEnabled; }
+ void setDeferred2dCanvasEnabled(bool);
+ bool deferred2dCanvasEnabled() const { return m_deferredCanvas2dEnabled; }
+
// Number of pixels below which 2D canvas is rendered in software
// even if hardware acceleration is enabled.
// Hardware acceleration is useful for large canvases where it can avoid the
bool m_privilegedWebGLExtensionsEnabled : 1;
bool m_webAudioEnabled : 1;
bool m_acceleratedCanvas2dEnabled : 1;
+ bool m_deferredCanvas2dEnabled : 1;
bool m_loadDeferringEnabled : 1;
bool m_tiledBackingStoreEnabled : 1;
bool m_paginateDuringLayoutEnabled : 1;
DontCopyBackingStore // Subsequent draws may affect the copy.
};
+ enum DeferralMode {
+ NonDeferred,
+ Deferred
+ };
+
class ImageBuffer {
WTF_MAKE_NONCOPYABLE(ImageBuffer); WTF_MAKE_FAST_ALLOCATED;
public:
// Will return a null pointer on allocation failure.
- static PassOwnPtr<ImageBuffer> create(const IntSize& size, ColorSpace colorSpace = ColorSpaceDeviceRGB, RenderingMode renderingMode = Unaccelerated)
+ static PassOwnPtr<ImageBuffer> create(const IntSize& size, ColorSpace colorSpace = ColorSpaceDeviceRGB, RenderingMode renderingMode = Unaccelerated, DeferralMode deferralMode = NonDeferred)
{
bool success = false;
- OwnPtr<ImageBuffer> buf = adoptPtr(new ImageBuffer(size, colorSpace, renderingMode, success));
+ OwnPtr<ImageBuffer> buf = adoptPtr(new ImageBuffer(size, colorSpace, renderingMode, deferralMode, success));
if (success)
return buf.release();
return nullptr;
// This constructor will place its success into the given out-variable
// so that create() knows when it should return failure.
- ImageBuffer(const IntSize&, ColorSpace, RenderingMode, bool& success);
+ ImageBuffer(const IntSize&, ColorSpace, RenderingMode, DeferralMode, bool& success);
};
#if USE(CG) || USE(SKIA)
{
}
-ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode, DeferralMode, bool& success)
: m_data(size)
, m_size(size)
{
fastFree(const_cast<void*>(data));
}
-ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace imageColorSpace, RenderingMode renderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace imageColorSpace, RenderingMode renderingMode, DeferralMode, bool& success)
: m_data(size)
, m_size(size)
{
#include "GraphicsContext3D.h"
#include "LayerRendererChromium.h" // For the GLC() macro
-#if USE(SKIA)
#include "GrContext.h"
-#endif
+#include "SkCanvas.h"
+#include "SkDevice.h"
namespace WebCore {
, m_backTextureId(0)
, m_fbo(0)
, m_useDoubleBuffering(CCProxy::hasImplThread())
+ , m_canvas(0)
{
if (m_useDoubleBuffering)
GLC(m_context, m_fbo = m_context->createFramebuffer());
&& m_context && (m_context->getExtensions()->getGraphicsResetStatusARB() == GraphicsContext3D::NO_ERROR);
}
+void Canvas2DLayerChromium::setCanvas(SkCanvas* canvas)
+{
+ m_canvas = canvas;
+}
+
void Canvas2DLayerChromium::paintContentsIfDirty(const Region& /* occludedScreenSpace */)
{
if (!drawsContent())
bool success = m_context->makeContextCurrent();
ASSERT_UNUSED(success, success);
-#if USE(SKIA)
+ // FIXME: Replace this block of skia code with m_canvas->flush, when that
+ // API becomes available.
+ // https://bugs.webkit.org/show_bug.cgi?id=77463
+ if (m_canvas)
+ m_canvas->getDevice()->accessRenderTarget(); // Triggers execution of pending draw operations.
+
GrContext* grContext = m_context->grContext();
if (grContext)
grContext->flush();
-#endif
m_context->flush();
}
#include "CanvasLayerChromium.h"
#include "ManagedTexture.h"
+class SkCanvas;
+
namespace WebCore {
class GraphicsContext3D;
virtual void unreserveContentsTexture();
virtual void cleanupResources();
+ void setCanvas(SkCanvas*);
+
private:
Canvas2DLayerChromium(GraphicsContext3D*, const IntSize&);
// synchronize its draws with the canvas updates.
bool m_useDoubleBuffering;
OwnPtr<ManagedTexture> m_frontTexture;
+ SkCanvas* m_canvas;
};
}
return image;
}
-ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode, DeferralMode, bool& success)
: m_data(size)
, m_size(size)
{
#include "PlatformContextSkia.h"
#include "SharedGraphicsContext3D.h"
#include "SkColorPriv.h"
+#include "SkDeferredCanvas.h"
#include "SkGpuDevice.h"
#include "SkiaUtils.h"
#include "WEBPImageEncoder.h"
{
}
-static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* data)
+class AcceleratedDeviceContext : public SkDeferredCanvas::DeviceContext {
+public:
+ AcceleratedDeviceContext(GraphicsContext3D* context3D)
+ {
+ ASSERT(context3D);
+ m_context3D = context3D;
+ }
+
+ virtual void prepareForDraw()
+ {
+ m_context3D->makeContextCurrent();
+ }
+
+ virtual void flush()
+ {
+ m_context3D->flush();
+ }
+
+private:
+ GraphicsContext3D* m_context3D;
+};
+
+static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* data, DeferralMode deferralMode)
{
GraphicsContext3D* context3D = SharedGraphicsContext3D::get();
if (!context3D)
SkAutoTUnref<GrTexture> texture(gr->createUncachedTexture(desc, 0, 0));
if (!texture.get())
return 0;
- SkCanvas* canvas = new SkCanvas();
- canvas->setDevice(new SkGpuDevice(gr, texture.get()))->unref();
+ SkCanvas* canvas;
+ SkAutoTUnref<SkDevice> device(new SkGpuDevice(gr, texture.get()));
+ if (deferralMode == Deferred) {
+ SkAutoTUnref<AcceleratedDeviceContext> deviceContext(new AcceleratedDeviceContext(context3D));
+ canvas = new SkDeferredCanvas(device.get(), deviceContext.get());
+ } else
+ canvas = new SkCanvas(device.get());
data->m_platformContext.setGraphicsContext3D(context3D);
#if USE(ACCELERATED_COMPOSITING)
data->m_platformLayer = Canvas2DLayerChromium::create(context3D, size);
data->m_platformLayer->setTextureId(texture.get()->getTextureHandle());
+ data->m_platformLayer->setCanvas(canvas);
#endif
return canvas;
}
return canvas;
}
-ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode renderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace, RenderingMode renderingMode, DeferralMode deferralMode, bool& success)
: m_data(size)
, m_size(size)
{
OwnPtr<SkCanvas> canvas;
if (renderingMode == Accelerated)
- canvas = adoptPtr(createAcceleratedCanvas(size, &m_data));
+ canvas = adoptPtr(createAcceleratedCanvas(size, &m_data, deferralMode));
else if (renderingMode == UnacceleratedNonPlatformBuffer)
canvas = adoptPtr(createNonPlatformCanvas(size));
m_bitmap->setHasAlpha(true);
}
-ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace colorSpace, RenderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, ColorSpace colorSpace, RenderingMode, DeferralMode, bool& success)
: m_data(size)
, m_size(size)
{
{
}
-ImageBuffer::ImageBuffer(const IntSize&, ColorSpace imageColorSpace, RenderingMode, bool& success) :
+ImageBuffer::ImageBuffer(const IntSize&, ColorSpace imageColorSpace, RenderingMode, DeferralMode, bool& success) :
m_data(IntSize())
{
notImplemented();
+2012-02-01 Justin Novosad <junov@chromium.org>
+
+ [Chromium] Enable deferred canvas rendering in the skia port
+ https://bugs.webkit.org/show_bug.cgi?id=76732
+
+ Reviewed by Stephen White.
+
+ Adding a new setting for enabling deferred 2d canvas rendering
+
+ * public/WebSettings.h:
+ * src/WebSettingsImpl.cpp:
+ (WebKit::WebSettingsImpl::setDeferred2dCanvasEnabled):
+ (WebKit):
+ * src/WebSettingsImpl.h:
+ (WebSettingsImpl):
+
2012-02-01 Sheriff Bot <webkit.review.bot@gmail.com>
Unreviewed, rolling out r106382.
virtual void setAcceleratedCompositingForPluginsEnabled(bool) = 0;
virtual void setAcceleratedCompositingForAnimationEnabled(bool) = 0;
virtual void setAccelerated2dCanvasEnabled(bool) = 0;
+ virtual void setDeferred2dCanvasEnabled(bool) = 0;
virtual void setAcceleratedCompositingForFixedPositionEnabled(bool) = 0;
virtual void setMinimumAccelerated2dCanvasSize(int) = 0;
virtual void setAcceleratedFiltersEnabled(bool) = 0;
m_settings->setAccelerated2dCanvasEnabled(enabled);
}
+void WebSettingsImpl::setDeferred2dCanvasEnabled(bool enabled)
+{
+ m_settings->setDeferred2dCanvasEnabled(enabled);
+}
+
void WebSettingsImpl::setAcceleratedCompositingForFixedPositionEnabled(bool enabled)
{
m_settings->setAcceleratedCompositingForFixedPositionEnabled(enabled);
virtual void setAcceleratedCompositingForCanvasEnabled(bool);
virtual void setAcceleratedCompositingForAnimationEnabled(bool);
virtual void setAccelerated2dCanvasEnabled(bool);
+ virtual void setDeferred2dCanvasEnabled(bool);
virtual void setAcceleratedCompositingForFixedPositionEnabled(bool);
virtual void setMinimumAccelerated2dCanvasSize(int);
virtual void setAcceleratedFiltersEnabled(bool);