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