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

Unified Diff: Source/core/html/HTMLCanvasElement.cpp

Issue 659873002: Making display list canvases fall back to gpu-accelerated when appropriate (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: response to comments Created 6 years, 2 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
« no previous file with comments | « Source/core/html/HTMLCanvasElement.h ('k') | Source/platform/graphics/RecordingImageBufferSurface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/HTMLCanvasElement.cpp
diff --git a/Source/core/html/HTMLCanvasElement.cpp b/Source/core/html/HTMLCanvasElement.cpp
index f251bd5cf0b7c20519e04e5ed8d89827412f57ce..1ad92cd8df0b7757df45f909bcad59c4c0d59d98 100644
--- a/Source/core/html/HTMLCanvasElement.cpp
+++ b/Source/core/html/HTMLCanvasElement.cpp
@@ -473,6 +473,47 @@ bool HTMLCanvasElement::shouldAccelerate(const IntSize& size) const
return true;
}
+class UnacceleratedSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory {
+public:
+ virtual PassOwnPtr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode)
+ {
+ return adoptPtr(new UnacceleratedImageBufferSurface(size, opacityMode));
+ }
+
+ virtual ~UnacceleratedSurfaceFactory() { }
+};
+
+class Accelerated2dSurfaceFactory : public RecordingImageBufferFallbackSurfaceFactory {
+public:
+ Accelerated2dSurfaceFactory(int msaaSampleCount) : m_msaaSampleCount(msaaSampleCount) { }
+
+ virtual PassOwnPtr<ImageBufferSurface> createSurface(const IntSize& size, OpacityMode opacityMode)
+ {
+ OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSurface(size, opacityMode, m_msaaSampleCount));
+ if (surface->isValid())
+ return surface.release();
+ return adoptPtr(new UnacceleratedImageBufferSurface(size, opacityMode));
+ }
+
+ virtual ~Accelerated2dSurfaceFactory() { }
+private:
+ int m_msaaSampleCount;
+};
+
+PassOwnPtr<RecordingImageBufferFallbackSurfaceFactory> HTMLCanvasElement::createSurfaceFactory(const IntSize& deviceSize, int* msaaSampleCount) const
+{
+ *msaaSampleCount = 0;
+ OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory;
+ if (shouldAccelerate(deviceSize)) {
+ if (document().settings())
+ *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASampleCount();
+ surfaceFactory = adoptPtr(new Accelerated2dSurfaceFactory(*msaaSampleCount));
+ } else {
+ surfaceFactory = adoptPtr(new UnacceleratedSurfaceFactory());
+ }
+ return surfaceFactory.release();
+}
+
PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const IntSize& deviceSize, int* msaaSampleCount)
{
OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque : Opaque;
@@ -486,25 +527,20 @@ PassOwnPtr<ImageBufferSurface> HTMLCanvasElement::createImageBufferSurface(const
// FIXME: Actually, avoid setting m_accelerationDisabled at all when
// doing GPU-based rasterization.
if (m_accelerationDisabled)
- return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode));
- return adoptPtr(new WebGLImageBufferSurface(size(), opacityMode));
+ return adoptPtr(new UnacceleratedImageBufferSurface(deviceSize, opacityMode));
+ return adoptPtr(new WebGLImageBufferSurface(deviceSize, opacityMode));
}
- if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) {
- OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSurface(size(), opacityMode));
- if (surface->isValid())
- return surface.release();
- }
+ OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount);
- if (shouldAccelerate(deviceSize)) {
- if (document().settings())
- *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASampleCount();
- OwnPtr<ImageBufferSurface> surface = adoptPtr(new Canvas2DImageBufferSurface(size(), opacityMode, *msaaSampleCount));
+ if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) {
+ OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSurface(deviceSize, surfaceFactory.release(), opacityMode));
if (surface->isValid())
return surface.release();
+ surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); // recreate because old previous one was released
}
- return adoptPtr(new UnacceleratedImageBufferSurface(size(), opacityMode));
+ return surfaceFactory->createSurface(deviceSize, opacityMode);
}
void HTMLCanvasElement::createImageBuffer()
« no previous file with comments | « Source/core/html/HTMLCanvasElement.h ('k') | Source/platform/graphics/RecordingImageBufferSurface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698