blob: 273c3f56f2cdadb36b5137c4ce3fca5fe0766462 [file] [log] [blame]
Romain Guyf7f93552010-07-08 19:17:03 -07001/*
2 * Copyright (C) 2010 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
Chris Craik5e00c7c2016-07-06 16:10:09 -070017#pragma once
Romain Guyf7f93552010-07-08 19:17:03 -070018
Romain Guy3b748a42013-04-17 18:54:38 -070019#include <GLES2/gl2.h>
Romain Guy2728f962010-10-08 18:36:15 -070020
Romain Guy3b748a42013-04-17 18:54:38 -070021#include <utils/LruCache.h>
22
23#include <androidfw/ResourceTypes.h>
24
Romain Guyc15008e2010-11-10 11:59:15 -080025#include "Debug.h"
Romain Guye3b0a012013-06-26 15:45:41 -070026#include "utils/Pair.h"
Romain Guyf7f93552010-07-08 19:17:03 -070027
28namespace android {
29namespace uirenderer {
30
Tom Hudson2dc236b2014-10-15 15:46:42 -040031class Patch;
32
Romain Guyf7f93552010-07-08 19:17:03 -070033///////////////////////////////////////////////////////////////////////////////
34// Defines
35///////////////////////////////////////////////////////////////////////////////
36
37// Debug
Romain Guyf7f93552010-07-08 19:17:03 -070038#if DEBUG_PATCHES
John Reck1bcacfd2017-11-03 10:12:19 -070039#define PATCH_LOGD(...) ALOGD(__VA_ARGS__)
Romain Guyf7f93552010-07-08 19:17:03 -070040#else
John Reck1bcacfd2017-11-03 10:12:19 -070041#define PATCH_LOGD(...)
Romain Guyf7f93552010-07-08 19:17:03 -070042#endif
43
44///////////////////////////////////////////////////////////////////////////////
45// Cache
46///////////////////////////////////////////////////////////////////////////////
47
Romain Guy3b748a42013-04-17 18:54:38 -070048class Caches;
Chris Craik5e00c7c2016-07-06 16:10:09 -070049class RenderState;
Romain Guy3b748a42013-04-17 18:54:38 -070050
Romain Guy2728f962010-10-08 18:36:15 -070051class PatchCache {
Romain Guyf7f93552010-07-08 19:17:03 -070052public:
Chih-Hung Hsiehfaecb782016-07-21 11:23:06 -070053 explicit PatchCache(RenderState& renderState);
Romain Guyf7f93552010-07-08 19:17:03 -070054 ~PatchCache();
55
Romain Guy253f2c22016-09-28 17:34:42 -070056 const Patch* get(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
John Reck1bcacfd2017-11-03 10:12:19 -070057 const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch);
Romain Guyf7f93552010-07-08 19:17:03 -070058 void clear();
59
John Reck1bcacfd2017-11-03 10:12:19 -070060 uint32_t getSize() const { return mSize; }
Romain Guyc15008e2010-11-10 11:59:15 -080061
John Reck1bcacfd2017-11-03 10:12:19 -070062 uint32_t getMaxSize() const { return mMaxSize; }
Romain Guy3b748a42013-04-17 18:54:38 -070063
John Reck1bcacfd2017-11-03 10:12:19 -070064 GLuint getMeshBuffer() const { return mMeshBuffer; }
Romain Guyc15008e2010-11-10 11:59:15 -080065
Romain Guye3b0a012013-06-26 15:45:41 -070066 /**
67 * Removes the entries associated with the specified 9-patch. This is meant
68 * to be called from threads that are not the EGL context thread (GC thread
69 * on the VM side for instance.)
70 */
71 void removeDeferred(Res_png_9patch* patch);
Romain Guy3b748a42013-04-17 18:54:38 -070072
Romain Guye3b0a012013-06-26 15:45:41 -070073 /**
74 * Process deferred removals.
75 */
76 void clearGarbage();
77
Romain Guye3b0a012013-06-26 15:45:41 -070078private:
Romain Guy6f72beb2010-11-30 12:04:14 -080079 struct PatchDescription {
John Reck1bcacfd2017-11-03 10:12:19 -070080 PatchDescription()
81 : mPatch(nullptr)
82 , mBitmapWidth(0)
83 , mBitmapHeight(0)
84 , mPixelWidth(0)
85 , mPixelHeight(0) {}
Romain Guy6f72beb2010-11-30 12:04:14 -080086
Romain Guy13ba0052013-02-15 12:47:26 -080087 PatchDescription(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
John Reck1bcacfd2017-11-03 10:12:19 -070088 const float pixelWidth, const float pixelHeight,
89 const Res_png_9patch* patch)
90 : mPatch(patch)
91 , mBitmapWidth(bitmapWidth)
92 , mBitmapHeight(bitmapHeight)
93 , mPixelWidth(pixelWidth)
94 , mPixelHeight(pixelHeight) {}
Romain Guy6f72beb2010-11-30 12:04:14 -080095
Romain Guy3b748a42013-04-17 18:54:38 -070096 hash_t hash() const;
97
Romain Guye3b0a012013-06-26 15:45:41 -070098 const Res_png_9patch* getPatch() const { return mPatch; }
99
Romain Guy13ba0052013-02-15 12:47:26 -0800100 static int compare(const PatchDescription& lhs, const PatchDescription& rhs);
101
John Reck1bcacfd2017-11-03 10:12:19 -0700102 bool operator==(const PatchDescription& other) const { return compare(*this, other) == 0; }
Romain Guy13ba0052013-02-15 12:47:26 -0800103
John Reck1bcacfd2017-11-03 10:12:19 -0700104 bool operator!=(const PatchDescription& other) const { return compare(*this, other) != 0; }
Romain Guy13ba0052013-02-15 12:47:26 -0800105
106 friend inline int strictly_order_type(const PatchDescription& lhs,
John Reck1bcacfd2017-11-03 10:12:19 -0700107 const PatchDescription& rhs) {
Romain Guy13ba0052013-02-15 12:47:26 -0800108 return PatchDescription::compare(lhs, rhs) < 0;
109 }
110
John Reck1bcacfd2017-11-03 10:12:19 -0700111 friend inline int compare_type(const PatchDescription& lhs, const PatchDescription& rhs) {
Romain Guy13ba0052013-02-15 12:47:26 -0800112 return PatchDescription::compare(lhs, rhs);
Romain Guy6f72beb2010-11-30 12:04:14 -0800113 }
114
John Reck1bcacfd2017-11-03 10:12:19 -0700115 friend inline hash_t hash_type(const PatchDescription& entry) { return entry.hash(); }
Romain Guy3b748a42013-04-17 18:54:38 -0700116
Romain Guy6f72beb2010-11-30 12:04:14 -0800117 private:
Romain Guy3b748a42013-04-17 18:54:38 -0700118 const Res_png_9patch* mPatch;
119 uint32_t mBitmapWidth;
120 uint32_t mBitmapHeight;
121 float mPixelWidth;
122 float mPixelHeight;
Romain Guy6f72beb2010-11-30 12:04:14 -0800123
John Reck1bcacfd2017-11-03 10:12:19 -0700124 }; // struct PatchDescription
Romain Guy6f72beb2010-11-30 12:04:14 -0800125
Romain Guye3b0a012013-06-26 15:45:41 -0700126 /**
127 * A buffer block represents an empty range in the mesh buffer
128 * that can be used to store vertices.
129 *
130 * The patch cache maintains a linked-list of buffer blocks
131 * to track available regions of memory in the VBO.
132 */
133 struct BufferBlock {
John Reck1bcacfd2017-11-03 10:12:19 -0700134 BufferBlock(uint32_t offset, uint32_t size) : offset(offset), size(size), next(nullptr) {}
Romain Guye3b0a012013-06-26 15:45:41 -0700135
136 uint32_t offset;
137 uint32_t size;
138
139 BufferBlock* next;
John Reck1bcacfd2017-11-03 10:12:19 -0700140 }; // struct BufferBlock
Romain Guye3b0a012013-06-26 15:45:41 -0700141
142 typedef Pair<const PatchDescription*, Patch*> patch_pair_t;
143
144 void clearCache();
145 void createVertexBuffer();
146
Chris Craik8820fd12015-03-03 14:20:47 -0800147 void setupMesh(Patch* newMesh);
Romain Guye3b0a012013-06-26 15:45:41 -0700148
149 void remove(Vector<patch_pair_t>& patchesToRemove, Res_png_9patch* patch);
150
151#if DEBUG_PATCHES
152 void dumpFreeBlocks(const char* prefix);
153#endif
154
Chris Craik96a5c4c2015-01-27 15:46:35 -0800155 RenderState& mRenderState;
Chris Craik48a8f432016-02-05 15:59:29 -0800156 const uint32_t mMaxSize;
Romain Guy3b748a42013-04-17 18:54:38 -0700157 uint32_t mSize;
Romain Guy6f72beb2010-11-30 12:04:14 -0800158
Romain Guy4c2547f2013-06-11 16:19:24 -0700159 LruCache<PatchDescription, Patch*> mCache;
160
Romain Guy3b748a42013-04-17 18:54:38 -0700161 GLuint mMeshBuffer;
Romain Guye3b0a012013-06-26 15:45:41 -0700162 // First available free block inside the mesh buffer
163 BufferBlock* mFreeBlocks;
Romain Guy7d9b1b32013-05-28 14:25:09 -0700164
Romain Guye3b0a012013-06-26 15:45:41 -0700165 // Garbage tracking, required to handle GC events on the VM side
166 Vector<Res_png_9patch*> mGarbage;
167 mutable Mutex mLock;
John Reck1bcacfd2017-11-03 10:12:19 -0700168}; // class PatchCache
Romain Guyf7f93552010-07-08 19:17:03 -0700169
John Reck1bcacfd2017-11-03 10:12:19 -0700170}; // namespace uirenderer
171}; // namespace android