OpenGLPipeline.cpp revision daf7229047c44947b9b02ee187fe5b13f30ebd4b
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" 21de97307362c26b64e2376b21ccde8414088cdc8bMatt Sarett#include "ProfileRenderer.h" 22768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "renderstate/RenderState.h" 23768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include "Readback.h" 24768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 25768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <android/native_window.h> 26768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <cutils/properties.h> 27768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#include <strings.h> 28768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 29768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace android { 30768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace uirenderer { 31768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievnamespace renderthread { 32768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 33768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievOpenGLPipeline::OpenGLPipeline(RenderThread& thread) 34768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev : mEglManager(thread.eglManager()), mRenderThread(thread) { 35768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 36768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 37768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievMakeCurrentResult OpenGLPipeline::makeCurrent() { 38768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // TODO: Figure out why this workaround is needed, see b/13913604 39768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // In the meantime this matches the behavior of GLRenderer, so it is not a regression 40768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev EGLint error = 0; 41768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev bool haveNewSurface = mEglManager.makeCurrent(mEglSurface, &error); 42768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 43768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev Caches::getInstance().textureCache.resetMarkInUse(this); 44768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (!haveNewSurface) { 45768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return MakeCurrentResult::AlreadyCurrent; 46768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 47768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return error ? MakeCurrentResult::Failed : MakeCurrentResult::Succeeded; 48768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 49768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 50768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievFrame OpenGLPipeline::getFrame() { 51768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE, 52768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev "drawRenderNode called on a context with no surface!"); 53768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return mEglManager.beginFrame(mEglSurface); 54768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 55768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 56768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, 57768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const FrameBuilder::LightGeometry& lightGeometry, 58768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LayerUpdateQueue* layerUpdateQueue, 59768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const Rect& contentDrawBounds, bool opaque, 60768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const BakedOpRenderer::LightInfo& lightInfo, 61768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const std::vector< sp<RenderNode> >& renderNodes, 62768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameInfoVisualizer* profiler) { 63768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 64768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.damageFrame(frame, dirty); 65768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 66768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev bool drew = false; 67768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 68768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 69768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev auto& caches = Caches::getInstance(); 70768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameBuilder frameBuilder(dirty, frame.width(), frame.height(), lightGeometry, caches); 71768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 72768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.deferLayers(*layerUpdateQueue); 73768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layerUpdateQueue->clear(); 74768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 75768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.deferRenderNodeScene(renderNodes, contentDrawBounds); 76768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 77768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev BakedOpRenderer renderer(caches, mRenderThread.renderState(), 78768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev opaque, lightInfo); 79768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 80de97307362c26b64e2376b21ccde8414088cdc8bMatt Sarett ProfileRenderer profileRenderer(renderer); 81de97307362c26b64e2376b21ccde8414088cdc8bMatt Sarett profiler->draw(profileRenderer); 82768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev drew = renderer.didDraw(); 83768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 84768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // post frame cleanup 85768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.clearGarbage(); 86768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.pathCache.trim(); 87768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.tessellationCache.trim(); 88768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 89768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#if DEBUG_MEMORY_USAGE 90768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mCaches.dumpMemoryUsage(); 91768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#else 92768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (CC_UNLIKELY(Properties::debugLevel & kDebugMemory)) { 93768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev caches.dumpMemoryUsage(); 94768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 95768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev#endif 96768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 97768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return drew; 98768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 99768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 100768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, 101768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameInfo* currentFrameInfo, bool* requireSwap) { 102768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 103768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev GL_CHECKPOINT(LOW); 104768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 105768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // Even if we decided to cancel the frame, from the perspective of jank 106768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev // metrics the frame was swapped at this point 107768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev currentFrameInfo->markSwapBuffers(); 108768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 109768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev *requireSwap = drew || mEglManager.damageRequiresSwap(); 110768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 111768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (*requireSwap && (CC_UNLIKELY(!mEglManager.swapBuffers(frame, screenDirty)))) { 112768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return false; 113768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 114768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 115768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return *requireSwap; 116768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 117768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 118768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { 119768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layer->apply(); 120768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return Readback::copyTextureLayerInto(mRenderThread, *(layer->backingLayer()), bitmap) 121768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev == CopyResult::Success; 122768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 123768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 12456ad6ec42f814e9e61030ff819cac4e5d31def8bDerek SollenbergerDeferredLayerUpdater* OpenGLPipeline::createTextureLayer() { 125768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.initialize(); 12656ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger Layer* layer = new Layer(mRenderThread.renderState(), 0, 0); 12756ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger Caches::getInstance().textureState().activateTexture(0); 12856ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger layer->generateTexture(); 12956ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger 13056ad6ec42f814e9e61030ff819cac4e5d31def8bDerek Sollenberger return new DeferredLayerUpdater(layer); 131768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 132768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 133768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::onStop() { 134768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglManager.isCurrent(mEglSurface)) { 135768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.makeCurrent(EGL_NO_SURFACE); 136768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 137768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 138768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 139768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior) { 140768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 141768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglSurface != EGL_NO_SURFACE) { 142768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglManager.destroySurface(mEglSurface); 143768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglSurface = EGL_NO_SURFACE; 144768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 145768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 146768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (surface) { 147768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mEglSurface = mEglManager.createSurface(surface); 148768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 149768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 150768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev if (mEglSurface != EGL_NO_SURFACE) { 151768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const bool preserveBuffer = (swapBehavior != SwapBehavior::kSwap_discardBuffer); 152768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer); 153768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return true; 154768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev } 155768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 156768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return false; 157768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 158768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 159768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::isSurfaceReady() { 160768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return CC_UNLIKELY(mEglSurface != EGL_NO_SURFACE); 161768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 162768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 163768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievbool OpenGLPipeline::isContextReady() { 164768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return CC_LIKELY(mEglManager.hasEglContext()); 165768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 166768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 167768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::onDestroyHardwareResources() { 168daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger Caches& caches = Caches::getInstance(); 169daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger // Make sure to release all the textures we were owning as there won't 170daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger // be another draw 171daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger caches.textureCache.resetMarkInUse(this); 172768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev mRenderThread.renderState().flush(Caches::FlushMode::Layers); 173768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 174768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 175768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Ilievvoid OpenGLPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry, 176768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LayerUpdateQueue* layerUpdateQueue, bool opaque, 177768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev const BakedOpRenderer::LightInfo& lightInfo) { 178768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev static const std::vector< sp<RenderNode> > emptyNodeList; 179768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev auto& caches = Caches::getInstance(); 180768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev FrameBuilder frameBuilder(*layerUpdateQueue, lightGeometry, caches); 181768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev layerUpdateQueue->clear(); 182768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev BakedOpRenderer renderer(caches, mRenderThread.renderState(), 183768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev opaque, lightInfo); 184768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev LOG_ALWAYS_FATAL_IF(renderer.didDraw(), "shouldn't draw in buildlayer case"); 185768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer); 186768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 187768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 188768e39335b668e8ef25fef30ab42b2d6d29a4735Stan IlievTaskManager* OpenGLPipeline::getTaskManager() { 189768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev return &Caches::getInstance().tasks; 190768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} 191768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev 1926a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergerstatic bool layerMatchesWH(OffscreenBuffer* layer, int width, int height) { 1936a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger return layer->viewportWidth == (uint32_t)width && layer->viewportHeight == (uint32_t)height; 1946a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 1956a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 1966a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergerbool OpenGLPipeline::createOrUpdateLayer(RenderNode* node, 1976a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger const DamageAccumulator& damageAccumulator) { 1986a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger RenderState& renderState = mRenderThread.renderState(); 1996a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger OffscreenBufferPool& layerPool = renderState.layerPool(); 2006a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger bool transformUpdateNeeded = false; 2016a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (node->getLayer() == nullptr) { 2026a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(layerPool.get(renderState, node->getWidth(), node->getHeight())); 2036a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger transformUpdateNeeded = true; 2046a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } else if (!layerMatchesWH(node->getLayer(), node->getWidth(), node->getHeight())) { 2056a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // TODO: remove now irrelevant, currently enqueued damage (respecting damage ordering) 2066a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // Or, ideally, maintain damage between frames on node/layer so ordering is always correct 2076a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (node->properties().fitsOnLayer()) { 2086a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(layerPool.resize(node->getLayer(), node->getWidth(), node->getHeight())); 2096a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } else { 2106a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger destroyLayer(node); 2116a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2126a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger transformUpdateNeeded = true; 2136a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2146a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2156a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (transformUpdateNeeded && node->getLayer()) { 2166a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger // update the transform in window of the layer to reset its origin wrt light source position 2176a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger Matrix4 windowTransform; 2186a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger damageAccumulator.computeCurrentTransform(&windowTransform); 2196a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->getLayer()->setWindowTransform(windowTransform); 2206a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2216a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2226a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger return transformUpdateNeeded; 2236a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 2246a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 2256a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenbergervoid OpenGLPipeline::destroyLayer(RenderNode* node) { 2266a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger if (OffscreenBuffer* layer = node->getLayer()) { 2276a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger layer->renderState.layerPool().putOrDelete(layer); 2286a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger node->setLayer(nullptr); 2296a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger } 2306a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger} 2316a21ca5a4c6b62ae277ae6dcb14bc187460321a0Derek Sollenberger 232daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenbergervoid OpenGLPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) { 233daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger if (Caches::hasInstance() && thread.eglManager().hasEglContext()) { 234daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger ATRACE_NAME("Bitmap#prepareToDraw task"); 235daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger Caches::getInstance().textureCache.prefetch(bitmap); 236daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger } 237daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger} 238daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger 239daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenbergervoid OpenGLPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) { 240daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext; 241daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger if (thread.eglManager().hasEglContext()) { 242daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger mode = DrawGlInfo::kModeProcess; 243daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger } 244daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger thread.renderState().invokeFunctor(functor, mode, nullptr); 245daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger} 246daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger 247768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace renderthread */ 248768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace uirenderer */ 249768e39335b668e8ef25fef30ab42b2d6d29a4735Stan Iliev} /* namespace android */ 250