1 /*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <SkCanvas.h>
18 #include <algorithm>
19
20 #include <utils/Trace.h>
21
22 #include "Debug.h"
23 #include "DisplayList.h"
24 #include "RenderNode.h"
25
26 #if HWUI_NEW_OPS
27 #include "RecordedOp.h"
28 #else
29 #include "DisplayListOp.h"
30 #endif
31
32 namespace android {
33 namespace uirenderer {
34
DisplayList()35 DisplayList::DisplayList()
36 : projectionReceiveIndex(-1)
37 , stdAllocator(allocator)
38 , chunks(stdAllocator)
39 , ops(stdAllocator)
40 , children(stdAllocator)
41 , bitmapResources(stdAllocator)
42 , pathResources(stdAllocator)
43 , patchResources(stdAllocator)
44 , paints(stdAllocator)
45 , regions(stdAllocator)
46 , referenceHolders(stdAllocator)
47 , functors(stdAllocator)
48 , pushStagingFunctors(stdAllocator)
49 , hasDrawOps(false) {
50 }
51
~DisplayList()52 DisplayList::~DisplayList() {
53 cleanupResources();
54 }
55
cleanupResources()56 void DisplayList::cleanupResources() {
57 if (CC_UNLIKELY(patchResources.size())) {
58 ResourceCache& resourceCache = ResourceCache::getInstance();
59 resourceCache.lock();
60
61 for (size_t i = 0; i < patchResources.size(); i++) {
62 resourceCache.decrementRefcountLocked(patchResources[i]);
63 }
64
65 resourceCache.unlock();
66 }
67
68 for (size_t i = 0; i < pathResources.size(); i++) {
69 const SkPath* path = pathResources[i];
70 if (path->unique() && Caches::hasInstance()) {
71 Caches::getInstance().pathCache.removeDeferred(path);
72 }
73 delete path;
74 }
75
76 for (auto& iter : functors) {
77 if (iter.listener) {
78 iter.listener->onGlFunctorReleased(iter.functor);
79 }
80 }
81
82 patchResources.clear();
83 pathResources.clear();
84 paints.clear();
85 regions.clear();
86 }
87
addChild(NodeOpType * op)88 size_t DisplayList::addChild(NodeOpType* op) {
89 referenceHolders.push_back(op->renderNode);
90 size_t index = children.size();
91 children.push_back(op);
92 return index;
93 }
94
95 }; // namespace uirenderer
96 }; // namespace android
97