summaryrefslogtreecommitdiffstats
path: root/Source/WebCore
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore')
-rw-r--r--Source/WebCore/dom/Document.cpp9
-rw-r--r--Source/WebCore/dom/Document.h9
-rw-r--r--Source/WebCore/html/HTMLBodyElement.cpp8
-rw-r--r--Source/WebCore/html/HTMLMetaElement.cpp20
-rw-r--r--Source/WebCore/platform/android/ScrollViewAndroid.cpp12
-rw-r--r--Source/WebCore/platform/graphics/android/AndroidAnimation.cpp2
-rw-r--r--Source/WebCore/platform/graphics/android/BaseTile.cpp70
-rw-r--r--Source/WebCore/platform/graphics/android/BaseTile.h15
-rw-r--r--Source/WebCore/platform/graphics/android/BaseTileTexture.cpp8
-rw-r--r--Source/WebCore/platform/graphics/android/BaseTileTexture.h2
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp2
-rw-r--r--Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp8
-rw-r--r--Source/WebCore/platform/graphics/android/LayerAndroid.h1
-rw-r--r--Source/WebCore/platform/graphics/android/TextureOwner.h2
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.cpp1
-rw-r--r--Source/WebCore/platform/graphics/android/TilesManager.cpp62
-rw-r--r--Source/WebCore/platform/graphics/android/TilesManager.h12
-rw-r--r--Source/WebCore/platform/graphics/android/VideoLayerAndroid.h2
18 files changed, 136 insertions, 109 deletions
diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp
index 60d3af1..7ba603b 100644
--- a/Source/WebCore/dom/Document.cpp
+++ b/Source/WebCore/dom/Document.cpp
@@ -695,10 +695,7 @@ void Document::setDocType(PassRefPtr<DocumentType> docType)
if (m_docType && !ownerElement()
&& m_docType->publicId().startsWith("-//wapforum//dtd xhtml mobile 1.", false)) {
// fit mobile sites directly in the screen
- if (Frame *f = frame())
- f->settings()->setMetadataSettings("width", "device-width");
- if (FrameView* frameView = view())
- PlatformBridge::updateViewport(frameView);
+ processViewport("width=device-width");
}
#endif
}
@@ -2729,9 +2726,9 @@ void Document::processArguments(const String& features, void* data, ArgumentsCal
#ifdef ANDROID_META_SUPPORT
if (frame())
frame()->settings()->setMetadataSettings(keyString, valueString);
-#else
- callback(keyString, valueString, this, data);
#endif
+ if (callback && data)
+ callback(keyString, valueString, this, data);
}
}
diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h
index 5ab6d77..179293c 100644
--- a/Source/WebCore/dom/Document.h
+++ b/Source/WebCore/dom/Document.h
@@ -794,11 +794,10 @@ public:
void processViewport(const String& features);
#ifdef ANDROID_META_SUPPORT
- /**
- * Handles viewport like <meta name = "viewport" content = "width = device-width">
- * or format-detection like <meta name = "format-detection" content = "telephone=no">
- */
- void processMetadataSettings(const String& content);
+ /**
+ * Handles format-detection like <meta name = "format-detection" content = "telephone=no">
+ */
+ void processMetadataSettings(const String& content);
#endif
// Returns the owning element in the parent document.
diff --git a/Source/WebCore/html/HTMLBodyElement.cpp b/Source/WebCore/html/HTMLBodyElement.cpp
index 9cf8730..0c93c95 100644
--- a/Source/WebCore/html/HTMLBodyElement.cpp
+++ b/Source/WebCore/html/HTMLBodyElement.cpp
@@ -206,13 +206,7 @@ void HTMLBodyElement::insertedIntoDocument()
if (settings->viewportWidth() == -1 && (host.startsWith("m.") || host.startsWith("mobile.")
|| host.startsWith("wap.") || host.contains(".m.") || host.contains(".mobile." || host.contains(".wap.")))) {
// fit mobile sites directly in the screen
- settings->setMetadataSettings("width", "device-width");
- // update the meta data if it is the top document
- if (!ownerElement) {
- FrameView* view = document()->view();
- if (view)
- PlatformBridge::updateViewport(view);
- }
+ document()->processViewport("width=device-width");
}
}
#endif
diff --git a/Source/WebCore/html/HTMLMetaElement.cpp b/Source/WebCore/html/HTMLMetaElement.cpp
index d8d9fb3..cb7f4c0 100644
--- a/Source/WebCore/html/HTMLMetaElement.cpp
+++ b/Source/WebCore/html/HTMLMetaElement.cpp
@@ -75,30 +75,18 @@ void HTMLMetaElement::process()
{
if (!inDocument() || m_content.isNull())
return;
+ if (equalIgnoringCase(name(), "viewport"))
+ document()->processViewport(m_content);
#ifdef ANDROID_META_SUPPORT
// TODO: Evaluate whether to take upstreamed meta support
- bool updateViewport = false;
- if (equalIgnoringCase(name(), "viewport")) {
- document()->processMetadataSettings(m_content);
- updateViewport = true;
- } else if (equalIgnoringCase(name(), "format-detection"))
+ else if (equalIgnoringCase(name(), "format-detection"))
document()->processMetadataSettings(m_content);
else if (((equalIgnoringCase(name(), "HandheldFriendly") && equalIgnoringCase(m_content, "true")) || equalIgnoringCase(name(), "MobileOptimized"))
&& document()->settings()
&& document()->settings()->viewportWidth() == -1) {
// fit mobile sites directly in the screen
- document()->settings()->setMetadataSettings("width", "device-width");
- updateViewport = true;
+ document()->processViewport("width=device-width");
}
- // update the meta data if it is the top document
- if (updateViewport && !document()->ownerElement()) {
- FrameView* view = document()->view();
- if (view)
- PlatformBridge::updateViewport(view);
- }
-#else
- if (equalIgnoringCase(name(), "viewport"))
- document()->processViewport(m_content);
#endif
#if ENABLE(ANDROID_INSTALLABLE_WEB_APPS)
diff --git a/Source/WebCore/platform/android/ScrollViewAndroid.cpp b/Source/WebCore/platform/android/ScrollViewAndroid.cpp
index f54e5ea..87c6a1f 100644
--- a/Source/WebCore/platform/android/ScrollViewAndroid.cpp
+++ b/Source/WebCore/platform/android/ScrollViewAndroid.cpp
@@ -68,32 +68,36 @@ IntSize ScrollView::platformContentsSize() const
return m_contentsSize;
}
+static float getWebViewCoreScale(const ScrollView* view) {
+ return android::WebViewCore::getWebViewCore(view)->scale();
+}
+
int ScrollView::platformActualWidth() const
{
if (parent())
return width();
- return platformWidget()->visibleWidth();
+ return platformWidget()->visibleWidth() * getWebViewCoreScale(this);
}
int ScrollView::platformActualHeight() const
{
if (parent())
return height();
- return platformWidget()->visibleHeight();
+ return platformWidget()->visibleHeight() * getWebViewCoreScale(this);
}
int ScrollView::platformActualScrollX() const
{
if (parent())
return scrollX();
- return platformWidget()->visibleX();
+ return platformWidget()->visibleX() * getWebViewCoreScale(this);
}
int ScrollView::platformActualScrollY() const
{
if (parent())
return scrollY();
- return platformWidget()->visibleY();
+ return platformWidget()->visibleY() * getWebViewCoreScale(this);
}
void ScrollView::platformSetScrollPosition(const WebCore::IntPoint& pt)
diff --git a/Source/WebCore/platform/graphics/android/AndroidAnimation.cpp b/Source/WebCore/platform/graphics/android/AndroidAnimation.cpp
index e7d4780..2939cf0 100644
--- a/Source/WebCore/platform/graphics/android/AndroidAnimation.cpp
+++ b/Source/WebCore/platform/graphics/android/AndroidAnimation.cpp
@@ -83,10 +83,10 @@ AndroidAnimation::AndroidAnimation(AndroidAnimation* anim)
, m_iterationCount(anim->m_iterationCount)
, m_direction(anim->m_direction)
, m_timingFunction(anim->m_timingFunction)
+ , m_name(anim->name())
, m_type(anim->m_type)
, m_operations(anim->m_operations)
, m_originalLayer(0)
- , m_name(anim->name())
{
gDebugAndroidAnimationInstances++;
}
diff --git a/Source/WebCore/platform/graphics/android/BaseTile.cpp b/Source/WebCore/platform/graphics/android/BaseTile.cpp
index 2fa2427..ed2ad3e 100644
--- a/Source/WebCore/platform/graphics/android/BaseTile.cpp
+++ b/Source/WebCore/platform/graphics/android/BaseTile.cpp
@@ -28,8 +28,8 @@
#if USE(ACCELERATED_COMPOSITING)
-#include "RasterRenderer.h"
#include "GLUtils.h"
+#include "RasterRenderer.h"
#include "TextureInfo.h"
#include "TilesManager.h"
@@ -54,7 +54,8 @@
namespace WebCore {
BaseTile::BaseTile()
- : m_page(0)
+ : m_glWebViewState(0)
+ , m_page(0)
, m_x(-1)
, m_y(-1)
, m_texture(0)
@@ -63,15 +64,25 @@ BaseTile::BaseTile()
, m_repaintPending(false)
, m_usable(true)
, m_lastDirtyPicture(0)
- , m_fullRepaintA(true)
- , m_fullRepaintB(true)
, m_lastPaintedPicture(0)
{
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("BaseTile");
#endif
- m_currentDirtyArea = &m_dirtyAreaA;
+ m_currentDirtyAreaIndex = 0;
m_renderer = new RasterRenderer();
+
+ // For EglImage Mode, the internal buffer should be 2.
+ // And for Async Surface Texture mode, this is 3.
+ if (TilesManager::instance()->getSharedTextureMode() == EglImageMode)
+ m_maxBufferNumber = 2;
+ else
+ m_maxBufferNumber = 3;
+
+ m_dirtyArea = new SkRegion[m_maxBufferNumber];
+ m_fullRepaint = new bool[m_maxBufferNumber];
+ for (int i = 0; i < m_maxBufferNumber; i++)
+ m_fullRepaint[i] = true;
}
BaseTile::~BaseTile()
@@ -81,6 +92,8 @@ BaseTile::~BaseTile()
m_texture->release(this);
delete m_renderer;
+ delete[] m_dirtyArea;
+ delete[] m_fullRepaint;
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("BaseTile");
@@ -121,10 +134,10 @@ bool BaseTile::removeTexture(BaseTileTexture* texture)
void BaseTile::fullInval()
{
- m_dirtyAreaA.setEmpty();
- m_dirtyAreaB.setEmpty();
- m_fullRepaintA = true;
- m_fullRepaintB = true;
+ for (int i = 0; i < m_maxBufferNumber; i++) {
+ m_dirtyArea[i].setEmpty();
+ m_fullRepaint[i] = true;
+ }
m_dirty = true;
}
@@ -142,8 +155,8 @@ void BaseTile::markAsDirty(int unsigned pictureCount,
{
android::AutoMutex lock(m_atomicSync);
m_lastDirtyPicture = pictureCount;
- m_dirtyAreaA.op(dirtyArea, SkRegion::kUnion_Op);
- m_dirtyAreaB.op(dirtyArea, SkRegion::kUnion_Op);
+ for (int i = 0; i < m_maxBufferNumber; i++)
+ m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op);
m_dirty = true;
}
@@ -259,15 +272,14 @@ void BaseTile::paintBitmap()
m_atomicSync.lock();
bool dirty = m_dirty;
BaseTileTexture* texture = m_texture;
- SkRegion dirtyArea = *m_currentDirtyArea;
+ SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex];
float scale = m_scale;
const int x = m_x;
const int y = m_y;
m_atomicSync.unlock();
- if (!dirty || !texture) {
+ if (!dirty || !texture)
return;
- }
TiledPage* tiledPage = m_page;
@@ -298,12 +310,12 @@ void BaseTile::paintBitmap()
SkRegion::Iterator cliperator(dirtyArea);
bool fullRepaint = false;
+
// TODO: Implement the partial invalidate in Surface Texture Mode
- if (((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA)
- || ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB)
- || textureInfo->m_width != tileWidth
- || textureInfo->m_height != tileHeight
- || textureInfo->getSharedTextureMode() == SurfaceTextureMode) {
+ if (m_fullRepaint[m_currentDirtyAreaIndex]
+ || textureInfo->m_width != tileWidth
+ || textureInfo->m_height != tileHeight
+ || textureInfo->getSharedTextureMode() == SurfaceTextureMode) {
fullRepaint = true;
}
@@ -378,12 +390,7 @@ void BaseTile::paintBitmap()
m_lastPaintedPicture = pictureCount;
// set the fullrepaint flags
-
- if ((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA)
- m_fullRepaintA = false;
-
- if ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB)
- m_fullRepaintB = false;
+ m_fullRepaint[m_currentDirtyAreaIndex] = false;
// The various checks to see if we are still dirty...
@@ -393,18 +400,19 @@ void BaseTile::paintBitmap()
m_dirty = true;
if (fullRepaint)
- m_currentDirtyArea->setEmpty();
+ m_dirtyArea[m_currentDirtyAreaIndex].setEmpty();
else
- m_currentDirtyArea->op(dirtyArea, SkRegion::kDifference_Op);
+ m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op);
- if (!m_currentDirtyArea->isEmpty())
+ if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
m_dirty = true;
// Now we can swap the dirty areas
+ // TODO: For surface texture in Async mode, the index will be updated
+ // according to the current buffer just dequeued.
+ m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber;
- m_currentDirtyArea = m_currentDirtyArea == &m_dirtyAreaA ? &m_dirtyAreaB : &m_dirtyAreaA;
-
- if (!m_currentDirtyArea->isEmpty())
+ if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
m_dirty = true;
if (!m_dirty)
diff --git a/Source/WebCore/platform/graphics/android/BaseTile.h b/Source/WebCore/platform/graphics/android/BaseTile.h
index d336ae2..b5fc7ba 100644
--- a/Source/WebCore/platform/graphics/android/BaseTile.h
+++ b/Source/WebCore/platform/graphics/android/BaseTile.h
@@ -40,6 +40,7 @@ namespace WebCore {
class TextureInfo;
class TiledPage;
class BaseTileTexture;
+class GLWebViewState;
/**
* An individual tile that is used to construct part of a webpage's BaseLayer of
@@ -94,11 +95,16 @@ public:
unsigned int lastPaintedPicture() const { return m_lastPaintedPicture; }
BaseTileTexture* texture() { return m_texture; }
+ void setGLWebViewState(GLWebViewState* state) { m_glWebViewState = state; }
+
// TextureOwner implementation
virtual bool removeTexture(BaseTileTexture* texture);
virtual TiledPage* page() { return m_page; }
+ virtual GLWebViewState* state() { return m_glWebViewState; }
private:
+ GLWebViewState* m_glWebViewState;
+
// these variables are only set when the object is constructed
TiledPage* m_page;
int m_x;
@@ -119,11 +125,10 @@ private:
unsigned int m_lastDirtyPicture;
// store the dirty region
- SkRegion m_dirtyAreaA;
- SkRegion m_dirtyAreaB;
- bool m_fullRepaintA;
- bool m_fullRepaintB;
- SkRegion* m_currentDirtyArea;
+ SkRegion* m_dirtyArea;
+ bool* m_fullRepaint;
+ int m_maxBufferNumber;
+ int m_currentDirtyAreaIndex;
// stores the id of the latest picture painted to the tile. If the id is 0
// then we know that the picture has not yet been painted an there is nothing
diff --git a/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp b/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp
index ee8cebf..f66019a 100644
--- a/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp
+++ b/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp
@@ -39,7 +39,8 @@
namespace WebCore {
BaseTileTexture::BaseTileTexture(uint32_t w, uint32_t h)
- : DoubleBufferedTexture(eglGetCurrentContext(), SurfaceTextureMode)
+ : DoubleBufferedTexture(eglGetCurrentContext(),
+ TilesManager::instance()->getSharedTextureMode())
, m_usedLevel(-1)
, m_owner(0)
, m_delayedReleaseOwner(0)
@@ -147,13 +148,12 @@ bool BaseTileTexture::acquire(TextureOwner* owner, bool force)
return setOwner(owner, force);
}
-bool BaseTileTexture::tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage)
+bool BaseTileTexture::tryAcquire(TextureOwner* owner)
{
m_busyLock.lock();
if (!m_busy
&& m_owner
- && m_owner->page() != currentPage
- && m_owner->page() != nextPage) {
+ && m_owner->state() != owner->state()) {
m_busyLock.unlock();
return this->acquire(owner);
}
diff --git a/Source/WebCore/platform/graphics/android/BaseTileTexture.h b/Source/WebCore/platform/graphics/android/BaseTileTexture.h
index 0a7534a..5496e66 100644
--- a/Source/WebCore/platform/graphics/android/BaseTileTexture.h
+++ b/Source/WebCore/platform/graphics/android/BaseTileTexture.h
@@ -86,7 +86,7 @@ public:
// returns false if ownership cannot be transferred because the tile is busy
bool acquire(TextureOwner* owner, bool force = false);
bool release(TextureOwner* owner);
- bool tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage);
+ bool tryAcquire(TextureOwner* owner);
// set the texture owner if not busy. Return false if busy, true otherwise.
bool setOwner(TextureOwner* owner, bool force = false);
diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
index dda5dee..54176e0 100644
--- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -116,6 +116,7 @@ GLWebViewState::~GLWebViewState()
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("GLWebViewState");
#endif
+ TilesManager::instance()->unregisterGLWebViewState(this);
}
void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, const SkRegion& inval,
@@ -497,6 +498,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
IntRect& clip, float scale, SkColor color)
{
glFinish();
+ TilesManager::instance()->registerGLWebViewState(this);
m_baseLayerLock.lock();
BaseLayerAndroid* baseLayer = m_currentBaseLayer;
diff --git a/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp b/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp
index 429a125..e015f5a 100644
--- a/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp
@@ -624,10 +624,10 @@ static void setrectForUnderline(SkRect* r, GraphicsContext* context, const Float
if (lineThickness < 1) // Do we really need/want this?
lineThickness = 1;
#endif
- r->fLeft = SkIntToScalar(point.x());
- r->fTop = SkIntToScalar(point.y() + yOffset);
- r->fRight = r->fLeft + SkIntToScalar(width);
- r->fBottom = r->fTop + SkFloatToScalar(lineThickness);
+ r->fLeft = point.x();
+ r->fTop = point.y() + yOffset;
+ r->fRight = r->fLeft + width;
+ r->fBottom = r->fTop + lineThickness;
}
void GraphicsContext::drawLineForText(const FloatPoint& pt, float width, bool)
diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.h b/Source/WebCore/platform/graphics/android/LayerAndroid.h
index 9dfe973..bd6c0ef 100644
--- a/Source/WebCore/platform/graphics/android/LayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/LayerAndroid.h
@@ -102,6 +102,7 @@ public:
LayerTexture* texture() { return m_reservedTexture; }
virtual TiledPage* page() { return 0; }
+ virtual GLWebViewState* state() { return 0; }
void setBackfaceVisibility(bool value) { m_backfaceVisibility = value; }
void setTransform(const TransformationMatrix& matrix) { m_transform = matrix; }
diff --git a/Source/WebCore/platform/graphics/android/TextureOwner.h b/Source/WebCore/platform/graphics/android/TextureOwner.h
index bd3a291..15395bb 100644
--- a/Source/WebCore/platform/graphics/android/TextureOwner.h
+++ b/Source/WebCore/platform/graphics/android/TextureOwner.h
@@ -30,12 +30,14 @@ namespace WebCore {
class TiledPage;
class BaseTileTexture;
+class GLWebViewState;
class TextureOwner {
public:
virtual ~TextureOwner() { }
virtual bool removeTexture(BaseTileTexture* texture) = 0;
virtual TiledPage* page() = 0;
+ virtual GLWebViewState* state() = 0;
};
}
diff --git a/Source/WebCore/platform/graphics/android/TiledPage.cpp b/Source/WebCore/platform/graphics/android/TiledPage.cpp
index 0e1e947..b532d7a 100644
--- a/Source/WebCore/platform/graphics/android/TiledPage.cpp
+++ b/Source/WebCore/platform/graphics/android/TiledPage.cpp
@@ -171,6 +171,7 @@ void TiledPage::prepareRow(bool goingLeft, int tilesInRow, int firstTileX, int y
if (currentTile) {
currentTile->setScale(m_scale);
+ currentTile->setGLWebViewState(m_glWebViewState);
// ensure there is a texture associated with the tile and then check to
// see if the texture is dirty and in need of repainting
diff --git a/Source/WebCore/platform/graphics/android/TilesManager.cpp b/Source/WebCore/platform/graphics/android/TilesManager.cpp
index da7e89c..ad4cbd3 100644
--- a/Source/WebCore/platform/graphics/android/TilesManager.cpp
+++ b/Source/WebCore/platform/graphics/android/TilesManager.cpp
@@ -93,6 +93,7 @@ TilesManager::TilesManager()
, m_expandedTileBounds(false)
, m_generatorReady(false)
, m_showVisualIndicator(false)
+ , m_drawRegistrationCount(0)
{
XLOG("TilesManager ctor");
m_textures.reserveCapacity(MAX_TEXTURE_ALLOCATION);
@@ -168,47 +169,41 @@ BaseTileTexture* TilesManager::getAvailableTexture(BaseTile* owner)
}
// The heuristic for selecting a texture is as follows:
- // 1. return an unused texture if one exists
- // 2. return the farthest texture from the viewport (from any tiled page)
- // 3. return any texture not used by the tile's page or the page's sibiling
- //
- // The texture level indicates a tiles closeness to the current viewport
+ // 1. If usedLevel == -1, break with that one
+ // 2. Otherwise, select the highest usedLevel available
+ // 3. Break ties with the lowest LRU(RecentLevel) valued GLWebViewState
+
BaseTileTexture* farthestTexture = 0;
int farthestTextureLevel = 0;
+ unsigned int lowestDrawCount = ~0; //maximum uint
const unsigned int max = m_textures.size();
for (unsigned int i = 0; i < max; i++) {
BaseTileTexture* texture = m_textures[i];
+
if (texture->usedLevel() == -1) { // found an unused texture, grab it
farthestTexture = texture;
break;
}
- if (farthestTextureLevel < texture->usedLevel()) {
- farthestTextureLevel = texture->usedLevel();
+
+ int textureLevel = texture->usedLevel();
+ unsigned int textureDrawCount = getGLWebViewStateDrawCount(texture->owner()->state());
+
+ // if (higher distance or equal distance but less recently rendered)
+ if (farthestTextureLevel < textureLevel
+ || ((farthestTextureLevel == textureLevel) && (lowestDrawCount > textureDrawCount))) {
farthestTexture = texture;
+ farthestTextureLevel = textureLevel;
+ lowestDrawCount = textureDrawCount;
}
}
+
if (farthestTexture && farthestTexture->acquire(owner)) {
- XLOG("farthest texture, getAvailableTexture(%x) => texture %x (level %d)",
- owner, farthestTexture, farthestTexture->usedLevel());
+ XLOG("farthest texture, getAvailableTexture(%x) => texture %x (level %d, drawCount %d)",
+ owner, farthestTexture, farthestTextureLevel, lowestDrawCount);
farthestTexture->setUsedLevel(0);
return farthestTexture;
}
- // At this point, all textures are used or we failed to aquire the farthest
- // texture. Now let's just grab a texture not in use by either of the two
- // tiled pages associated with this view.
- TiledPage* currentPage = owner->page();
- TiledPage* nextPage = currentPage->sibling();
- for (unsigned int i = 0; i < max; i++) {
- BaseTileTexture* texture = m_textures[i];
- if (texture->tryAcquire(owner, currentPage, nextPage)) {
- XLOG("grab a texture that wasn't ours, (%x != %x) at %d => texture %x",
- owner->page(), texture->owner()->page(), i, texture);
- texture->setUsedLevel(0);
- return texture;
- }
- }
-
XLOG("Couldn't find an available texture for BaseTile %x (%d, %d) !!!",
owner, owner->x(), owner->y());
#ifdef DEBUG
@@ -424,6 +419,25 @@ int TilesManager::expandedTileBoundsY() {
return m_expandedTileBounds ? EXPANDED_TILE_BOUNDS_Y : 0;
}
+void TilesManager::registerGLWebViewState(GLWebViewState* state)
+{
+ m_glWebViewStateMap.set(state, m_drawRegistrationCount);
+ m_drawRegistrationCount++;
+ XLOG("now state %p, total of %d states", state, m_glWebViewStateMap.size());
+}
+
+void TilesManager::unregisterGLWebViewState(GLWebViewState* state)
+{
+ m_glWebViewStateMap.remove(state);
+ XLOG("state %p now removed, total of %d states", state, m_glWebViewStateMap.size());
+}
+
+unsigned int TilesManager::getGLWebViewStateDrawCount(GLWebViewState* state)
+{
+ XLOG("looking up state %p, contains=%s", state, m_glWebViewStateMap.contains(state) ? "TRUE" : "FALSE");
+ return m_glWebViewStateMap.find(state)->second;
+}
+
TilesManager* TilesManager::instance()
{
if (!gInstance) {
diff --git a/Source/WebCore/platform/graphics/android/TilesManager.h b/Source/WebCore/platform/graphics/android/TilesManager.h
index 5237c14..fe53666 100644
--- a/Source/WebCore/platform/graphics/android/TilesManager.h
+++ b/Source/WebCore/platform/graphics/android/TilesManager.h
@@ -37,6 +37,7 @@
#include "TiledPage.h"
#include "VideoLayerManager.h"
#include <utils/threads.h>
+#include <wtf/HashMap.h>
namespace WebCore {
@@ -108,6 +109,8 @@ public:
static float tileHeight();
int expandedTileBoundsX();
int expandedTileBoundsY();
+ void registerGLWebViewState(GLWebViewState* state);
+ void unregisterGLWebViewState(GLWebViewState* state);
void allocateTiles();
@@ -123,6 +126,10 @@ public:
m_showVisualIndicator = showVisualIndicator;
}
+ SharedTextureMode getSharedTextureMode() {
+ return SurfaceTextureMode;
+ }
+
private:
TilesManager();
@@ -156,6 +163,11 @@ private:
ShaderProgram m_shader;
VideoLayerManager m_videoLayerManager;
+
+ HashMap<GLWebViewState*, unsigned int> m_glWebViewStateMap;
+ unsigned int m_drawRegistrationCount;
+
+ unsigned int getGLWebViewStateDrawCount(GLWebViewState* state);
};
} // namespace WebCore
diff --git a/Source/WebCore/platform/graphics/android/VideoLayerAndroid.h b/Source/WebCore/platform/graphics/android/VideoLayerAndroid.h
index 0f3f007..abc1c13 100644
--- a/Source/WebCore/platform/graphics/android/VideoLayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/VideoLayerAndroid.h
@@ -44,7 +44,7 @@ namespace WebCore {
// Otherwise will draw a static image.
// NOTE: These values are matching the ones in HTML5VideoView.java
// Please keep them in sync when changed here.
-typedef enum {INITIALIZED, PREPARING, PREPARED, PLAYING} PlayerState;
+typedef enum {INITIALIZED, PREPARING, PREPARED, PLAYING, RELEASED} PlayerState;
class VideoLayerAndroid : public LayerAndroid {