summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp')
-rw-r--r--Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp58
1 files changed, 50 insertions, 8 deletions
diff --git a/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp b/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
index ed332b187..b816c33bc 100644
--- a/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
+++ b/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
@@ -28,11 +28,14 @@
#include "Canvas2DLayerBridge.h"
#include "CCRendererGL.h" // For the GLC() macro.
+#include "Canvas2DLayerManager.h"
#include "GrContext.h"
#include "GraphicsContext3D.h"
#include "GraphicsContext3DPrivate.h"
+#include "GraphicsLayerChromium.h"
#include "TraceEvent.h"
-#include <public/WebCompositor.h>
+#include <public/Platform.h>
+#include <public/WebCompositorSupport.h>
#include <public/WebGraphicsContext3D.h>
using WebKit::WebExternalTextureLayer;
@@ -43,17 +46,22 @@ namespace WebCore {
Canvas2DLayerBridge::Canvas2DLayerBridge(PassRefPtr<GraphicsContext3D> context, const IntSize& size, DeferralMode deferralMode, unsigned textureId)
: m_deferralMode(deferralMode)
- // FIXME: We currently turn off double buffering when canvas rendering is
- // deferred. What we should be doing is to use a smarter heuristic based
- // on GPU resource monitoring and other factors to chose between single
- // and double buffering.
- , m_useDoubleBuffering(WebKit::WebCompositor::threadingEnabled() && deferralMode == NonDeferred)
, m_frontBufferTexture(0)
, m_backBufferTexture(textureId)
, m_size(size)
, m_canvas(0)
, m_context(context)
+ , m_bytesAllocated(0)
+ , m_next(0)
+ , m_prev(0)
{
+ bool compositorThreadingEnabled = WebKit::Platform::current()->compositorSupport()->isThreadingEnabled();
+ // FIXME: We currently turn off double buffering when canvas rendering is
+ // deferred. What we should be doing is to use a smarter heuristic based
+ // on GPU resource monitoring and other factors to chose between single
+ // and double buffering.
+ m_useDoubleBuffering = compositorThreadingEnabled && deferralMode == NonDeferred;
+
if (m_useDoubleBuffering) {
m_context->makeContextCurrent();
GLC(m_context.get(), m_frontBufferTexture = m_context->createTexture());
@@ -69,13 +77,16 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(PassRefPtr<GraphicsContext3D> context,
grContext->resetContext();
}
- m_layer = adoptPtr(WebExternalTextureLayer::create(this));
+ m_layer = adoptPtr(WebKit::Platform::current()->compositorSupport()->createExternalTextureLayer(this));
m_layer->setTextureId(textureId);
- m_layer->setRateLimitContext(!WebKit::WebCompositor::threadingEnabled() || m_useDoubleBuffering);
+ m_layer->setRateLimitContext(!compositorThreadingEnabled || m_useDoubleBuffering);
+ GraphicsLayerChromium::registerContentsLayer(m_layer->layer());
}
Canvas2DLayerBridge::~Canvas2DLayerBridge()
{
+ GraphicsLayerChromium::unregisterContentsLayer(m_layer->layer());
+ Canvas2DLayerManager::get().layerToBeDestroyed(this);
if (SkDeferredCanvas* deferred = deferredCanvas())
deferred->setNotificationClient(0);
m_layer->setTextureId(0);
@@ -101,6 +112,35 @@ void Canvas2DLayerBridge::prepareForDraw()
m_context->makeContextCurrent();
}
+void Canvas2DLayerBridge::storageAllocatedForRecordingChanged(size_t bytesAllocated)
+{
+ ASSERT(m_deferralMode == Deferred);
+ intptr_t delta = (intptr_t)bytesAllocated - (intptr_t)m_bytesAllocated;
+ m_bytesAllocated = bytesAllocated;
+ Canvas2DLayerManager::get().layerAllocatedStorageChanged(this, delta);
+}
+
+void Canvas2DLayerBridge::flushedDrawCommands()
+{
+ storageAllocatedForRecordingChanged(deferredCanvas()->storageAllocatedForRecording());
+}
+
+size_t Canvas2DLayerBridge::freeMemoryIfPossible(size_t bytesToFree)
+{
+ ASSERT(deferredCanvas());
+ size_t bytesFreed = deferredCanvas()->freeMemoryIfPossible(bytesToFree);
+ if (bytesFreed)
+ Canvas2DLayerManager::get().layerAllocatedStorageChanged(this, -((intptr_t)bytesFreed));
+ m_bytesAllocated -= bytesFreed;
+ return bytesFreed;
+}
+
+void Canvas2DLayerBridge::flush()
+{
+ ASSERT(deferredCanvas());
+ m_canvas->flush();
+}
+
SkCanvas* Canvas2DLayerBridge::skCanvas(SkDevice* device)
{
ASSERT(!m_canvas);
@@ -154,6 +194,8 @@ void Canvas2DLayerBridge::contextAcquired()
{
if (m_deferralMode == NonDeferred && !m_useDoubleBuffering)
m_layer->willModifyTexture();
+ else if (m_deferralMode == Deferred)
+ Canvas2DLayerManager::get().layerDidDraw(this);
}
unsigned Canvas2DLayerBridge::backBufferTexture()