summaryrefslogtreecommitdiffstats
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.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp b/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
index 1250e4e87..b89d995f1 100644
--- a/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
+++ b/Source/WebCore/platform/graphics/chromium/Canvas2DLayerBridge.cpp
@@ -51,6 +51,8 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(PassRefPtr<GraphicsContext3D> context,
, m_canvas(0)
, m_context(context)
, m_bytesAllocated(0)
+ , m_didRecordDrawCommand(false)
+ , m_framesPending(0)
, m_next(0)
, m_prev(0)
{
@@ -106,6 +108,16 @@ SkDeferredCanvas* Canvas2DLayerBridge::deferredCanvas()
return 0;
}
+void Canvas2DLayerBridge::limitPendingFrames()
+{
+ if (m_didRecordDrawCommand) {
+ m_framesPending++;
+ m_didRecordDrawCommand = false;
+ if (m_framesPending > 1)
+ flush();
+ }
+}
+
void Canvas2DLayerBridge::prepareForDraw()
{
ASSERT(deferredCanvas());
@@ -122,9 +134,20 @@ void Canvas2DLayerBridge::storageAllocatedForRecordingChanged(size_t bytesAlloca
Canvas2DLayerManager::get().layerAllocatedStorageChanged(this, delta);
}
+size_t Canvas2DLayerBridge::storageAllocatedForRecording()
+{
+ return deferredCanvas()->storageAllocatedForRecording();
+}
+
void Canvas2DLayerBridge::flushedDrawCommands()
{
- storageAllocatedForRecordingChanged(deferredCanvas()->storageAllocatedForRecording());
+ storageAllocatedForRecordingChanged(storageAllocatedForRecording());
+ m_framesPending = 0;
+}
+
+void Canvas2DLayerBridge::skippedPendingDrawCommands()
+{
+ flushedDrawCommands();
}
size_t Canvas2DLayerBridge::freeMemoryIfPossible(size_t bytesToFree)
@@ -140,7 +163,8 @@ size_t Canvas2DLayerBridge::freeMemoryIfPossible(size_t bytesToFree)
void Canvas2DLayerBridge::flush()
{
ASSERT(deferredCanvas());
- m_canvas->flush();
+ if (deferredCanvas()->hasPendingCommands())
+ m_canvas->flush();
}
SkCanvas* Canvas2DLayerBridge::skCanvas(SkDevice* device)
@@ -196,8 +220,10 @@ void Canvas2DLayerBridge::contextAcquired()
{
if (m_deferralMode == NonDeferred && !m_useDoubleBuffering)
m_layer->willModifyTexture();
- else if (m_deferralMode == Deferred)
+ else if (m_deferralMode == Deferred) {
Canvas2DLayerManager::get().layerDidDraw(this);
+ m_didRecordDrawCommand = true;
+ }
}
unsigned Canvas2DLayerBridge::backBufferTexture()