2 Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
22 #if USE(UI_SIDE_COMPOSITING)
24 #include "WebLayerTreeRenderer.h"
26 #include "GraphicsLayerTextureMapper.h"
27 #include "LayerBackingStore.h"
28 #include "LayerTreeCoordinatorProxy.h"
29 #include "MessageID.h"
30 #include "ShareableBitmap.h"
31 #include "TextureMapper.h"
32 #include "TextureMapperBackingStore.h"
33 #include "TextureMapperGL.h"
34 #include "TextureMapperLayer.h"
35 #include "UpdateInfo.h"
36 #if !ENABLE(TIZEN_WEBKIT2_TILED_AC)
37 #include <OpenGLShims.h>
39 #include <WebCore/Logging.h>
40 #include <wtf/Atomics.h>
41 #include <wtf/MainThread.h>
43 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
44 #include "LayerTreeCoordinatorMessages.h"
45 #include "TextureMapperGL.h"
50 using namespace WebCore;
52 template<class T> class MainThreadGuardedInvoker {
54 static void call(PassRefPtr<T> objectToGuard, const Function<void()>& function)
56 MainThreadGuardedInvoker<T>* invoker = new MainThreadGuardedInvoker<T>(objectToGuard, function);
57 callOnMainThread(invoke, invoker);
61 MainThreadGuardedInvoker(PassRefPtr<T> object, const Function<void()>& newFunction)
62 : objectToGuard(object)
63 , function(newFunction)
67 RefPtr<T> objectToGuard;
68 Function<void()> function;
69 static void invoke(void* data)
71 MainThreadGuardedInvoker<T>* invoker = static_cast<MainThreadGuardedInvoker<T>*>(data);
77 void WebLayerTreeRenderer::callOnMainThread(const Function<void()>& function)
82 MainThreadGuardedInvoker<WebLayerTreeRenderer>::call(this, function);
85 static FloatPoint boundedScrollPosition(const FloatPoint& scrollPosition, const FloatRect& visibleContentRect, const FloatSize& contentSize)
87 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
88 float scrollPositionX = std::max(scrollPosition.x(), 0.0f);
89 scrollPositionX = std::min(scrollPositionX, contentSize.width());
91 float scrollPositionY = std::max(scrollPosition.y(), 0.0f);
92 scrollPositionY = std::min(scrollPositionY, contentSize.height());
94 // Prevent negative scroll position.
95 scrollPositionX = std::max(scrollPositionX, 0.0f);
96 scrollPositionY = std::max(scrollPositionY, 0.0f);
98 float scrollPositionX = std::max(scrollPosition.x(), 0.0f);
99 scrollPositionX = std::min(scrollPositionX, contentSize.width() - visibleContentRect.width());
101 float scrollPositionY = std::max(scrollPosition.y(), 0.0f);
102 scrollPositionY = std::min(scrollPositionY, contentSize.height() - visibleContentRect.height());
105 return FloatPoint(scrollPositionX, scrollPositionY);
108 WebLayerTreeRenderer::WebLayerTreeRenderer(LayerTreeCoordinatorProxy* layerTreeCoordinatorProxy)
110 , m_layerTreeCoordinatorProxy(layerTreeCoordinatorProxy)
111 , m_rootLayerID(InvalidWebLayerID)
113 , m_animationsLocked(false)
114 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
118 , m_updateViewportTimer(RunLoop::current(), this, &WebLayerTreeRenderer::updateViewportFired)
123 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
124 WebLayerTreeRenderer::WebLayerTreeRenderer(LayerTreeCoordinatorProxy* layerTreeCoordinatorProxy, DrawingAreaProxy* drawingAreaProxy, bool isGLMode)
126 , m_layerTreeCoordinatorProxy(layerTreeCoordinatorProxy)
127 , m_rootLayerID(InvalidWebLayerID)
129 , m_animationsLocked(false)
130 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
133 , m_drawingAreaProxy(drawingAreaProxy)
134 , m_isGLMode(isGLMode)
136 , m_updateViewportTimer(RunLoop::current(), this, &WebLayerTreeRenderer::updateViewportFired)
142 WebLayerTreeRenderer::~WebLayerTreeRenderer()
144 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
145 if (m_backupTexture && m_backupTexture->isValid()) {
146 m_backupTexture.release();
151 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
152 deleteAllValues(m_layers);
156 PassOwnPtr<GraphicsLayer> WebLayerTreeRenderer::createLayer(WebLayerID layerID)
158 GraphicsLayer* newLayer = new GraphicsLayerTextureMapper(this);
159 TextureMapperLayer* layer = toTextureMapperLayer(newLayer);
160 layer->setShouldUpdateBackingStoreFromLayer(false);
162 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
163 LOG(AcceleratedCompositing, "[UI ] create layer %u @WebLayerTreeRenderer::createLayer \n", layerID);
166 return adoptPtr(newLayer);
169 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
170 void WebLayerTreeRenderer::paintToBackupTexture(const TransformationMatrix& matrix, float opacity, const FloatRect& clipRect, const WebCore::Color& bgColor)
172 if (!m_textureMapper)
173 m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
174 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::OpenGLMode);
176 adjustPositionForFixedLayers();
177 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
178 adjustPositionForOverflowLayers();
181 GraphicsLayer* currentRootLayer = rootLayer();
182 if (!currentRootLayer)
185 TextureMapperLayer* layer = toTextureMapperLayer(currentRootLayer);
189 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
190 static_cast<TextureMapperGL*>(m_textureMapper.get())->setAngle(m_angle);
193 if (!m_backupTexture || m_backupTexture->size() != IntSize(clipRect.width(), clipRect.height()))
194 m_backupTexture = m_textureMapper->acquireTextureFromPool(IntSize(clipRect.width(), clipRect.height()));
196 layer->setTextureMapper(m_textureMapper.get());
197 if (!m_animationsLocked)
198 layer->applyAnimationsRecursively();
199 m_textureMapper->bindSurface(m_backupTexture.get());
200 m_textureMapper->beginPainting(0);
201 m_textureMapper->beginClip(TransformationMatrix(), clipRect);
203 if (currentRootLayer->opacity() != opacity || currentRootLayer->transform() != matrix) {
204 currentRootLayer->setOpacity(opacity);
205 currentRootLayer->setTransform(matrix);
206 currentRootLayer->syncCompositingStateForThisLayerOnly();
209 glClearColor(bgColor.red(), bgColor.green(), bgColor.blue(), bgColor.alpha());
210 glClear(GL_COLOR_BUFFER_BIT);
212 #if ENABLE(TIZEN_TEXTURE_MAPPER_CULLER)
213 layer->paintWithCuller(clipRect);
218 m_textureMapper->endClip();
219 m_textureMapper->endPainting();
220 m_textureMapper->unbindSurface();
222 if (layer->descendantsOrSelfHaveRunningAnimations()) {
224 m_updateViewportTimer.startOneShot(0);
226 callOnMainThread(bind(&WebLayerTreeRenderer::updateViewport, this));
232 void WebLayerTreeRenderer::paintToCurrentGLContext(const TransformationMatrix& matrix, float opacity, const FloatRect& clipRect, const WebCore::Color& backgroundColor, TextureMapper::PaintFlags PaintFlags)
234 if (!m_textureMapper)
235 m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
236 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::OpenGLMode);
238 adjustPositionForFixedLayers();
239 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
240 adjustPositionForOverflowLayers();
242 GraphicsLayer* currentRootLayer = rootLayer();
243 if (!currentRootLayer) {
244 #if ENABLE(TIZEN_SET_INITIAL_COLOR_OF_WEBVIEW_EVAS_IMAGE)
245 glClearColor(backgroundColor.red() / 255.0f, backgroundColor.green() / 255.0f, backgroundColor.blue() / 255.0f, backgroundColor.alpha() / 255.0f);
246 glClear(GL_COLOR_BUFFER_BIT);
251 TextureMapperLayer* layer = toTextureMapperLayer(currentRootLayer);
254 #if ENABLE(TIZEN_SET_INITIAL_COLOR_OF_WEBVIEW_EVAS_IMAGE)
255 glClearColor(backgroundColor.red() / 255.0f, backgroundColor.green() / 255.0f, backgroundColor.blue() / 255.0f, backgroundColor.alpha() / 255.0f);
256 glClear(GL_COLOR_BUFFER_BIT);
261 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
262 static_cast<TextureMapperGL*>(m_textureMapper.get())->setAngle(m_angle);
265 layer->setTextureMapper(m_textureMapper.get());
266 if (!m_animationsLocked)
267 layer->applyAnimationsRecursively();
268 m_textureMapper->beginPainting(PaintFlags);
269 m_textureMapper->beginClip(TransformationMatrix(), clipRect);
271 m_textureMapper->drawSolidColor(clipRect, TransformationMatrix(), backgroundColor);
273 if (currentRootLayer->opacity() != opacity || currentRootLayer->transform() != matrix) {
274 currentRootLayer->setOpacity(opacity);
275 currentRootLayer->setTransform(matrix);
276 currentRootLayer->syncCompositingStateForThisLayerOnly();
279 #if ENABLE(TIZEN_TEXTURE_MAPPER_CULLER)
280 layer->paintWithCuller(clipRect);
285 m_textureMapper->endClip();
286 m_textureMapper->endPainting();
287 if (layer->descendantsOrSelfHaveRunningAnimations()) {
289 m_updateViewportTimer.startOneShot(0);
291 callOnMainThread(bind(&WebLayerTreeRenderer::updateViewport, this));
296 #if PLATFORM(QT) || PLATFORM(EFL)
297 void WebLayerTreeRenderer::paintToGraphicsContext(BackingStore::PlatformGraphicsContext painter, const WebCore::Color& backgroundColor)
299 if (!m_textureMapper)
300 m_textureMapper = TextureMapper::create();
301 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::SoftwareMode);
303 TextureMapperLayer* layer = toTextureMapperLayer(rootLayer());
308 GraphicsContext graphicsContext(painter);
309 m_textureMapper->setGraphicsContext(&graphicsContext);
310 m_textureMapper->beginPainting();
311 m_textureMapper->drawSolidColor(graphicsContext.clipBounds(), TransformationMatrix(), backgroundColor);
313 m_textureMapper->endPainting();
314 m_textureMapper->setGraphicsContext(0);
318 void WebLayerTreeRenderer::setContentsSize(const WebCore::FloatSize& contentsSize)
320 m_contentsSize = contentsSize;
323 void WebLayerTreeRenderer::setVisibleContentsRect(const IntRect& rect, float scale, const WebCore::FloatPoint& accurateVisibleContentsPosition)
325 m_visibleContentsRect = rect;
326 m_contentsScale = scale;
327 m_accurateVisibleContentsPosition = accurateVisibleContentsPosition;
331 void WebLayerTreeRenderer::updateViewportFired()
333 callOnMainThread(bind(&WebLayerTreeRenderer::updateViewport, this));
337 void WebLayerTreeRenderer::updateViewport()
339 if (m_layerTreeCoordinatorProxy)
340 m_layerTreeCoordinatorProxy->updateViewport();
343 void WebLayerTreeRenderer::adjustPositionForFixedLayers()
345 if (m_fixedLayers.isEmpty())
348 // Fixed layer positions are updated by the web process when we update the visible contents rect / scroll position.
349 // If we want those layers to follow accurately the viewport when we move between the web process updates, we have to offset
350 // them by the delta between the current position and the position of the viewport used for the last layout.
351 FloatPoint scrollPosition = boundedScrollPosition(FloatPoint(m_accurateVisibleContentsPosition.x() / m_contentsScale, m_accurateVisibleContentsPosition.y() / m_contentsScale), m_visibleContentsRect, m_contentsSize);
352 FloatPoint renderedScrollPosition = boundedScrollPosition(m_renderedContentsScrollPosition, m_visibleContentsRect, m_contentsSize);
353 FloatSize delta = scrollPosition - renderedScrollPosition;
355 LayerMap::iterator end = m_fixedLayers.end();
356 for (LayerMap::iterator it = m_fixedLayers.begin(); it != end; ++it)
357 toTextureMapperLayer(it->second)->setScrollPositionDeltaIfNeeded(delta);
360 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
361 void WebLayerTreeRenderer::adjustPositionForOverflowLayers()
363 LayerMap::iterator end = m_scrollingContentsLayers.end();
364 for (LayerMap::iterator it = m_scrollingContentsLayers.begin(); it != end; ++it) {
365 GraphicsLayer* contentsLayer = it->second;
366 TextureMapperLayer* textureMapperLayer = contentsLayer ? toTextureMapperLayer(contentsLayer) : 0;
367 if (!textureMapperLayer)
370 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_SCROLLBAR)
371 const Vector<GraphicsLayer*>& childLayers = contentsLayer->children();
372 for (size_t i = 0; i < childLayers.size(); ++i)
373 if (childLayers[i]->isScrollbar())
374 toTextureMapperLayer(childLayers[i])->setScrollPositionDeltaIfNeeded(FloatSize(contentsLayer->boundsOrigin().x(), contentsLayer->boundsOrigin().y()));
376 textureMapperLayer->setScrollPositionDeltaIfNeeded(FloatSize(-contentsLayer->boundsOrigin().x(), -contentsLayer->boundsOrigin().y()));
380 bool WebLayerTreeRenderer::setOffset(const WebLayerID id, const FloatPoint& offset)
382 LayerMap::iterator it = m_scrollingContentsLayers.find(id);
383 if (it == m_scrollingContentsLayers.end())
386 GraphicsLayer* contentsLayer = it->second;
387 GraphicsLayer* scrollingLayer = contentsLayer ? contentsLayer->parent() : 0;
391 const IntSize contentLayerSize(contentsLayer->size().width(), contentsLayer->size().height());
392 const IntRect boundaryRect(FloatRect(scrollingLayer->position(), scrollingLayer->size()));
393 const IntRect visibleRect(FloatRect(contentsLayer->boundsOrigin(), scrollingLayer->size()));
395 IntRect newVisibleRect = visibleRect;
396 newVisibleRect.moveBy(flooredIntPoint(offset));
398 if (newVisibleRect.x() < boundaryRect.x())
399 newVisibleRect.setX(boundaryRect.x());
400 if (contentLayerSize.width() - newVisibleRect.x() < boundaryRect.maxX())
401 newVisibleRect.setX(contentLayerSize.width() - boundaryRect.width());
402 if (newVisibleRect.y() < boundaryRect.y())
403 newVisibleRect.setY(boundaryRect.y());
404 if (contentLayerSize.height() - newVisibleRect.y() < boundaryRect.maxY())
405 newVisibleRect.setY(contentLayerSize.height() - boundaryRect.height());
407 if (visibleRect == newVisibleRect)
410 contentsLayer->setBoundsOrigin(newVisibleRect.location());
412 m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeCoordinator::SetVisibleContentsRectAndTrajectoryVectorForLayer(id, visibleRect, offset), m_drawingAreaProxy->page()->pageID());
417 void WebLayerTreeRenderer::setVisibleContentsRectForScrollingContentsLayers(const WebCore::IntRect& visibleRect)
419 LayerMap::iterator end = m_scrollingContentsLayers.end();
420 for (LayerMap::iterator it = m_scrollingContentsLayers.begin(); it != end; ++it) {
421 GraphicsLayer* contentsLayer = it->second;
422 GraphicsLayer* scrollingLayer = contentsLayer ? contentsLayer->parent() : 0;
426 // FIXME: We might need to check if the each content layer is in viewport.
427 // Simply, we should find out a intersected rect between visibleRect and each scrollingLayer here.
428 const IntRect newVisibleRect(FloatRect(contentsLayer->boundsOrigin(), scrollingLayer->size()));
430 m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeCoordinator::SetVisibleContentsRectAndTrajectoryVectorForLayer(it->first, newVisibleRect, WebCore::FloatPoint()), m_drawingAreaProxy->page()->pageID());
435 void WebLayerTreeRenderer::didChangeScrollPosition(const IntPoint& position)
437 m_pendingRenderedContentsScrollPosition = position;
440 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
441 void WebLayerTreeRenderer::syncCanvas(WebLayerID id, const WebCore::IntSize& canvasSize, uint64_t graphicsSurfaceToken, uint32_t frontBuffer, int flags)
443 void WebLayerTreeRenderer::syncCanvas(WebLayerID id, const WebCore::IntSize& canvasSize, uint64_t graphicsSurfaceToken, uint32_t frontBuffer)
446 if (canvasSize.isEmpty() || !m_textureMapper)
449 #if USE(GRAPHICS_SURFACE) || ENABLE(TIZEN_CANVAS_GRAPHICS_SURFACE)
451 GraphicsLayer* layer = layerByID(id);
453 RefPtr<TextureMapperSurfaceBackingStore> canvasBackingStore;
454 SurfaceBackingStoreMap::iterator it = m_surfaceBackingStores.find(id);
455 if (it == m_surfaceBackingStores.end()) {
456 canvasBackingStore = TextureMapperSurfaceBackingStore::create();
457 m_surfaceBackingStores.set(id, canvasBackingStore);
459 canvasBackingStore = it->second;
461 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
462 canvasBackingStore->setGraphicsSurface(graphicsSurfaceToken, canvasSize, frontBuffer, flags);
464 canvasBackingStore->setGraphicsSurface(graphicsSurfaceToken, canvasSize, frontBuffer);
466 layer->setContentsToMedia(canvasBackingStore.get());
470 void WebLayerTreeRenderer::setLayerChildren(WebLayerID id, const Vector<WebLayerID>& childIDs)
473 LayerMap::iterator it = m_layers.find(id);
474 GraphicsLayer* layer = it->second;
475 Vector<GraphicsLayer*> children;
477 for (size_t i = 0; i < childIDs.size(); ++i) {
478 WebLayerID childID = childIDs[i];
479 GraphicsLayer* child = layerByID(childID);
481 child = createLayer(childID).leakPtr();
482 m_layers.add(childID, child);
484 children.append(child);
486 layer->setChildren(children);
489 #if ENABLE(CSS_FILTERS)
490 void WebLayerTreeRenderer::setLayerFilters(WebLayerID id, const FilterOperations& filters)
493 LayerMap::iterator it = m_layers.find(id);
494 ASSERT(it != m_layers.end());
496 GraphicsLayer* layer = it->second;
497 layer->setFilters(filters);
501 void WebLayerTreeRenderer::setLayerState(WebLayerID id, const WebLayerInfo& layerInfo)
504 LayerMap::iterator it = m_layers.find(id);
505 ASSERT(it != m_layers.end());
507 GraphicsLayer* layer = it->second;
509 layer->setReplicatedByLayer(layerByID(layerInfo.replica));
510 layer->setMaskLayer(layerByID(layerInfo.mask));
512 layer->setPosition(layerInfo.pos);
513 layer->setSize(layerInfo.size);
514 layer->setTransform(layerInfo.transform);
515 layer->setAnchorPoint(layerInfo.anchorPoint);
516 layer->setChildrenTransform(layerInfo.childrenTransform);
517 layer->setBackfaceVisibility(layerInfo.backfaceVisible);
518 layer->setContentsOpaque(layerInfo.contentsOpaque);
519 layer->setContentsRect(layerInfo.contentsRect);
520 layer->setContentsToBackgroundColor(layerInfo.backgroundColor);
521 layer->setDrawsContent(layerInfo.drawsContent);
522 layer->setContentsVisible(layerInfo.contentsVisible);
523 toGraphicsLayerTextureMapper(layer)->setFixedToViewport(layerInfo.fixedToViewport);
525 if (layerInfo.fixedToViewport)
526 m_fixedLayers.add(id, layer);
528 m_fixedLayers.remove(id);
530 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
531 if (layerInfo.isScrollingContentsLayer) {
532 LayerMap::iterator it = m_scrollingContentsLayers.find(id);
533 if (it == m_scrollingContentsLayers.end() || (layer->boundsOrigin() != layerInfo.boundsOrigin)) {
534 layer->setBoundsOrigin(layerInfo.boundsOrigin);
535 GraphicsLayer* scrollingLayer = layerByID(layerInfo.parent);
536 if (scrollingLayer) {
537 const IntRect newVisibleRect(FloatRect(layer->boundsOrigin(), scrollingLayer->size()));
538 m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeCoordinator::SetVisibleContentsRectAndTrajectoryVectorForLayer(id, newVisibleRect, WebCore::FloatPoint()), m_drawingAreaProxy->page()->pageID());
541 m_scrollingContentsLayers.add(id, layer);
544 m_scrollingContentsLayers.remove(id);
546 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_SCROLLBAR)
547 layer->setIsScrollbar(layerInfo.isScrollbar);
550 assignImageToLayer(layer, layerInfo.imageBackingStoreID);
552 // Never make the root layer clip.
553 layer->setMasksToBounds(layerInfo.isRootLayer ? false : layerInfo.masksToBounds);
554 layer->setOpacity(layerInfo.opacity);
555 layer->setPreserves3D(layerInfo.preserves3D);
556 if (layerInfo.isRootLayer && m_rootLayerID != id)
560 void WebLayerTreeRenderer::deleteLayer(WebLayerID layerID)
562 GraphicsLayer* layer = layerByID(layerID);
566 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
567 LOG(AcceleratedCompositing, "[UI ] delete layer %u @WebLayerTreeRenderer::deleteLayer \n", layerID);
570 layer->removeFromParent();
571 m_layers.remove(layerID);
572 m_fixedLayers.remove(layerID);
573 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
574 m_scrollingContentsLayers.remove(layerID);
576 #if USE(GRAPHICS_SURFACE) || ENABLE(TIZEN_CANVAS_GRAPHICS_SURFACE)
577 m_surfaceBackingStores.remove(layerID);
583 void WebLayerTreeRenderer::ensureLayer(WebLayerID id)
585 // We have to leak the new layer's pointer and manage it ourselves,
586 // because OwnPtr is not copyable.
587 if (m_layers.find(id) == m_layers.end())
588 m_layers.add(id, createLayer(id).leakPtr());
591 void WebLayerTreeRenderer::setRootLayerID(WebLayerID layerID)
593 if (layerID == m_rootLayerID)
596 m_rootLayerID = layerID;
598 m_rootLayer->removeAllChildren();
603 GraphicsLayer* layer = layerByID(layerID);
607 m_rootLayer->addChild(layer);
610 PassRefPtr<LayerBackingStore> WebLayerTreeRenderer::getBackingStore(WebLayerID id)
612 TextureMapperLayer* layer = toTextureMapperLayer(layerByID(id));
614 RefPtr<LayerBackingStore> backingStore = static_cast<LayerBackingStore*>(layer->backingStore().get());
616 backingStore = LayerBackingStore::create();
617 layer->setBackingStore(backingStore.get());
619 ASSERT(backingStore);
623 void WebLayerTreeRenderer::createTile(WebLayerID layerID, int tileID, float scale)
626 if (!layerByID(layerID))
630 getBackingStore(layerID)->createTile(tileID, scale);
633 void WebLayerTreeRenderer::removeBackingStoreIfNeeded(WebLayerID layerID)
635 TextureMapperLayer* layer = toTextureMapperLayer(layerByID(layerID));
637 RefPtr<LayerBackingStore> backingStore = static_cast<LayerBackingStore*>(layer->backingStore().get());
638 ASSERT(backingStore);
639 if (backingStore->isEmpty())
640 layer->setBackingStore(0);
643 void WebLayerTreeRenderer::removeTile(WebLayerID layerID, int tileID)
646 // Check whether composited graphics layer already been detached
647 GraphicsLayer* pGraphicsLayer = layerByID(layerID);
651 getBackingStore(layerID)->removeTile(tileID);
652 removeBackingStoreIfNeeded(layerID);
655 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
656 void WebLayerTreeRenderer::updateTileWithUpdateInfo(WebLayerID layerID, int tileID, const TileUpdate& update)
658 updateTile(layerID, tileID, update);
662 void WebLayerTreeRenderer::updateTile(WebLayerID layerID, int tileID, const TileUpdate& update)
665 if (!layerByID(layerID))
669 RefPtr<LayerBackingStore> backingStore = getBackingStore(layerID);
670 backingStore->updateTile(tileID, update.sourceRect, update.targetRect, update.surface, update.offset);
671 m_backingStoresWithPendingBuffers.add(backingStore);
674 void WebLayerTreeRenderer::createImage(int64_t imageID, PassRefPtr<ShareableBitmap> weakBitmap)
676 RefPtr<ShareableBitmap> bitmap = weakBitmap;
677 RefPtr<TextureMapperTiledBackingStore> backingStore = TextureMapperTiledBackingStore::create();
678 m_directlyCompositedImages.set(imageID, backingStore);
679 backingStore->updateContents(m_textureMapper.get(), bitmap->createImage().get());
682 void WebLayerTreeRenderer::destroyImage(int64_t imageID)
684 m_directlyCompositedImages.remove(imageID);
687 void WebLayerTreeRenderer::assignImageToLayer(GraphicsLayer* layer, int64_t imageID)
690 layer->setContentsToMedia(0);
694 HashMap<int64_t, RefPtr<TextureMapperBackingStore> >::iterator it = m_directlyCompositedImages.find(imageID);
695 ASSERT(it != m_directlyCompositedImages.end());
696 layer->setContentsToMedia(it->second.get());
699 void WebLayerTreeRenderer::commitTileOperations()
701 HashSet<RefPtr<LayerBackingStore> >::iterator end = m_backingStoresWithPendingBuffers.end();
702 for (HashSet<RefPtr<LayerBackingStore> >::iterator it = m_backingStoresWithPendingBuffers.begin(); it != end; ++it)
703 (*it)->commitTileOperations(m_textureMapper.get());
705 m_backingStoresWithPendingBuffers.clear();
708 void WebLayerTreeRenderer::flushLayerChanges()
710 m_renderedContentsScrollPosition = m_pendingRenderedContentsScrollPosition;
712 // Since the frame has now been rendered, we can safely unlock the animations until the next layout.
713 setAnimationsLocked(false);
715 m_rootLayer->syncCompositingState(FloatRect());
717 commitTileOperations();
719 // The pending tiles state is on its way for the screen, tell the web process to render the next one.
720 callOnMainThread(bind(&WebLayerTreeRenderer::renderNextFrame, this));
723 void WebLayerTreeRenderer::renderNextFrame()
725 if (m_layerTreeCoordinatorProxy)
726 m_layerTreeCoordinatorProxy->renderNextFrame();
729 void WebLayerTreeRenderer::ensureRootLayer()
734 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
735 createTextureMapper();
737 if (!m_textureMapper) {
738 m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
739 static_cast<TextureMapperGL*>(m_textureMapper.get())->setEnableEdgeDistanceAntialiasing(true);
743 m_rootLayer = createLayer(InvalidWebLayerID);
744 m_rootLayer->setMasksToBounds(false);
745 m_rootLayer->setDrawsContent(false);
746 m_rootLayer->setAnchorPoint(FloatPoint3D(0, 0, 0));
748 // The root layer should not have zero size, or it would be optimized out.
749 m_rootLayer->setSize(FloatSize(1.0, 1.0));
750 toTextureMapperLayer(m_rootLayer.get())->setTextureMapper(m_textureMapper.get());
753 void WebLayerTreeRenderer::syncRemoteContent()
755 // We enqueue messages and execute them during paint, as they require an active GL context.
758 for (size_t i = 0; i < m_renderQueue.size(); ++i)
761 m_renderQueue.clear();
764 void WebLayerTreeRenderer::purgeGLResources()
766 TextureMapperLayer* layer = toTextureMapperLayer(rootLayer());
769 layer->clearBackingStoresRecursive();
771 m_directlyCompositedImages.clear();
772 #if USE(GRAPHICS_SURFACE) || ENABLE(TIZEN_CANVAS_GRAPHICS_SURFACE)
773 m_surfaceBackingStores.clear();
776 m_rootLayer->removeAllChildren();
778 m_rootLayerID = InvalidWebLayerID;
780 m_fixedLayers.clear();
781 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
782 m_scrollingContentsLayers.clear();
784 m_textureMapper.clear();
785 m_backingStoresWithPendingBuffers.clear();
789 callOnMainThread(bind(&WebLayerTreeRenderer::purgeBackingStores, this));
792 void WebLayerTreeRenderer::setLayerAnimations(WebLayerID id, const GraphicsLayerAnimations& animations)
794 GraphicsLayerTextureMapper* layer = toGraphicsLayerTextureMapper(layerByID(id));
797 layer->setAnimations(animations);
800 void WebLayerTreeRenderer::setAnimationsLocked(bool locked)
802 m_animationsLocked = locked;
805 void WebLayerTreeRenderer::purgeBackingStores()
807 if (m_layerTreeCoordinatorProxy)
808 m_layerTreeCoordinatorProxy->purgeBackingStores();
811 void WebLayerTreeRenderer::detach()
813 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
814 m_renderQueue.clear();
816 m_layerTreeCoordinatorProxy = 0;
819 void WebLayerTreeRenderer::appendUpdate(const Function<void()>& function)
824 m_renderQueue.append(function);
827 void WebLayerTreeRenderer::setActive(bool active)
829 if (m_isActive == active)
832 // Have to clear render queue in both cases.
833 // If there are some updates in queue during activation then those updates are from previous instance of paint node
834 // and cannot be applied to the newly created instance.
835 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
838 m_renderQueue.clear();
842 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
843 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
844 void WebLayerTreeRenderer::platformLayerChanged(WebCore::GraphicsLayer*, WebCore::PlatformLayer* oldPlatformLayer, WebCore::PlatformLayer* newPlatformLayer)
851 void WebLayerTreeRenderer::clearBackingStores()
853 LayerMap::iterator end = m_layers.end();
854 for(LayerMap::iterator it = m_layers.begin(); it != end; ++it)
855 toTextureMapperLayer(it->second)->clearBackingStore();
857 m_directlyCompositedImages.clear();
858 m_backingStoresWithPendingBuffers.clear();
860 #endif // ENABLE(TIZEN_WEBKIT2_TILED_AC)
862 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
863 void WebLayerTreeRenderer::showBackupTexture(const TransformationMatrix& matrix, float opacity, const FloatRect& clipRect)
865 if (!m_textureMapper)
866 m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
867 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::OpenGLMode);
870 || !(m_backupTexture->isValid())
871 || m_backupTexture->size().width() != clipRect.width()
872 || m_backupTexture->size().height() != clipRect.height())
875 m_textureMapper->beginPainting(1);
876 m_textureMapper->beginClip(TransformationMatrix(), clipRect);
878 IntSize viewportSize(clipRect.width(), clipRect.height());
879 const BitmapTextureGL* textureGL = static_cast<const BitmapTextureGL*>(m_backupTexture.get());
880 m_textureMapper->drawTexture(textureGL->id(), 0, viewportSize, clipRect, matrix, 1.0, viewportSize, false);
882 m_textureMapper->endClip();
883 m_textureMapper->endPainting();
887 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
888 void WebLayerTreeRenderer::createTextureMapper()
890 if (!m_textureMapper)
891 m_textureMapper = m_isGLMode ? TextureMapper::create(TextureMapper::OpenGLMode) : TextureMapper::create();
894 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::OpenGLMode);
896 ASSERT(m_textureMapper->accelerationMode() == TextureMapper::SoftwareMode);
900 } // namespace WebKit
902 #endif // USE(UI_SIDE_COMPOSITING)