summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2012-06-19 18:07:29 -0700
committerChris Craik <ccraik@google.com>2012-06-19 18:20:19 -0700
commitec90800d68fd500bb07f052c81fda0f54a794b1f (patch)
tree842f4f66af2b6f653db51713e5ef63670b72a5c1
parentcfad1b4c7cfa8eb502d1263c81f43e37e28ee928 (diff)
downloadexternal_webkit-ec90800d68fd500bb07f052c81fda0f54a794b1f.zip
external_webkit-ec90800d68fd500bb07f052c81fda0f54a794b1f.tar.gz
external_webkit-ec90800d68fd500bb07f052c81fda0f54a794b1f.tar.bz2
Pin renderers to threads instead of tiles
Move thread local bitmaps to renderers, so the renderers own them, and can perform optimizations. Change-Id: I60d604759f4ce2ec9981990d1613eaf23cd1e625
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.cpp4
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.h2
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/QueuedOperation.h4
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/RasterRenderer.cpp36
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/RasterRenderer.h7
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.cpp17
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.h7
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.cpp11
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.h8
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp11
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TilesManager.h1
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp1
12 files changed, 56 insertions, 53 deletions
diff --git a/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.cpp b/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.cpp
index 3fcbdb2..c1b91a3 100644
--- a/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.cpp
@@ -79,12 +79,12 @@ bool PaintTileOperation::operator==(const QueuedOperation* operation)
return op->m_tile == m_tile;
}
-void PaintTileOperation::run()
+void PaintTileOperation::run(BaseRenderer* renderer)
{
TRACE_METHOD();
if (m_tile) {
- m_tile->paintBitmap(m_painter);
+ m_tile->paintBitmap(m_painter, renderer);
m_tile->setRepaintPending(false);
m_tile = 0;
}
diff --git a/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.h b/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.h
index c82cdcd..ecd3ce9 100644
--- a/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.h
+++ b/Source/WebCore/platform/graphics/android/rendering/PaintTileOperation.h
@@ -42,7 +42,7 @@ public:
GLWebViewState* state, bool isLowResPrefetch);
virtual ~PaintTileOperation();
virtual bool operator==(const QueuedOperation* operation);
- virtual void run();
+ virtual void run(BaseRenderer* renderer);
virtual void* uniquePtr() { return m_tile; }
// returns a rendering priority for m_tile, lower values are processed faster
virtual int priority();
diff --git a/Source/WebCore/platform/graphics/android/rendering/QueuedOperation.h b/Source/WebCore/platform/graphics/android/rendering/QueuedOperation.h
index 7625528..fe6f8a3 100644
--- a/Source/WebCore/platform/graphics/android/rendering/QueuedOperation.h
+++ b/Source/WebCore/platform/graphics/android/rendering/QueuedOperation.h
@@ -28,10 +28,12 @@
namespace WebCore {
+class BaseRenderer;
+
class QueuedOperation {
public:
virtual ~QueuedOperation() {}
- virtual void run() = 0;
+ virtual void run(BaseRenderer* renderer) = 0;
virtual bool operator==(const QueuedOperation* operation) = 0;
virtual void* uniquePtr() = 0;
virtual int priority() = 0;
diff --git a/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.cpp b/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.cpp
index 8ad1fc8..a67a890 100644
--- a/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.cpp
@@ -42,8 +42,14 @@
namespace WebCore {
-RasterRenderer::RasterRenderer() : BaseRenderer(BaseRenderer::Raster)
+RasterRenderer::RasterRenderer()
+ : BaseRenderer(BaseRenderer::Raster)
+ , m_bitmapIsPureColor(false)
{
+ m_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
+ TilesManager::instance()->tileWidth(),
+ TilesManager::instance()->tileHeight());
+ m_bitmap.allocPixels();
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("RasterRenderer");
#endif
@@ -60,10 +66,12 @@ void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* can
{
TRACE_METHOD();
- SkBitmap* bitmap = TilesManager::instance()->threadLocalBitmap();
if (renderInfo.baseTile->isLayerTile()) {
- bitmap->setIsOpaque(false);
- bitmap->eraseARGB(0, 0, 0, 0);
+ m_bitmap.setIsOpaque(false);
+
+ // clear bitmap if necessary
+ if (!m_bitmapIsPureColor || m_bitmapPureColor != Color::transparent)
+ m_bitmap.eraseARGB(0, 0, 0, 0);
} else {
Color defaultBackground = Color::white;
Color* background = renderInfo.tilePainter->background();
@@ -72,12 +80,15 @@ void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* can
background = &defaultBackground;
}
ALOGV("setupCanvas use background on Base Layer %x", background->rgb());
- bitmap->setIsOpaque(!background->hasAlpha());
- bitmap->eraseARGB(background->alpha(), background->red(),
- background->green(), background->blue());
+ m_bitmap.setIsOpaque(!background->hasAlpha());
+
+ // fill background color if necessary
+ if (!m_bitmapIsPureColor || m_bitmapPureColor != *background)
+ m_bitmap.eraseARGB(background->alpha(), background->red(),
+ background->green(), background->blue());
}
- SkDevice* device = new SkDevice(*bitmap);
+ SkDevice* device = new SkDevice(m_bitmap);
canvas->setDevice(device);
@@ -86,14 +97,15 @@ void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* can
void RasterRenderer::renderingComplete(const TileRenderInfo& renderInfo, SkCanvas* canvas)
{
- const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(false);
- GLUtils::paintTextureWithBitmap(&renderInfo, bitmap);
+ GLUtils::paintTextureWithBitmap(&renderInfo, m_bitmap);
}
void RasterRenderer::checkForPureColor(TileRenderInfo& renderInfo, SkCanvas* canvas)
{
- const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(false);
- renderInfo.isPureColor = GLUtils::isPureColorBitmap(bitmap, renderInfo.pureColor);
+ m_bitmapIsPureColor = GLUtils::isPureColorBitmap(m_bitmap, m_bitmapPureColor);
+
+ renderInfo.isPureColor = m_bitmapIsPureColor;
+ renderInfo.pureColor = m_bitmapPureColor;
}
} // namespace WebCore
diff --git a/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.h b/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.h
index 55759e4..34b57ca 100644
--- a/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.h
+++ b/Source/WebCore/platform/graphics/android/rendering/RasterRenderer.h
@@ -29,6 +29,7 @@
#if USE(ACCELERATED_COMPOSITING)
#include "BaseRenderer.h"
+#include "SkBitmap.h"
#include "SkRect.h"
class SkCanvas;
@@ -45,10 +46,14 @@ public:
~RasterRenderer();
protected:
-
virtual void setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* canvas);
virtual void renderingComplete(const TileRenderInfo& renderInfo, SkCanvas* canvas);
virtual void checkForPureColor(TileRenderInfo& renderInfo, SkCanvas* canvas);
+
+private:
+ SkBitmap m_bitmap;
+ bool m_bitmapIsPureColor;
+ Color m_bitmapPureColor;
};
} // namespace WebCore
diff --git a/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.cpp b/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.cpp
index 4b71b1c..74e663a 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.cpp
@@ -32,6 +32,7 @@
#if USE(ACCELERATED_COMPOSITING)
#include "AndroidLog.h"
+#include "BaseRenderer.h"
#include "GLUtils.h"
#include "PaintTileOperation.h"
#include "TilesManager.h"
@@ -43,9 +44,15 @@ TexturesGenerator::TexturesGenerator(TilesManager* instance)
: Thread(false)
, m_tilesManager(instance)
, m_deferredMode(false)
+ , m_renderer(0)
{
}
+TexturesGenerator::~TexturesGenerator()
+{
+ delete m_renderer;
+}
+
bool TexturesGenerator::tryUpdateOperationWithPainter(Tile* tile, TilePainter* painter)
{
android::Mutex::Autolock lock(mRequestedOperationsLock);
@@ -94,11 +101,7 @@ void TexturesGenerator::removeOperationsForFilter(OperationFilter* filter)
status_t TexturesGenerator::readyToRun()
{
- m_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
- TilesManager::instance()->tileWidth(),
- TilesManager::instance()->tileHeight());
- m_bitmap.allocPixels();
- m_localTid = androidGetTid();
+ m_renderer = BaseRenderer::createRenderer();
return NO_ERROR;
}
@@ -175,7 +178,9 @@ bool TexturesGenerator::threadLoop()
if (currentOperation) {
ALOGV("threadLoop, painting the request with priority %d",
currentOperation->priority());
- currentOperation->run();
+ // swap out the renderer if necessary
+ BaseRenderer::swapRendererIfNeeded(m_renderer);
+ currentOperation->run(m_renderer);
}
mRequestedOperationsLock.lock();
diff --git a/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.h b/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.h
index d75fbca..2998330 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.h
+++ b/Source/WebCore/platform/graphics/android/rendering/TexturesGenerator.h
@@ -44,7 +44,7 @@ class TilesManager;
class TexturesGenerator : public Thread {
public:
TexturesGenerator(TilesManager* instance);
- virtual ~TexturesGenerator() {}
+ virtual ~TexturesGenerator();
virtual status_t readyToRun();
@@ -58,8 +58,6 @@ public:
// signifying that they should be deferred
static const int gDeferPriorityCutoff = 500000000;
- SkBitmap* bitmap() { return &m_bitmap; }
- int getLocalTid() { return m_localTid; }
private:
QueuedOperation* popNext();
virtual bool threadLoop();
@@ -69,9 +67,8 @@ private:
android::Condition mRequestedOperationsCond;
TilesManager* m_tilesManager;
- SkBitmap m_bitmap;
+ BaseRenderer* m_renderer;
bool m_deferredMode;
- int m_localTid;
// defer painting for one second if best in queue has priority
// QueuedOperation::gDeferPriorityCutoff or higher
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
index 96b189a..76be981 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
@@ -33,7 +33,7 @@
#include "AndroidLog.h"
#include "GLUtils.h"
-#include "RasterRenderer.h"
+#include "BaseRenderer.h"
#include "TextureInfo.h"
#include "TileTexture.h"
#include "TilesManager.h"
@@ -64,7 +64,6 @@ Tile::Tile(bool isLayerTile)
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("Tile");
#endif
- m_renderer = BaseRenderer::createRenderer();
}
Tile::~Tile()
@@ -74,8 +73,6 @@ Tile::~Tile()
if (m_frontTexture)
m_frontTexture->release(this);
- delete m_renderer;
-
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("Tile");
#endif
@@ -297,7 +294,7 @@ bool Tile::isTileVisible(const IntRect& viewTileBounds)
}
// This is called from the texture generation thread
-void Tile::paintBitmap(TilePainter* painter)
+void Tile::paintBitmap(TilePainter* painter, BaseRenderer* renderer)
{
// We acquire the values below atomically. This ensures that we are reading
// values correctly across cores. Further, once we have these values they
@@ -328,8 +325,6 @@ void Tile::paintBitmap(TilePainter* painter)
return;
}
- // swap out the renderer if necessary
- BaseRenderer::swapRendererIfNeeded(m_renderer);
// setup the common renderInfo fields;
TileRenderInfo renderInfo;
renderInfo.x = x;
@@ -343,7 +338,7 @@ void Tile::paintBitmap(TilePainter* painter)
const float tileWidth = renderInfo.tileSize.width();
const float tileHeight = renderInfo.tileSize.height();
- m_renderer->renderTiledContent(renderInfo);
+ renderer->renderTiledContent(renderInfo);
m_atomicSync.lock();
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.h b/Source/WebCore/platform/graphics/android/rendering/Tile.h
index b045f1f..f467bb0 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.h
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.h
@@ -28,7 +28,6 @@
#if USE(ACCELERATED_COMPOSITING)
-#include "BaseRenderer.h"
#include "FloatPoint.h"
#include "SkRect.h"
#include "SkRegion.h"
@@ -39,9 +38,10 @@
namespace WebCore {
+class BaseRenderer;
+class GLWebViewState;
class TextureInfo;
class TileTexture;
-class GLWebViewState;
/**
* An individual tile that is used to construct part of a webpage's BaseLayer of
@@ -107,7 +107,7 @@ public:
const FloatRect& fillPortion);
// the only thread-safe function called by the background thread
- void paintBitmap(TilePainter* painter);
+ void paintBitmap(TilePainter* painter, BaseRenderer* renderer);
bool intersectWithRect(int x, int y, int tileWidth, int tileHeight,
float scale, const SkRect& dirtyRect,
@@ -171,8 +171,6 @@ private:
// across all threads and cores.
android::Mutex m_atomicSync;
- BaseRenderer* m_renderer;
-
bool m_isLayerTile;
// the most recent GL draw before this tile was prepared. used for
diff --git a/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp b/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
index 8b9cfb6..e584b81 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
@@ -526,17 +526,6 @@ void TilesManager::scheduleOperation(QueuedOperation* operation)
m_textureGenerators[m_scheduleThread]->scheduleOperation(operation);
}
-SkBitmap* TilesManager::threadLocalBitmap()
-{
- pid_t localTid = androidGetTid();
- for (int i = 0; i < NUM_TEXTURES_GENERATORS; i++) {
- if (localTid == m_textureGenerators[i]->getLocalTid())
- return m_textureGenerators[i]->bitmap();
- }
- return 0;
-}
-
-
int TilesManager::tileWidth()
{
return TILE_WIDTH;
diff --git a/Source/WebCore/platform/graphics/android/rendering/TilesManager.h b/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
index f022ebf..0781ef6 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
+++ b/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
@@ -155,7 +155,6 @@ public:
void removeOperationsForFilter(OperationFilter* filter);
bool tryUpdateOperationWithPainter(Tile* tile, TilePainter* painter);
void scheduleOperation(QueuedOperation* operation);
- SkBitmap* threadLocalBitmap();
private:
TilesManager();
diff --git a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp
index fa84f0d..e329191 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp
@@ -32,6 +32,7 @@
#if USE(ACCELERATED_COMPOSITING)
#include "AndroidLog.h"
+#include "BaseRenderer.h"
#include "DrawQuadData.h"
#include "GLUtils.h"
#include "Tile.h"