Commit 8b1f331b authored by enne@google.com's avatar enne@google.com

[chromium] Split tiler into main thread / compositor thread versions

https://bugs.webkit.org/show_bug.cgi?id=66065

Reviewed by James Robinson.

Source/WebCore:

Covered by existing tests.

LayerTilerChromium is renamed to be CCLayerTilingData. Invalidation
and paint functionality is pushed into TiledLayerChromium and drawing
with GL is pushed into CCTiledLayerImpl. During tree synchronization,
the tiler properties and texture IDs are synchronized into
CCTiledLayerImpl.

* WebCore.gypi:
* platform/graphics/chromium/ContentLayerChromium.cpp:
(WebCore::ContentLayerChromium::paintContentsIfDirty):
(WebCore::ContentLayerChromium::createTextureUpdaterIfNeeded):
* platform/graphics/chromium/ContentLayerChromium.h:
* platform/graphics/chromium/ImageLayerChromium.cpp:
(WebCore::ImageLayerChromium::paintContentsIfDirty):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::bestTextureFormat):
(WebCore::LayerRendererChromium::initializeSharedObjects):
(WebCore::LayerRendererChromium::tilerProgram):
(WebCore::LayerRendererChromium::tilerProgramSwizzle):
(WebCore::LayerRendererChromium::tilerProgramAA):
(WebCore::LayerRendererChromium::tilerProgramSwizzleAA):
* platform/graphics/chromium/LayerRendererChromium.h:
* platform/graphics/chromium/LayerTextureUpdater.h:
* platform/graphics/chromium/LayerTilerChromium.cpp: Removed.
* platform/graphics/chromium/ManagedTexture.h:
(WebCore::ManagedTexture::textureId):
* platform/graphics/chromium/TiledLayerChromium.cpp:
(WebCore::UpdatableTile::UpdatableTile):
(WebCore::UpdatableTile::texture):
(WebCore::UpdatableTile::dirty):
(WebCore::UpdatableTile::clearDirty):
(WebCore::TiledLayerChromium::TiledLayerChromium):
(WebCore::TiledLayerChromium::cleanupResources):
(WebCore::TiledLayerChromium::drawsContent):
(WebCore::TiledLayerChromium::createTilerIfNeeded):
(WebCore::TiledLayerChromium::updateCompositorResources):
(WebCore::TiledLayerChromium::pushPropertiesTo):
(WebCore::TiledLayerChromium::dumpLayerProperties):
(WebCore::TiledLayerChromium::textureManager):
(WebCore::TiledLayerChromium::tileAt):
(WebCore::TiledLayerChromium::createTile):
(WebCore::TiledLayerChromium::invalidateTiles):
(WebCore::TiledLayerChromium::invalidateRect):
(WebCore::TiledLayerChromium::protectVisibleTileTextures):
(WebCore::TiledLayerChromium::protectTileTextures):
(WebCore::TiledLayerChromium::prepareToUpdate):
* platform/graphics/chromium/TiledLayerChromium.h:
* platform/graphics/chromium/cc/CCLayerTilingData.cpp: Added.
(WebCore::CCLayerTilingData::create):
(WebCore::CCLayerTilingData::CCLayerTilingData):
(WebCore::CCLayerTilingData::setTileSize):
(WebCore::CCLayerTilingData::operator=):
(WebCore::CCLayerTilingData::addTile):
(WebCore::CCLayerTilingData::takeTile):
(WebCore::CCLayerTilingData::tileAt):
(WebCore::CCLayerTilingData::reset):
(WebCore::CCLayerTilingData::contentRectToTileIndices):
(WebCore::CCLayerTilingData::contentRectToLayerRect):
(WebCore::CCLayerTilingData::layerRectToContentRect):
(WebCore::CCLayerTilingData::tileContentRect):
(WebCore::CCLayerTilingData::tileLayerRect):
(WebCore::CCLayerTilingData::setLayerPosition):
(WebCore::CCLayerTilingData::growLayerToContain):
* platform/graphics/chromium/cc/CCLayerTilingData.h: Renamed from Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h.
(WebCore::CCLayerTilingData::numTiles):
(WebCore::CCLayerTilingData::numTilesX):
(WebCore::CCLayerTilingData::numTilesY):
(WebCore::CCLayerTilingData::tileBounds):
(WebCore::CCLayerTilingData::textureOffset):
(WebCore::CCLayerTilingData::tileSize):
(WebCore::CCLayerTilingData::hasBorderTexels):
(WebCore::CCLayerTilingData::isEmpty):
(WebCore::CCLayerTilingData::Tile::Tile):
(WebCore::CCLayerTilingData::Tile::i):
(WebCore::CCLayerTilingData::Tile::j):
(WebCore::CCLayerTilingData::Tile::moveTo):
(WebCore::CCLayerTilingData::TileMapKeyTraits::emptyValue):
(WebCore::CCLayerTilingData::TileMapKeyTraits::constructDeletedValue):
(WebCore::CCLayerTilingData::TileMapKeyTraits::isDeletedValue):
(WebCore::CCLayerTilingData::tiles):
* platform/graphics/chromium/cc/CCTiledLayerImpl.cpp:
(WebCore::DrawableTile::DrawableTile):
(WebCore::DrawableTile::textureId):
(WebCore::DrawableTile::setTextureId):
(WebCore::CCTiledLayerImpl::CCTiledLayerImpl):
(WebCore::CCTiledLayerImpl::bindContentsTexture):
(WebCore::CCTiledLayerImpl::tileAt):
(WebCore::CCTiledLayerImpl::createTile):
(WebCore::CCTiledLayerImpl::draw):
(WebCore::CCTiledLayerImpl::setTilingData):
(WebCore::CCTiledLayerImpl::syncTextureId):
(WebCore::isCCW):
(WebCore::computeEdge):
(WebCore::intersect):
(WebCore::CCTiledLayerImpl::drawTiles):
* platform/graphics/chromium/cc/CCTiledLayerImpl.h:
(WebCore::CCTiledLayerImpl::setSkipsDraw):
(WebCore::CCTiledLayerImpl::setTextureOrientation):
(WebCore::CCTiledLayerImpl::setSampledTexelFormat):
* platform/graphics/gpu/TilingData.h:

Source/WebKit/chromium:

Add a test for assignment and copy constructor for TilingData.

* tests/TilingDataTest.cpp:
(WebCore::TEST):

git-svn-id: svn://svn.chromium.org/blink/trunk@93424 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent bb96a65a
2011-08-17 Adrienne Walker <enne@google.com>
[chromium] Split tiler into main thread / compositor thread versions
https://bugs.webkit.org/show_bug.cgi?id=66065
Reviewed by James Robinson.
Covered by existing tests.
LayerTilerChromium is renamed to be CCLayerTilingData. Invalidation
and paint functionality is pushed into TiledLayerChromium and drawing
with GL is pushed into CCTiledLayerImpl. During tree synchronization,
the tiler properties and texture IDs are synchronized into
CCTiledLayerImpl.
* WebCore.gypi:
* platform/graphics/chromium/ContentLayerChromium.cpp:
(WebCore::ContentLayerChromium::paintContentsIfDirty):
(WebCore::ContentLayerChromium::createTextureUpdaterIfNeeded):
* platform/graphics/chromium/ContentLayerChromium.h:
* platform/graphics/chromium/ImageLayerChromium.cpp:
(WebCore::ImageLayerChromium::paintContentsIfDirty):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::bestTextureFormat):
(WebCore::LayerRendererChromium::initializeSharedObjects):
(WebCore::LayerRendererChromium::tilerProgram):
(WebCore::LayerRendererChromium::tilerProgramSwizzle):
(WebCore::LayerRendererChromium::tilerProgramAA):
(WebCore::LayerRendererChromium::tilerProgramSwizzleAA):
* platform/graphics/chromium/LayerRendererChromium.h:
* platform/graphics/chromium/LayerTextureUpdater.h:
* platform/graphics/chromium/LayerTilerChromium.cpp: Removed.
* platform/graphics/chromium/ManagedTexture.h:
(WebCore::ManagedTexture::textureId):
* platform/graphics/chromium/TiledLayerChromium.cpp:
(WebCore::UpdatableTile::UpdatableTile):
(WebCore::UpdatableTile::texture):
(WebCore::UpdatableTile::dirty):
(WebCore::UpdatableTile::clearDirty):
(WebCore::TiledLayerChromium::TiledLayerChromium):
(WebCore::TiledLayerChromium::cleanupResources):
(WebCore::TiledLayerChromium::drawsContent):
(WebCore::TiledLayerChromium::createTilerIfNeeded):
(WebCore::TiledLayerChromium::updateCompositorResources):
(WebCore::TiledLayerChromium::pushPropertiesTo):
(WebCore::TiledLayerChromium::dumpLayerProperties):
(WebCore::TiledLayerChromium::textureManager):
(WebCore::TiledLayerChromium::tileAt):
(WebCore::TiledLayerChromium::createTile):
(WebCore::TiledLayerChromium::invalidateTiles):
(WebCore::TiledLayerChromium::invalidateRect):
(WebCore::TiledLayerChromium::protectVisibleTileTextures):
(WebCore::TiledLayerChromium::protectTileTextures):
(WebCore::TiledLayerChromium::prepareToUpdate):
* platform/graphics/chromium/TiledLayerChromium.h:
* platform/graphics/chromium/cc/CCLayerTilingData.cpp: Added.
(WebCore::CCLayerTilingData::create):
(WebCore::CCLayerTilingData::CCLayerTilingData):
(WebCore::CCLayerTilingData::setTileSize):
(WebCore::CCLayerTilingData::operator=):
(WebCore::CCLayerTilingData::addTile):
(WebCore::CCLayerTilingData::takeTile):
(WebCore::CCLayerTilingData::tileAt):
(WebCore::CCLayerTilingData::reset):
(WebCore::CCLayerTilingData::contentRectToTileIndices):
(WebCore::CCLayerTilingData::contentRectToLayerRect):
(WebCore::CCLayerTilingData::layerRectToContentRect):
(WebCore::CCLayerTilingData::tileContentRect):
(WebCore::CCLayerTilingData::tileLayerRect):
(WebCore::CCLayerTilingData::setLayerPosition):
(WebCore::CCLayerTilingData::growLayerToContain):
* platform/graphics/chromium/cc/CCLayerTilingData.h: Renamed from Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h.
(WebCore::CCLayerTilingData::numTiles):
(WebCore::CCLayerTilingData::numTilesX):
(WebCore::CCLayerTilingData::numTilesY):
(WebCore::CCLayerTilingData::tileBounds):
(WebCore::CCLayerTilingData::textureOffset):
(WebCore::CCLayerTilingData::tileSize):
(WebCore::CCLayerTilingData::hasBorderTexels):
(WebCore::CCLayerTilingData::isEmpty):
(WebCore::CCLayerTilingData::Tile::Tile):
(WebCore::CCLayerTilingData::Tile::i):
(WebCore::CCLayerTilingData::Tile::j):
(WebCore::CCLayerTilingData::Tile::moveTo):
(WebCore::CCLayerTilingData::TileMapKeyTraits::emptyValue):
(WebCore::CCLayerTilingData::TileMapKeyTraits::constructDeletedValue):
(WebCore::CCLayerTilingData::TileMapKeyTraits::isDeletedValue):
(WebCore::CCLayerTilingData::tiles):
* platform/graphics/chromium/cc/CCTiledLayerImpl.cpp:
(WebCore::DrawableTile::DrawableTile):
(WebCore::DrawableTile::textureId):
(WebCore::DrawableTile::setTextureId):
(WebCore::CCTiledLayerImpl::CCTiledLayerImpl):
(WebCore::CCTiledLayerImpl::bindContentsTexture):
(WebCore::CCTiledLayerImpl::tileAt):
(WebCore::CCTiledLayerImpl::createTile):
(WebCore::CCTiledLayerImpl::draw):
(WebCore::CCTiledLayerImpl::setTilingData):
(WebCore::CCTiledLayerImpl::syncTextureId):
(WebCore::isCCW):
(WebCore::computeEdge):
(WebCore::intersect):
(WebCore::CCTiledLayerImpl::drawTiles):
* platform/graphics/chromium/cc/CCTiledLayerImpl.h:
(WebCore::CCTiledLayerImpl::setSkipsDraw):
(WebCore::CCTiledLayerImpl::setTextureOrientation):
(WebCore::CCTiledLayerImpl::setSampledTexelFormat):
* platform/graphics/gpu/TilingData.h:
2011-08-19 Dan Bernstein <mitz@apple.com>
Better build fix after r93384.
......@@ -3510,8 +3510,6 @@
'platform/graphics/chromium/LayerTextureUpdater.h',
'platform/graphics/chromium/LayerTextureUpdaterCanvas.cpp',
'platform/graphics/chromium/LayerTextureUpdaterCanvas.h',
'platform/graphics/chromium/LayerTilerChromium.cpp',
'platform/graphics/chromium/LayerTilerChromium.h',
'platform/graphics/chromium/NonCompositedContentHost.cpp',
'platform/graphics/chromium/NonCompositedContentHost.h',
'platform/graphics/chromium/MediaPlayerPrivateChromium.h',
......@@ -3560,6 +3558,8 @@
'platform/graphics/chromium/cc/CCLayerImpl.h',
'platform/graphics/chromium/cc/CCLayerSorter.cpp',
'platform/graphics/chromium/cc/CCLayerSorter.h',
'platform/graphics/chromium/cc/CCLayerTilingData.cpp',
'platform/graphics/chromium/cc/CCLayerTilingData.h',
'platform/graphics/chromium/cc/CCLayerTreeHost.cpp',
'platform/graphics/chromium/cc/CCLayerTreeHost.h',
'platform/graphics/chromium/cc/CCLayerTreeHostCommitter.cpp',
......
......@@ -104,12 +104,12 @@ void ContentLayerChromium::paintContentsIfDirty()
IntRect dirty = enclosingIntRect(m_dirtyRect);
dirty.intersect(IntRect(IntPoint(), contentBounds()));
m_tiler->invalidateRect(dirty);
invalidateRect(dirty);
if (!drawsContent())
return;
m_tiler->prepareToUpdate(layerRect, textureUpdater());
prepareToUpdate(layerRect);
m_dirtyRect = FloatRect();
}
......@@ -122,6 +122,7 @@ void ContentLayerChromium::createTextureUpdaterIfNeeded()
{
if (m_textureUpdater)
return;
#if USE(SKIA)
if (layerRenderer()->settings().acceleratePainting) {
m_textureUpdater = LayerTextureUpdaterSkPicture::create(layerRendererContext(), ContentLayerPainter::create(m_owner), layerRenderer()->skiaContext());
......@@ -131,10 +132,5 @@ void ContentLayerChromium::createTextureUpdaterIfNeeded()
m_textureUpdater = LayerTextureUpdaterBitmap::create(layerRendererContext(), ContentLayerPainter::create(m_owner), layerRenderer()->contextSupportsMapSub());
}
void ContentLayerChromium::protectVisibleTileTextures()
{
m_tiler->protectTileTextures(IntRect(IntPoint::zero(), contentBounds()));
}
}
#endif // USE(ACCELERATED_COMPOSITING)
......@@ -60,7 +60,6 @@ private:
virtual bool drawsContent() const;
virtual void createTextureUpdaterIfNeeded();
virtual LayerTextureUpdater* textureUpdater() const { return m_textureUpdater.get(); }
virtual void protectVisibleTileTextures();
OwnPtr<LayerTextureUpdater> m_textureUpdater;
};
......
......@@ -154,7 +154,7 @@ void ImageLayerChromium::paintContentsIfDirty()
updateTileSizeAndTilingOption();
IntRect paintRect(IntPoint(), contentBounds());
if (!m_dirtyRect.isEmpty()) {
m_tiler->invalidateRect(paintRect);
invalidateRect(paintRect);
m_dirtyRect = IntRect();
}
}
......@@ -162,7 +162,7 @@ void ImageLayerChromium::paintContentsIfDirty()
if (visibleLayerRect().isEmpty())
return;
m_tiler->prepareToUpdate(visibleLayerRect(), m_textureUpdater.get());
prepareToUpdate(visibleLayerRect());
}
LayerTextureUpdater* ImageLayerChromium::textureUpdater() const
......
......@@ -45,6 +45,7 @@
#include "LayerTextureUpdaterCanvas.h"
#include "NonCompositedContentHost.h"
#include "NotImplemented.h"
#include "PlatformColor.h"
#include "RenderSurfaceChromium.h"
#include "TextStream.h"
#include "TextureManager.h"
......@@ -537,6 +538,11 @@ void LayerRendererChromium::releaseTextures()
m_renderSurfaceTextureManager->deleteEvictedTextures(m_context.get());
}
GC3Denum LayerRendererChromium::bestTextureFormat()
{
return PlatformColor::bestTextureFormat(context());
}
void LayerRendererChromium::viewportChanged()
{
if (m_context)
......@@ -1114,7 +1120,7 @@ bool LayerRendererChromium::initializeSharedObjects()
// start while we do other work. Other programs are created lazily on first access.
m_sharedGeometry = adoptPtr(new GeometryBinding(m_context.get()));
m_renderSurfaceProgram = adoptPtr(new CCRenderSurface::Program(m_context.get()));
m_tilerProgram = adoptPtr(new LayerTilerChromium::Program(m_context.get()));
m_tilerProgram = adoptPtr(new CCTiledLayerImpl::Program(m_context.get()));
GLC(m_context.get(), m_context->flush());
......@@ -1170,7 +1176,7 @@ const CCRenderSurface::MaskProgram* LayerRendererChromium::renderSurfaceMaskProg
return m_renderSurfaceMaskProgram.get();
}
const LayerTilerChromium::Program* LayerRendererChromium::tilerProgram()
const CCTiledLayerImpl::Program* LayerRendererChromium::tilerProgram()
{
ASSERT(m_tilerProgram);
if (!m_tilerProgram->initialized()) {
......@@ -1180,10 +1186,10 @@ const LayerTilerChromium::Program* LayerRendererChromium::tilerProgram()
return m_tilerProgram.get();
}
const LayerTilerChromium::ProgramSwizzle* LayerRendererChromium::tilerProgramSwizzle()
const CCTiledLayerImpl::ProgramSwizzle* LayerRendererChromium::tilerProgramSwizzle()
{
if (!m_tilerProgramSwizzle)
m_tilerProgramSwizzle = adoptPtr(new LayerTilerChromium::ProgramSwizzle(m_context.get()));
m_tilerProgramSwizzle = adoptPtr(new CCTiledLayerImpl::ProgramSwizzle(m_context.get()));
if (!m_tilerProgramSwizzle->initialized()) {
TRACE_EVENT("LayerRendererChromium::tilerProgramSwizzle::initialize", this, 0);
m_tilerProgramSwizzle->initialize();
......@@ -1191,10 +1197,10 @@ const LayerTilerChromium::ProgramSwizzle* LayerRendererChromium::tilerProgramSwi
return m_tilerProgramSwizzle.get();
}
const LayerTilerChromium::ProgramAA* LayerRendererChromium::tilerProgramAA()
const CCTiledLayerImpl::ProgramAA* LayerRendererChromium::tilerProgramAA()
{
if (!m_tilerProgramAA)
m_tilerProgramAA = adoptPtr(new LayerTilerChromium::ProgramAA(m_context.get()));
m_tilerProgramAA = adoptPtr(new CCTiledLayerImpl::ProgramAA(m_context.get()));
if (!m_tilerProgramAA->initialized()) {
TRACE_EVENT("LayerRendererChromium::tilerProgramAA::initialize", this, 0);
m_tilerProgramAA->initialize();
......@@ -1202,10 +1208,10 @@ const LayerTilerChromium::ProgramAA* LayerRendererChromium::tilerProgramAA()
return m_tilerProgramAA.get();
}
const LayerTilerChromium::ProgramSwizzleAA* LayerRendererChromium::tilerProgramSwizzleAA()
const CCTiledLayerImpl::ProgramSwizzleAA* LayerRendererChromium::tilerProgramSwizzleAA()
{
if (!m_tilerProgramSwizzleAA)
m_tilerProgramSwizzleAA = adoptPtr(new LayerTilerChromium::ProgramSwizzleAA(m_context.get()));
m_tilerProgramSwizzleAA = adoptPtr(new CCTiledLayerImpl::ProgramSwizzleAA(m_context.get()));
if (!m_tilerProgramSwizzleAA->initialized()) {
TRACE_EVENT("LayerRendererChromium::tilerProgramSwizzleAA::initialize", this, 0);
m_tilerProgramSwizzleAA->initialize();
......
......@@ -37,7 +37,6 @@
#include "ContentLayerChromium.h"
#include "IntRect.h"
#include "LayerChromium.h"
#include "LayerTilerChromium.h"
#include "VideoLayerChromium.h"
#include "cc/CCCanvasLayerImpl.h"
#include "cc/CCHeadsUpDisplay.h"
......@@ -124,10 +123,10 @@ public:
const CCHeadsUpDisplay::Program* headsUpDisplayProgram();
const CCRenderSurface::Program* renderSurfaceProgram();
const CCRenderSurface::MaskProgram* renderSurfaceMaskProgram();
const LayerTilerChromium::Program* tilerProgram();
const LayerTilerChromium::ProgramSwizzle* tilerProgramSwizzle();
const LayerTilerChromium::ProgramAA* tilerProgramAA();
const LayerTilerChromium::ProgramSwizzleAA* tilerProgramSwizzleAA();
const CCTiledLayerImpl::Program* tilerProgram();
const CCTiledLayerImpl::ProgramSwizzle* tilerProgramSwizzle();
const CCTiledLayerImpl::ProgramAA* tilerProgramAA();
const CCTiledLayerImpl::ProgramSwizzleAA* tilerProgramSwizzleAA();
const CCCanvasLayerImpl::Program* canvasLayerProgram();
const CCPluginLayerImpl::Program* pluginLayerProgram();
const CCVideoLayerImpl::RGBAProgram* videoLayerRGBAProgram();
......@@ -154,6 +153,8 @@ public:
void setLayerRendererRecursive(LayerChromium*);
GC3Denum bestTextureFormat();
#ifndef NDEBUG
static bool s_inPaintLayerContents;
#endif
......@@ -218,10 +219,10 @@ private:
OwnPtr<GeometryBinding> m_sharedGeometry;
OwnPtr<LayerChromium::BorderProgram> m_borderProgram;
OwnPtr<CCHeadsUpDisplay::Program> m_headsUpDisplayProgram;
OwnPtr<LayerTilerChromium::Program> m_tilerProgram;
OwnPtr<LayerTilerChromium::ProgramSwizzle> m_tilerProgramSwizzle;
OwnPtr<LayerTilerChromium::ProgramAA> m_tilerProgramAA;
OwnPtr<LayerTilerChromium::ProgramSwizzleAA> m_tilerProgramSwizzleAA;
OwnPtr<CCTiledLayerImpl::Program> m_tilerProgram;
OwnPtr<CCTiledLayerImpl::ProgramSwizzle> m_tilerProgramSwizzle;
OwnPtr<CCTiledLayerImpl::ProgramAA> m_tilerProgramAA;
OwnPtr<CCTiledLayerImpl::ProgramSwizzleAA> m_tilerProgramSwizzleAA;
OwnPtr<CCCanvasLayerImpl::Program> m_canvasLayerProgram;
OwnPtr<CCPluginLayerImpl::Program> m_pluginLayerProgram;
OwnPtr<CCRenderSurface::MaskProgram> m_renderSurfaceMaskProgram;
......
......@@ -30,6 +30,7 @@
#if USE(ACCELERATED_COMPOSITING)
#include "GraphicsTypes3D.h"
#include <wtf/Noncopyable.h>
namespace WebCore {
......@@ -78,4 +79,3 @@ private:
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
#endif // LayerTextureUpdater_h
......@@ -60,6 +60,8 @@ public:
void bindTexture(GraphicsContext3D*);
void framebufferTexture2D(GraphicsContext3D*);
unsigned textureId() const { return m_textureId; }
private:
explicit ManagedTexture(TextureManager*);
......@@ -73,4 +75,3 @@ private:
}
#endif // ManagedTexture_h
......@@ -29,12 +29,13 @@
#if USE(ACCELERATED_COMPOSITING)
#include "LayerChromium.h"
#include "cc/CCLayerTilingData.h"
#include "cc/CCTiledLayerImpl.h"
namespace WebCore {
class LayerTilerChromium;
class LayerTextureUpdater;
class UpdatableTile;
class TiledLayerChromium : public LayerChromium {
public:
......@@ -49,6 +50,10 @@ public:
virtual bool drawsContent() const;
// Reserves all existing and valid tile textures to protect them from being
// recycled by the texture manager.
void protectTileTextures(const IntRect& contentRect);
protected:
explicit TiledLayerChromium(GraphicsLayerChromium*);
......@@ -58,7 +63,13 @@ protected:
virtual void createTextureUpdaterIfNeeded() = 0;
virtual LayerTextureUpdater* textureUpdater() const = 0;
OwnPtr<LayerTilerChromium> m_tiler;
// Set invalidations to be potentially repainted during update().
void invalidateRect(const IntRect& contentRect);
// Prepare data needed to update textures that intersect with contentRect.
void prepareToUpdate(const IntRect& contentRect);
// Update invalid textures that intersect with contentRect provided in prepareToUpdate().
void updateRect(GraphicsContext3D*, LayerTextureUpdater*);
virtual void protectVisibleTileTextures();
private:
virtual PassRefPtr<CCLayerImpl> createCCLayerImpl();
......@@ -71,7 +82,26 @@ private:
void setTilingOption(TilingOption);
TransformationMatrix tilingTransform() const;
UpdatableTile* tileAt(int, int) const;
UpdatableTile* createTile(int, int);
void invalidateTiles(const IntRect& contentRect);
TextureManager* textureManager() const;
// State held between update and upload.
IntRect m_paintRect;
IntRect m_updateRect;
// Tightly packed set of unused tiles.
Vector<RefPtr<UpdatableTile> > m_unusedTiles;
TilingOption m_tilingOption;
GC3Denum m_textureFormat;
bool m_skipsDraw;
LayerTextureUpdater::Orientation m_textureOrientation;
LayerTextureUpdater::SampledTexelFormat m_sampledTexelFormat;
OwnPtr<CCLayerTilingData> m_tiler;
};
}
......
/*
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "cc/CCLayerTilingData.h"
using namespace std;
namespace WebCore {
PassOwnPtr<CCLayerTilingData> CCLayerTilingData::create(const IntSize& tileSize, BorderTexelOption border)
{
return adoptPtr(new CCLayerTilingData(tileSize, border));
}
CCLayerTilingData::CCLayerTilingData(const IntSize& tileSize, BorderTexelOption border)
: m_tilingData(max(tileSize.width(), tileSize.height()), 0, 0, border == HasBorderTexels)
{
setTileSize(tileSize);
}
void CCLayerTilingData::setTileSize(const IntSize& size)
{
if (m_tileSize == size)
return;
reset();
m_tileSize = size;
m_tilingData.setMaxTextureSize(max(size.width(), size.height()));
}
const CCLayerTilingData& CCLayerTilingData::operator=(const CCLayerTilingData& tiler)
{
m_tileSize = tiler.m_tileSize;
m_layerPosition = tiler.m_layerPosition;
m_tilingData = tiler.m_tilingData;
return *this;
}
void CCLayerTilingData::addTile(PassRefPtr<Tile> tile, int i, int j)
{
ASSERT(!tileAt(i, j));
tile->moveTo(i, j);
m_tiles.add(make_pair(i, j), tile);
}
PassRefPtr<CCLayerTilingData::Tile> CCLayerTilingData::takeTile(int i, int j)
{
return m_tiles.take(make_pair(i, j));
}
CCLayerTilingData::Tile* CCLayerTilingData::tileAt(int i, int j) const
{
Tile* tile = m_tiles.get(make_pair(i, j)).get();
ASSERT(!tile || tile->refCount() == 1);
return tile;
}
void CCLayerTilingData::reset()
{
m_tiles.clear();
m_tilingData.setTotalSize(0, 0);
}
void CCLayerTilingData::contentRectToTileIndices(const IntRect& contentRect, int& left, int& top, int& right, int& bottom) const
{
const IntRect layerRect = contentRectToLayerRect(contentRect);
left = m_tilingData.tileXIndexFromSrcCoord(layerRect.x());
top = m_tilingData.tileYIndexFromSrcCoord(layerRect.y());
right = m_tilingData.tileXIndexFromSrcCoord(layerRect.maxX() - 1);
bottom = m_tilingData.tileYIndexFromSrcCoord(layerRect.maxY() - 1);
}
IntRect CCLayerTilingData::contentRectToLayerRect(const IntRect& contentRect) const
{
IntPoint pos(contentRect.x() - m_layerPosition.x(), contentRect.y() - m_layerPosition.y());
IntRect layerRect(pos, contentRect.size());
// Clip to the position.
if (pos.x() < 0 || pos.y() < 0)
layerRect = IntRect(IntPoint(0, 0), IntSize(contentRect.width() + pos.x(), contentRect.height() + pos.y()));
return layerRect;
}
IntRect CCLayerTilingData::layerRectToContentRect(const IntRect& layerRect) const
{
IntRect contentRect = layerRect;
contentRect.move(m_layerPosition.x(), m_layerPosition.y());
return contentRect;
}
IntRect CCLayerTilingData::tileContentRect(const Tile* tile) const
{
IntRect contentRect = tileLayerRect(tile);
contentRect.move(m_layerPosition.x(), m_layerPosition.y());
return contentRect;
}
IntRect CCLayerTilingData::tileLayerRect(const Tile* tile) const
{
const int index = m_tilingData.tileIndex(tile->i(), tile->j());
IntRect layerRect = m_tilingData.tileBoundsWithBorder(index);
layerRect.setSize(m_tileSize);
return layerRect;
}
void CCLayerTilingData::setLayerPosition(const IntPoint& layerPosition)
{
m_layerPosition = layerPosition;
}
void CCLayerTilingData::growLayerToContain(const IntRect& contentRect)
{
// Grow the tile array to contain this content rect.
IntRect layerRect = contentRectToLayerRect(contentRect);
IntSize rectSize = IntSize(layerRect.maxX(), layerRect.maxY());
IntSize oldLayerSize(m_tilingData.totalSizeX(), m_tilingData.totalSizeY());
IntSize newSize = rectSize.expandedTo(oldLayerSize);
m_tilingData.setTotalSize(newSize.width(), newSize.height());
}
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
/*
* Copyright (C) 2010 Google Inc. All rights reserved.
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -24,122 +24,57 @@
*/
#ifndef LayerTilerChromium_h
#define LayerTilerChromium_h
#ifndef CCLayerTilingData_h
#define CCLayerTilingData_h
#if USE(ACCELERATED_COMPOSITING)
#include "LayerChromium.h"
#include "ManagedTexture.h"
#include "LayerTextureUpdater.h"
#include "IntRect.h"
#include "TilingData.h"
#include <wtf/HashMap.h>
#include <wtf/HashTraits.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
namespace WebCore {
class GraphicsContext3D;
class LayerRendererChromium;
class LayerTextureUpdater;
class LayerTilerChromium {
WTF_MAKE_NONCOPYABLE(LayerTilerChromium);
class CCLayerTilingData {
public:
enum BorderTexelOption { HasBorderTexels, NoBorderTexels };
static PassOwnPtr<LayerTilerChromium> create(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
~LayerTilerChromium();
// Set invalidations to be potentially repainted during update().
void invalidateRect(const IntRect& contentRect);
void invalidateEntireLayer();
// Prepare data needed to update textures that instersect with contentRect.
void prepareToUpdate(const IntRect& contentRect, LayerTextureUpdater*);
// Update invalid textures that intersect with contentRect provided in prepareToUpdate().
void updateRect(LayerTextureUpdater*);
// Draw all tiles that intersect with the content rect.
void draw(const IntRect& contentRect, const TransformationMatrix&, float opacity);
static PassOwnPtr<CCLayerTilingData> create(const IntSize& tileSize, BorderTexelOption);
int numTiles() const { return m_tilingData.numTiles(); }
int numTilesX() const { return m_tilingData.numTilesX(); }
int numTilesY() const { return m_tilingData.numTilesY(); }
IntRect tileBounds(int i, int j) const { return m_tilingData.tileBounds(m_tilingData.tileIndex(i, j)); }
IntPoint textureOffset(int xIndex, int yIndex) const { return m_tilingData.textureOffset(xIndex, yIndex); }
// Set position of this tiled layer in content space.
void setLayerPosition(const IntPoint& position);
// Change the tile size. This may invalidate all the existing tiles.
void setTileSize(const IntSize& size);
bool skipsDraw() const { return m_skipsDraw; }
// Reserves all existing and valid tile textures to protect them from being
// recycled by the texture manager.
void protectTileTextures(const IntRect& contentRect);
void setLayerPosition(const IntPoint&);
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> Program;
// Shader program that swaps red and blue components of texture.
// Used when texture format does not match native color format.
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha> ProgramSwizzle;
// Change the tile size. This may invalidate all the existing tiles.
void setTileSize(const IntSize&);
const IntSize& tileSize() const { return m_tileSize; }
bool hasBorderTexels() const { return m_tilingData.borderTexels(); }
// Shader program that produces anti-aliased layer edges.
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlphaAA> ProgramAA;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlphaAA> ProgramSwizzleAA;
bool isEmpty() const { return !m_tilingData.numTiles() || !tiles().size(); }
// If this tiler has exactly one tile, return its texture. Otherwise, null.
ManagedTexture* getSingleTexture();
const CCLayerTilingData& operator=(const CCLayerTilingData&);
private:
LayerTilerChromium(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
class Tile : public RefCounted<Tile> {
class Tile: public RefCounted<Tile> {
WTF_MAKE_NONCOPYABLE(Tile);
public:
explicit Tile(PassOwnPtr<ManagedTexture> tex) : m_tex(tex), m_i(-1), m_j(-1) { }
ManagedTexture* texture() { return m_tex.get(); }
bool dirty() const { return !m_dirtyLayerRect.isEmpty(); }
void clearDirty() { m_dirtyLayerRect = IntRect(); }
Tile() : m_i(-1), m_j(-1) { }
virtual ~Tile() { }
int i() const { return m_i; }
int j() const { return m_j; }
void moveTo(int i, int j) { m_i = i; m_j = j; }
// Layer-space dirty rectangle that needs to be repainted.
IntRect m_dirtyLayerRect;
private:
OwnPtr<ManagedTexture> m_tex;
int m_i;
int m_j;
};
// Draw all tiles that intersect with contentRect.
template <class T>
void drawTiles(const IntRect& contentRect, const TransformationMatrix&, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation);
// Grow layer size to contain this rectangle.
void growLayerToContain(const IntRect& contentRect);
LayerRendererChromium* layerRenderer() const { return m_layerRenderer; }
GraphicsContext3D* layerRendererContext() const;
Tile* createTile(int i, int j);
// Invalidate any tiles which do not intersect with the contentRect
void invalidateTiles(const IntRect& contentRect);
void reset();
void contentRectToTileIndices(const IntRect& contentRect, int &left, int &top, int &right, int &bottom) const;
IntRect contentRectToLayerRect(const IntRect& contentRect) const;
IntRect layerRectToContentRect(const IntRect& layerRect) const;
Tile* tileAt(int, int) const;
IntRect tileContentRect(const Tile*) const;
IntRect tileLayerRect(const Tile*) const;
GC3Denum m_textureFormat;
IntSize m_tileSize;
IntPoint m_layerPosition;
bool m_skipsDraw;
// Default hash key traits for integers disallow 0 and -1 as a key, so
// use a custom hash trait which disallows -1 and -2 instead.
typedef std::pair<int, int> TileMapKey;
......@@ -154,19 +89,29 @@ private:
// refcount of a Tile should never be more than 1. However, HashMap
// doesn't easily support OwnPtr as a value.
typedef HashMap<TileMapKey, RefPtr<Tile>, DefaultHash<TileMapKey>::Hash, TileMapKeyTraits> TileMap;
TileMap m_tiles;
// Tightly packed set of unused tiles.
Vector<RefPtr<Tile> > m_unusedTiles;
// State held between update and upload.
IntRect m_paintRect;
IntRect m_updateRect;
void addTile(PassRefPtr<Tile>, int, int);
PassRefPtr<Tile> takeTile(int, int);
Tile* tileAt(int, int) const;
const TileMap& tiles() const { return m_tiles; }
LayerTextureUpdater::Orientation m_textureOrientation;
LayerTextureUpdater::SampledTexelFormat m_sampledTexelFormat;
TilingData m_tilingData;
// Grow layer size to contain this rectangle.
void growLayerToContain(const IntRect& contentRect);
void contentRectToTileIndices(const IntRect& contentRect, int &left, int &top, int &right, int &bottom) const;
IntRect contentRectToLayerRect(const IntRect& contentRect) const;
IntRect layerRectToContentRect(const IntRect& layerRect) const;
IntRect tileContentRect(const Tile*) const;
IntRect tileLayerRect(const Tile*) const;
void reset();
LayerRendererChromium* m_layerRenderer;
protected:
CCLayerTilingData(const IntSize& tileSize, BorderTexelOption);
TileMap m_tiles;
IntSize m_tileSize;
IntPoint m_layerPosition;
TilingData m_tilingData;
};
}
......
......@@ -26,11 +26,15 @@
#ifndef CCTiledLayerImpl_h
#define CCTiledLayerImpl_h
#include "LayerTilerChromium.h"
#include "LayerTextureUpdater.h"
#include "TransformationMatrix.h"
#include "cc/CCLayerImpl.h"
#include "cc/CCLayerTilingData.h"
namespace WebCore {
class DrawableTile;
class CCTiledLayerImpl : public CCLayerImpl {
public:
static PassRefPtr<CCTiledLayerImpl> create(int id)
......@@ -45,13 +49,40 @@ public:
virtual void dumpLayerProperties(TextStream&, int indent) const;
void setTilingTransform(const TransformationMatrix& tilingTransform) { m_tilingTransform = tilingTransform; }
void setTiler(LayerTilerChromium* tiler) { m_tiler = tiler; }
void setSkipsDraw(bool skipsDraw) { m_skipsDraw = skipsDraw; }
void setTextureOrientation(LayerTextureUpdater::Orientation textureOrientation) { m_textureOrientation = textureOrientation; }
void setSampledTexelFormat(LayerTextureUpdater::SampledTexelFormat sampledTexelFormat) { m_sampledTexelFormat = sampledTexelFormat; }
void setTilingData(const CCLayerTilingData& tiler);
void syncTextureId(int, int, Platform3DObject textureId);
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> Program;
// Shader program that swaps red and blue components of texture.
// Used when texture format does not match native color format.
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha> ProgramSwizzle;
// Shader program that produces anti-aliased layer edges.
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlphaAA> ProgramAA;
typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlphaAA> ProgramSwizzleAA;
private:
explicit CCTiledLayerImpl(int id);
// Draw all tiles that intersect with the content rect.
void draw(LayerRendererChromium*, const IntRect& contentRect, const TransformationMatrix&, float opacity);
DrawableTile* tileAt(int, int) const;
DrawableTile* createTile(int, int);
// Draw all tiles that intersect with contentRect.
template <class T>
void drawTiles(LayerRendererChromium*, const IntRect& contentRect, const TransformationMatrix&, float opacity, const T* program, int fragmentTexTransformLocation, int edgeLocation);
TransformationMatrix m_tilingTransform;
LayerTilerChromium* m_tiler;
bool m_skipsDraw;
LayerTextureUpdater::Orientation m_textureOrientation;
LayerTextureUpdater::SampledTexelFormat m_sampledTexelFormat;
OwnPtr<CCLayerTilingData> m_tiler;
};
}
......
......@@ -40,7 +40,6 @@ class IntRect;
class IntPoint;
class TilingData {
WTF_MAKE_NONCOPYABLE(TilingData);
public:
TilingData(int maxTextureSize, int totalSizeX, int totalSizeY, bool hasBorderTexels);
void setTotalSize(int totalSizeX, int totalSizeY);
......
2011-08-17 Adrienne Walker <enne@google.com>
[chromium] Split tiler into main thread / compositor thread versions
https://bugs.webkit.org/show_bug.cgi?id=66065
Reviewed by James Robinson.
Add a test for assignment and copy constructor for TilingData.
* tests/TilingDataTest.cpp:
(WebCore::TEST):
2011-08-19 Andrey Kosyakov <caseq@chromium.org>
Web Inspector: [Extensions API][chromium] webInspector.resources deprecation warning is given even for extensions that don't use webInspector.resources
......
......@@ -488,4 +488,28 @@ TEST(TilingDataTest, setMaxTextureSizeBorders)
EXPECT_EQ(10, data.numTilesY());
}
TEST(TilingDataTest, assignment)
{
{
TilingData source(8, 16, 32, true);
TilingData dest = source;
EXPECT_EQ(source.borderTexels(), dest.borderTexels());
EXPECT_EQ(source.maxTextureSize(), dest.maxTextureSize());
EXPECT_EQ(source.numTilesX(), dest.numTilesX());
EXPECT_EQ(source.numTilesY(), dest.numTilesY());
EXPECT_EQ(source.totalSizeX(), dest.totalSizeX());
EXPECT_EQ(source.totalSizeY(), dest.totalSizeY());
}
{
TilingData source(3, 6, 100, false);
TilingData dest(source);
EXPECT_EQ(source.borderTexels(), dest.borderTexels());
EXPECT_EQ(source.maxTextureSize(), dest.maxTextureSize());
EXPECT_EQ(source.numTilesX(), dest.numTilesX());
EXPECT_EQ(source.numTilesY(), dest.numTilesY());
EXPECT_EQ(source.totalSizeX(), dest.totalSizeX());
EXPECT_EQ(source.totalSizeY(), dest.totalSizeY());
}
}
} // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment