ContentLayerChromium.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "ContentLayerChromium.h"
#include "BitmapCanvasLayerTextureUpdater.h"
#include "BitmapSkPictureCanvasLayerTextureUpdater.h"
#include "FrameBufferSkPictureCanvasLayerTextureUpdater.h"
#include "LayerPainterChromium.h"
#include "LayerRendererChromium.h"
#include "PlatformSupport.h"
#include "cc/CCLayerTreeHost.h"
#include <public/Platform.h>
#include <wtf/CurrentTime.h>
namespace WebCore {
class ContentLayerPainter : public LayerPainterChromium {
WTF_MAKE_NONCOPYABLE(ContentLayerPainter);
public:
static PassOwnPtr<ContentLayerPainter> create(ContentLayerDelegate* delegate)
{
return adoptPtr(new ContentLayerPainter(delegate));
}
virtual void paint(GraphicsContext& context, const IntRect& contentRect)
{
double paintStart = currentTime();
context.clearRect(contentRect);
context.clip(contentRect);
m_delegate->paintContents(context, contentRect);
double paintEnd = currentTime();
double pixelsPerSec = (contentRect.width() * contentRect.height()) / (paintEnd - paintStart);
WebKit::Platform::current()->histogramCustomCounts("Renderer4.AccelContentPaintDurationMS", (paintEnd - paintStart) * 1000, 0, 120, 30);
WebKit::Platform::current()->histogramCustomCounts("Renderer4.AccelContentPaintMegapixPerSecond", pixelsPerSec / 1000000, 10, 210, 30);
}
private:
explicit ContentLayerPainter(ContentLayerDelegate* delegate)
: m_delegate(delegate)
{
}
ContentLayerDelegate* m_delegate;
};
PassRefPtr<ContentLayerChromium> ContentLayerChromium::create(ContentLayerDelegate* delegate)
{
return adoptRef(new ContentLayerChromium(delegate));
}
ContentLayerChromium::ContentLayerChromium(ContentLayerDelegate* delegate)
: TiledLayerChromium()
, m_delegate(delegate)
{
}
ContentLayerChromium::~ContentLayerChromium()
{
}
bool ContentLayerChromium::drawsContent() const
{
return TiledLayerChromium::drawsContent() && m_delegate;
}
void ContentLayerChromium::update(CCTextureUpdater& updater, const CCOcclusionTracker* occlusion)
{
updateTileSizeAndTilingOption();
createTextureUpdaterIfNeeded();
IntRect layerRect;
if (drawsContent())
layerRect = visibleLayerRect();
updateLayerRect(updater, layerRect, occlusion);
m_needsDisplay = false;
}
void ContentLayerChromium::idleUpdate(CCTextureUpdater& updater, const CCOcclusionTracker* occlusion)
{
if (!drawsContent())
return;
const IntRect layerRect = visibleLayerRect();
idleUpdateLayerRect(updater, layerRect, occlusion);
if (needsIdlePaint(layerRect))
setNeedsCommit();
}
void ContentLayerChromium::createTextureUpdaterIfNeeded()
{
if (m_textureUpdater)
return;
if (layerTreeHost()->settings().acceleratePainting)
m_textureUpdater = FrameBufferSkPictureCanvasLayerTextureUpdater::create(ContentLayerPainter::create(m_delegate));
else if (layerTreeHost()->settings().perTilePainting)
m_textureUpdater = BitmapSkPictureCanvasLayerTextureUpdater::create(ContentLayerPainter::create(m_delegate), layerTreeHost()->layerRendererCapabilities().usingMapSub);
else
m_textureUpdater = BitmapCanvasLayerTextureUpdater::create(ContentLayerPainter::create(m_delegate), layerTreeHost()->layerRendererCapabilities().usingMapSub);
m_textureUpdater->setOpaque(opaque());
GC3Denum textureFormat = layerTreeHost()->layerRendererCapabilities().bestTextureFormat;
setTextureFormat(textureFormat);
setSampledTexelFormat(textureUpdater()->sampledTexelFormat(textureFormat));
}
void ContentLayerChromium::setOpaque(bool opaque)
{
LayerChromium::setOpaque(opaque);
if (m_textureUpdater)
m_textureUpdater->setOpaque(opaque);
}
}
#endif // USE(ACCELERATED_COMPOSITING)