10776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/* 20776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Copyright (C) 2013 The Android Open Source Project 30776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * 40776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 50776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * you may not use this file except in compliance with the License. 60776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * You may obtain a copy of the License at 70776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * 80776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 90776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * 100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Unless required by applicable law or agreed to in writing, software 110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * See the License for the specific language governing permissions and 140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * limitations under the License. 150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */ 160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik 17c46d07a29e94807e768f8b162ce9f77a88ba6f46Romain Guy#include <SkCanvas.h> 189f68c096263b36f59c383435e587bd8bd279af34Chris Craik#include <algorithm> 19c46d07a29e94807e768f8b162ce9f77a88ba6f46Romain Guy 20f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik#include <utils/Trace.h> 21f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 22c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "Debug.h" 230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "DisplayList.h" 24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "RenderNode.h" 25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if HWUI_NEW_OPS 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "RecordedOp.h" 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#else 290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "DisplayListOp.h" 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik 320776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace android { 330776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace uirenderer { 340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik 35003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris CraikDisplayList::DisplayList() 363f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik : projectionReceiveIndex(-1) 37b36af87f8275f4b982906f88193ec27600f2746aChris Craik , stdAllocator(allocator) 38b36af87f8275f4b982906f88193ec27600f2746aChris Craik , chunks(stdAllocator) 39b36af87f8275f4b982906f88193ec27600f2746aChris Craik , ops(stdAllocator) 40b36af87f8275f4b982906f88193ec27600f2746aChris Craik , children(stdAllocator) 41b36af87f8275f4b982906f88193ec27600f2746aChris Craik , bitmapResources(stdAllocator) 42b36af87f8275f4b982906f88193ec27600f2746aChris Craik , pathResources(stdAllocator) 43b36af87f8275f4b982906f88193ec27600f2746aChris Craik , patchResources(stdAllocator) 44b36af87f8275f4b982906f88193ec27600f2746aChris Craik , paints(stdAllocator) 45b36af87f8275f4b982906f88193ec27600f2746aChris Craik , regions(stdAllocator) 46b36af87f8275f4b982906f88193ec27600f2746aChris Craik , referenceHolders(stdAllocator) 47b36af87f8275f4b982906f88193ec27600f2746aChris Craik , functors(stdAllocator) 481d8e194661085f9a18ab1b3cd12f9e19d3a86be5Doris Liu , pushStagingFunctors(stdAllocator) 493f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik , hasDrawOps(false) { 50087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck} 51087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck 52003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris CraikDisplayList::~DisplayList() { 53087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck cleanupResources(); 54087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck} 55087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck 56003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craikvoid DisplayList::cleanupResources() { 574a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck if (CC_UNLIKELY(patchResources.size())) { 584a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck ResourceCache& resourceCache = ResourceCache::getInstance(); 594a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck resourceCache.lock(); 6044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 614a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck for (size_t i = 0; i < patchResources.size(); i++) { 624a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck resourceCache.decrementRefcountLocked(patchResources[i]); 634a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck } 6444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 654a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck resourceCache.unlock(); 664a4bc892e826849bd58606d99408f1bfbceddc3bJohn Reck } 6744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 68ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger for (size_t i = 0; i < pathResources.size(); i++) { 69272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck const SkPath* path = pathResources[i]; 70ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger if (path->unique() && Caches::hasInstance()) { 71ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger Caches::getInstance().pathCache.removeDeferred(path); 72ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger } 73ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger delete path; 74ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger } 75ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger 76cd1c3eba69d044b551cededad75474038f919890John Reck for (auto& iter : functors) { 77cd1c3eba69d044b551cededad75474038f919890John Reck if (iter.listener) { 78cd1c3eba69d044b551cededad75474038f919890John Reck iter.listener->onGlFunctorReleased(iter.functor); 79cd1c3eba69d044b551cededad75474038f919890John Reck } 80cd1c3eba69d044b551cededad75474038f919890John Reck } 81cd1c3eba69d044b551cededad75474038f919890John Reck 8244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck patchResources.clear(); 83ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger pathResources.clear(); 8444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck paints.clear(); 8544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck regions.clear(); 8644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck} 8744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 88003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craiksize_t DisplayList::addChild(NodeOpType* op) { 89b36af87f8275f4b982906f88193ec27600f2746aChris Craik referenceHolders.push_back(op->renderNode); 90b36af87f8275f4b982906f88193ec27600f2746aChris Craik size_t index = children.size(); 91b36af87f8275f4b982906f88193ec27600f2746aChris Craik children.push_back(op); 92272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck return index; 93087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck} 94087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck 950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace uirenderer 960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace android 97