blob: 9f2c9a59387b053f85c15613841411295e5f7eea [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
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_PATCH_CACHE_H
18#define ANDROID_HWUI_PATCH_CACHE_H
Romain Guyf7f93552010-07-08 19:17:03 -070019
Romain Guy3b748a42013-04-17 18:54:38 -070020#include <GLES2/gl2.h>
Romain Guy2728f962010-10-08 18:36:15 -070021
Romain Guy3b748a42013-04-17 18:54:38 -070022#include <utils/LruCache.h>
23
24#include <androidfw/ResourceTypes.h>
25
26#include "AssetAtlas.h"
Romain Guyc15008e2010-11-10 11:59:15 -080027#include "Debug.h"
Romain Guyf7f93552010-07-08 19:17:03 -070028#include "Patch.h"
Romain Guye3b0a012013-06-26 15:45:41 -070029#include "utils/Pair.h"
Romain Guyf7f93552010-07-08 19:17:03 -070030
31namespace android {
32namespace uirenderer {
33
34///////////////////////////////////////////////////////////////////////////////
35// Defines
36///////////////////////////////////////////////////////////////////////////////
37
38// Debug
Romain Guyf7f93552010-07-08 19:17:03 -070039#if DEBUG_PATCHES
Steve Block5baa3a62011-12-20 16:23:08 +000040 #define PATCH_LOGD(...) ALOGD(__VA_ARGS__)
Romain Guyf7f93552010-07-08 19:17:03 -070041#else
42 #define PATCH_LOGD(...)
43#endif
44
45///////////////////////////////////////////////////////////////////////////////
46// Cache
47///////////////////////////////////////////////////////////////////////////////
48
Romain Guy3b748a42013-04-17 18:54:38 -070049class Caches;
50
Romain Guy2728f962010-10-08 18:36:15 -070051class PatchCache {
Romain Guyf7f93552010-07-08 19:17:03 -070052public:
Romain Guyfb8b7632010-08-23 21:05:08 -070053 PatchCache();
Romain Guyf7f93552010-07-08 19:17:03 -070054 ~PatchCache();
Romain Guy3b748a42013-04-17 18:54:38 -070055 void init(Caches& caches);
Romain Guyf7f93552010-07-08 19:17:03 -070056
Romain Guy3b748a42013-04-17 18:54:38 -070057 const Patch* get(const AssetAtlas::Entry* entry,
58 const uint32_t bitmapWidth, const uint32_t bitmapHeight,
59 const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch);
Romain Guyf7f93552010-07-08 19:17:03 -070060 void clear();
61
Romain Guyc15008e2010-11-10 11:59:15 -080062 uint32_t getSize() const {
Romain Guy3b748a42013-04-17 18:54:38 -070063 return mSize;
Romain Guyc15008e2010-11-10 11:59:15 -080064 }
65
66 uint32_t getMaxSize() const {
Romain Guy3b748a42013-04-17 18:54:38 -070067 return mMaxSize;
68 }
69
70 GLuint getMeshBuffer() const {
71 return mMeshBuffer;
Romain Guyc15008e2010-11-10 11:59:15 -080072 }
73
Romain Guy4c2547f2013-06-11 16:19:24 -070074 uint32_t getGenerationId() const {
75 return mGenerationId;
76 }
77
Romain Guye3b0a012013-06-26 15:45:41 -070078 /**
79 * Removes the entries associated with the specified 9-patch. This is meant
80 * to be called from threads that are not the EGL context thread (GC thread
81 * on the VM side for instance.)
82 */
83 void removeDeferred(Res_png_9patch* patch);
Romain Guy3b748a42013-04-17 18:54:38 -070084
Romain Guye3b0a012013-06-26 15:45:41 -070085 /**
86 * Process deferred removals.
87 */
88 void clearGarbage();
89
90
91private:
Romain Guy6f72beb2010-11-30 12:04:14 -080092 struct PatchDescription {
Romain Guy3b748a42013-04-17 18:54:38 -070093 PatchDescription(): mPatch(NULL), mBitmapWidth(0), mBitmapHeight(0),
94 mPixelWidth(0), mPixelHeight(0) {
Romain Guy6f72beb2010-11-30 12:04:14 -080095 }
96
Romain Guy13ba0052013-02-15 12:47:26 -080097 PatchDescription(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
Romain Guy3b748a42013-04-17 18:54:38 -070098 const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch):
99 mPatch(patch), mBitmapWidth(bitmapWidth), mBitmapHeight(bitmapHeight),
100 mPixelWidth(pixelWidth), mPixelHeight(pixelHeight) {
Romain Guy6f72beb2010-11-30 12:04:14 -0800101 }
102
Romain Guy3b748a42013-04-17 18:54:38 -0700103 hash_t hash() const;
104
Romain Guye3b0a012013-06-26 15:45:41 -0700105 const Res_png_9patch* getPatch() const { return mPatch; }
106
Romain Guy13ba0052013-02-15 12:47:26 -0800107 static int compare(const PatchDescription& lhs, const PatchDescription& rhs);
108
109 bool operator==(const PatchDescription& other) const {
110 return compare(*this, other) == 0;
111 }
112
113 bool operator!=(const PatchDescription& other) const {
114 return compare(*this, other) != 0;
115 }
116
117 friend inline int strictly_order_type(const PatchDescription& lhs,
118 const PatchDescription& rhs) {
119 return PatchDescription::compare(lhs, rhs) < 0;
120 }
121
122 friend inline int compare_type(const PatchDescription& lhs,
123 const PatchDescription& rhs) {
124 return PatchDescription::compare(lhs, rhs);
Romain Guy6f72beb2010-11-30 12:04:14 -0800125 }
126
Romain Guy3b748a42013-04-17 18:54:38 -0700127 friend inline hash_t hash_type(const PatchDescription& entry) {
128 return entry.hash();
129 }
130
Romain Guy6f72beb2010-11-30 12:04:14 -0800131 private:
Romain Guy3b748a42013-04-17 18:54:38 -0700132 const Res_png_9patch* mPatch;
133 uint32_t mBitmapWidth;
134 uint32_t mBitmapHeight;
135 float mPixelWidth;
136 float mPixelHeight;
Romain Guy6f72beb2010-11-30 12:04:14 -0800137
138 }; // struct PatchDescription
139
Romain Guye3b0a012013-06-26 15:45:41 -0700140 /**
141 * A buffer block represents an empty range in the mesh buffer
142 * that can be used to store vertices.
143 *
144 * The patch cache maintains a linked-list of buffer blocks
145 * to track available regions of memory in the VBO.
146 */
147 struct BufferBlock {
148 BufferBlock(uint32_t offset, uint32_t size): offset(offset), size(size), next(NULL) {
149 }
150
151 uint32_t offset;
152 uint32_t size;
153
154 BufferBlock* next;
155 }; // struct BufferBlock
156
157 typedef Pair<const PatchDescription*, Patch*> patch_pair_t;
158
159 void clearCache();
160 void createVertexBuffer();
161
162 void setupMesh(Patch* newMesh, TextureVertex* vertices);
163
164 void remove(Vector<patch_pair_t>& patchesToRemove, Res_png_9patch* patch);
165
166#if DEBUG_PATCHES
167 void dumpFreeBlocks(const char* prefix);
168#endif
169
Romain Guy3b748a42013-04-17 18:54:38 -0700170 uint32_t mMaxSize;
171 uint32_t mSize;
Romain Guy6f72beb2010-11-30 12:04:14 -0800172
Romain Guy4c2547f2013-06-11 16:19:24 -0700173 LruCache<PatchDescription, Patch*> mCache;
174
Romain Guy3b748a42013-04-17 18:54:38 -0700175 GLuint mMeshBuffer;
Romain Guye3b0a012013-06-26 15:45:41 -0700176 // First available free block inside the mesh buffer
177 BufferBlock* mFreeBlocks;
Romain Guy7d9b1b32013-05-28 14:25:09 -0700178
Romain Guy4c2547f2013-06-11 16:19:24 -0700179 uint32_t mGenerationId;
Romain Guye3b0a012013-06-26 15:45:41 -0700180
181 // Garbage tracking, required to handle GC events on the VM side
182 Vector<Res_png_9patch*> mGarbage;
183 mutable Mutex mLock;
Romain Guyf7f93552010-07-08 19:17:03 -0700184}; // class PatchCache
185
186}; // namespace uirenderer
187}; // namespace android
188
Romain Guy5b3b3522010-10-27 18:57:51 -0700189#endif // ANDROID_HWUI_PATCH_CACHE_H