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