OpenGLPipeline.cpp revision 6a21ca5a4c6b62ae277ae6dcb14bc187460321a0
1768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev/* 2768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * Copyright (C) 2016 The Android Open Source Project 3768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * 4768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * Licensed under the Apache License, Version 2.0 (the "License"); 5768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * you may not use this file except in compliance with the License. 6768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * You may obtain a copy of the License at 7768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * 8768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * http://www.apache.org/licenses/LICENSE-2.0 9768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * 10768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * Unless required by applicable law or agreed to in writing, software 11768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * distributed under the License is distributed on an "AS IS" BASIS, 12768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * See the License for the specific language governing permissions and 14768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev * limitations under the License. 15768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev */ 16768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 17768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "OpenGLPipeline.h" 18768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 19768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "DeferredLayerUpdater.h" 20768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "EglManager.h" 21768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "renderstate/RenderState.h" 22768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "Readback.h" 23768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 24768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <android/native_window.h> 25768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <cutils/properties.h> 26768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <strings.h> 27768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 28768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace android { 29768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace uirenderer { 30768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace renderthread { 31768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 32768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievOpenGLPipeline::OpenGLPipeline(RenderThread& thread) 33768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev : mEglManager(thread.eglManager()), mRenderThread(thread) { 34768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 35768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 36768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievMakeCurrentResult OpenGLPipeline::makeCurrent() { 37768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // TODO: Figure out why this workaround is needed, see b/13913604 38768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // In the meantime this matches the behavior of GLRenderer, so it is not a regression 39768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev EGLint error = 0; 40768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev bool haveNewSurface = mEglManager.makeCurrent(mEglSurface, &error); 41768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 42768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev Caches::getInstance().textureCache.resetMarkInUse(this); 43768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (!haveNewSurface) { 44768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return MakeCurrentResult::AlreadyCurrent; 45768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 46768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return error ? MakeCurrentResult::Failed : MakeCurrentResult::Succeeded; 47768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 48768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 49768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievFrame OpenGLPipeline::getFrame() { 50768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE, 51768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev "drawRenderNode called on a context with no surface!"); 52768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return mEglManager.beginFrame(mEglSurface); 53768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 54768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 55768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, 56768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const FrameBuilder::LightGeometry& lightGeometry, 57768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LayerUpdateQueue* layerUpdateQueue, 58768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const Rect& contentDrawBounds, bool opaque, 59768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const BakedOpRenderer::LightInfo& lightInfo, 60768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const std::vector< sp<RenderNode> >& renderNodes, 61768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameInfoVisualizer* profiler) { 62768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 63768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.damageFrame(frame, dirty); 64768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 65768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev bool drew = false; 66768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 67768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 68768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev auto& caches = Caches::getInstance(); 69768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameBuilder frameBuilder(dirty, frame.width(), frame.height(), lightGeometry, caches); 70768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 71768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.deferLayers(*layerUpdateQueue); 72768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layerUpdateQueue->clear(); 73768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 74768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.deferRenderNodeScene(renderNodes, contentDrawBounds); 75768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 76768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev BakedOpRenderer renderer(caches, mRenderThread.renderState(), 77768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev opaque, lightInfo); 78768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 79768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev profiler->draw(&renderer); 80768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev drew = renderer.didDraw(); 81768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 82768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // post frame cleanup 83768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.clearGarbage(); 84768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.pathCache.trim(); 85768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.tessellationCache.trim(); 86768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 87768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#if DEBUG_MEMORY_USAGE 88768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mCaches.dumpMemoryUsage(); 89768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#else 90768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (CC_UNLIKELY(Properties::debugLevel & kDebugMemory)) { 91768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.dumpMemoryUsage(); 92768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 93768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#endif 94768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 95768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return drew; 96768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 97768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 98768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, 99768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameInfo* currentFrameInfo, bool* requireSwap) { 100768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 101768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev GL_CHECKPOINT(LOW); 102768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 103768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // Even if we decided to cancel the frame, from the perspective of jank 104768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // metrics the frame was swapped at this point 105768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev currentFrameInfo->markSwapBuffers(); 106768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 107768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev *requireSwap = drew || mEglManager.damageRequiresSwap(); 108768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 109768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (*requireSwap && (CC_UNLIKELY(!mEglManager.swapBuffers(frame, screenDirty)))) { 110768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return false; 111768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 112768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 113768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return *requireSwap; 114768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 115768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 116768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { 117768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layer->apply(); 118768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return Readback::copyTextureLayerInto(mRenderThread, *(layer->backingLayer()), bitmap) 119768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev == CopyResult::Success; 120768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 121768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 12256ad6ec42f814e9e61030ff819cac4e5d31def8bDerek SollenbergerDeferredLayerUpdater* OpenGLPipeline::createTextureLayer() { 123768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.initialize(); 12456ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger Layer* layer = new Layer(mRenderThread.renderState(), 0, 0); 12556ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger Caches::getInstance().textureState().activateTexture(0); 12656ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger layer->generateTexture(); 12756ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger 12856ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger return new DeferredLayerUpdater(layer); 129768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 130768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 131768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::onStop() { 132768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglManager.isCurrent(mEglSurface)) { 133768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.makeCurrent(EGL_NO_SURFACE); 134768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 135768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 136768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 137768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior) { 138768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 139768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglSurface != EGL_NO_SURFACE) { 140768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.destroySurface(mEglSurface); 141768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglSurface = EGL_NO_SURFACE; 142768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 143768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 144768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (surface) { 145768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglSurface = mEglManager.createSurface(surface); 146768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 147768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 148768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglSurface != EGL_NO_SURFACE) { 149768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const bool preserveBuffer = (swapBehavior != SwapBehavior::kSwap_discardBuffer); 150768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer); 151768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return true; 152768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 153768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 154768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return false; 155768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 156768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 157768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::isSurfaceReady() { 158768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return CC_UNLIKELY(mEglSurface != EGL_NO_SURFACE); 159768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 160768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 161768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::isContextReady() { 162768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return CC_LIKELY(mEglManager.hasEglContext()); 163768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 164768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 165768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::onDestroyHardwareResources() { 166768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mRenderThread.renderState().flush(Caches::FlushMode::Layers); 167768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 168768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 169768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry, 170768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LayerUpdateQueue* layerUpdateQueue, bool opaque, 171768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const BakedOpRenderer::LightInfo& lightInfo) { 172768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev static const std::vector< sp<RenderNode> > emptyNodeList; 173768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev auto& caches = Caches::getInstance(); 174768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameBuilder frameBuilder(*layerUpdateQueue, lightGeometry, caches); 175768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layerUpdateQueue->clear(); 176768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev BakedOpRenderer renderer(caches, mRenderThread.renderState(), 177768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev opaque, lightInfo); 178768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LOG_ALWAYS_FATAL_IF(renderer.didDraw(), "shouldn't draw in buildlayer case"); 179768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 180768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 181768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 182768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievTaskManager* OpenGLPipeline::getTaskManager() { 183768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return &Caches::getInstance().tasks; 184768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 185768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 1866a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergerstatic bool layerMatchesWH(OffscreenBuffer* layer, int width, int height) { 1876a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger return layer->viewportWidth == (uint32_t)width && layer->viewportHeight == (uint32_t)height; 1886a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 1896a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 1906a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergerbool OpenGLPipeline::createOrUpdateLayer(RenderNode* node, 1916a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger const DamageAccumulator& damageAccumulator) { 1926a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger RenderState& renderState = mRenderThread.renderState(); 1936a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger OffscreenBufferPool& layerPool = renderState.layerPool(); 1946a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger bool transformUpdateNeeded = false; 1956a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (node->getLayer() == nullptr) { 1966a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(layerPool.get(renderState, node->getWidth(), node->getHeight())); 1976a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger transformUpdateNeeded = true; 1986a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } else if (!layerMatchesWH(node->getLayer(), node->getWidth(), node->getHeight())) { 1996a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // TODO: remove now irrelevant, currently enqueued damage (respecting damage ordering) 2006a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // Or, ideally, maintain damage between frames on node/layer so ordering is always correct 2016a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (node->properties().fitsOnLayer()) { 2026a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(layerPool.resize(node->getLayer(), node->getWidth(), node->getHeight())); 2036a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } else { 2046a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger destroyLayer(node); 2056a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2066a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger transformUpdateNeeded = true; 2076a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2086a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2096a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (transformUpdateNeeded && node->getLayer()) { 2106a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // update the transform in window of the layer to reset its origin wrt light source position 2116a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger Matrix4 windowTransform; 2126a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger damageAccumulator.computeCurrentTransform(&windowTransform); 2136a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->getLayer()->setWindowTransform(windowTransform); 2146a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2156a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2166a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger return transformUpdateNeeded; 2176a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 2186a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2196a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergervoid OpenGLPipeline::destroyLayer(RenderNode* node) { 2206a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (OffscreenBuffer* layer = node->getLayer()) { 2216a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger layer->renderState.layerPool().putOrDelete(layer); 2226a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(nullptr); 2236a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2246a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 2256a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 226768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace renderthread */ 227768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace uirenderer */ 228768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace android */ 229