blob: e6e494dff4d41d5305bda09c5d1b626d28064159 [file] [log] [blame]
Romain Guyfb8b7632010-08-23 21:05:08 -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
17#ifndef ANDROID_UI_CACHES_H
18#define ANDROID_UI_CACHES_H
19
Romain Guya2341a92010-09-08 18:04:33 -070020#ifndef LOG_TAG
21 #define LOG_TAG "OpenGLRenderer"
22#endif
Romain Guyfb8b7632010-08-23 21:05:08 -070023
24#include <utils/Singleton.h>
25
Romain Guy03750a02010-10-18 14:06:08 -070026#include "FontRenderer.h"
27#include "GammaFontRenderer.h"
Romain Guyfb8b7632010-08-23 21:05:08 -070028#include "TextureCache.h"
29#include "LayerCache.h"
30#include "GradientCache.h"
31#include "PatchCache.h"
Romain Guyfb8b7632010-08-23 21:05:08 -070032#include "ProgramCache.h"
33#include "PathCache.h"
34#include "TextDropShadowCache.h"
Romain Guye2d345e2010-09-24 18:39:22 -070035#include "FboCache.h"
Romain Guy29d89972010-09-22 16:10:57 -070036#include "Line.h"
Romain Guyfb8b7632010-08-23 21:05:08 -070037
38namespace android {
39namespace uirenderer {
40
Romain Guy03750a02010-10-18 14:06:08 -070041///////////////////////////////////////////////////////////////////////////////
42// Globals
43///////////////////////////////////////////////////////////////////////////////
44
45#define REQUIRED_TEXTURE_UNITS_COUNT 3
46
47// Generates simple and textured vertices
48#define FV(x, y, u, v) { { x, y }, { u, v } }
49
50// This array is never used directly but used as a memcpy source in the
51// OpenGLRenderer constructor
52static const TextureVertex gMeshVertices[] = {
53 FV(0.0f, 0.0f, 0.0f, 0.0f),
54 FV(1.0f, 0.0f, 1.0f, 0.0f),
55 FV(0.0f, 1.0f, 0.0f, 1.0f),
56 FV(1.0f, 1.0f, 1.0f, 1.0f)
57};
58static const GLsizei gMeshStride = sizeof(TextureVertex);
59static const GLsizei gMeshTextureOffset = 2 * sizeof(float);
60static const GLsizei gMeshCount = 4;
61
62///////////////////////////////////////////////////////////////////////////////
63// Debug
64///////////////////////////////////////////////////////////////////////////////
65
Romain Guyfb8b7632010-08-23 21:05:08 -070066struct CacheLogger {
67 CacheLogger() {
68 LOGD("Creating caches");
69 }
70}; // struct CacheLogger
71
Romain Guy03750a02010-10-18 14:06:08 -070072///////////////////////////////////////////////////////////////////////////////
73// Caches
74///////////////////////////////////////////////////////////////////////////////
75
Romain Guyfb8b7632010-08-23 21:05:08 -070076class Caches: public Singleton<Caches> {
77 Caches(): Singleton<Caches>(), blend(false), lastSrcMode(GL_ZERO),
78 lastDstMode(GL_ZERO), currentProgram(NULL) {
Romain Guy03750a02010-10-18 14:06:08 -070079 GLint maxTextureUnits;
80 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
81 if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
82 LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
83 }
84
85 glGenBuffers(1, &meshBuffer);
86 glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
87 glBufferData(GL_ARRAY_BUFFER, sizeof(gMeshVertices), gMeshVertices, GL_STATIC_DRAW);
88
89 currentBuffer = meshBuffer;
Romain Guyfb8b7632010-08-23 21:05:08 -070090 }
91
92 friend class Singleton<Caches>;
93
94 CacheLogger logger;
95
96public:
Romain Guy03750a02010-10-18 14:06:08 -070097 /**
98 * Binds the VBO used to render simple textured quads.
99 */
100 inline void bindMeshBuffer() {
101 bindMeshBuffer(meshBuffer);
102 }
103
104 /**
105 * Binds the specified VBO.
106 */
107 inline void bindMeshBuffer(const GLuint buffer) {
108 if (currentBuffer != buffer) {
109 glBindBuffer(GL_ARRAY_BUFFER, buffer);
110 currentBuffer = buffer;
111 }
112 }
113
114 /**
115 * Unbinds the VBO used to render simple textured quads.
116 */
117 inline void unbindMeshBuffer() {
118 if (currentBuffer) {
119 glBindBuffer(GL_ARRAY_BUFFER, 0);
120 currentBuffer = 0;
121 }
122 }
123
Romain Guyfb8b7632010-08-23 21:05:08 -0700124 bool blend;
125 GLenum lastSrcMode;
126 GLenum lastDstMode;
127 Program* currentProgram;
128
Romain Guy03750a02010-10-18 14:06:08 -0700129 GLuint meshBuffer;
130 GLuint currentBuffer;
131
Romain Guyfb8b7632010-08-23 21:05:08 -0700132 TextureCache textureCache;
133 LayerCache layerCache;
134 GradientCache gradientCache;
135 ProgramCache programCache;
136 PathCache pathCache;
137 PatchCache patchCache;
138 TextDropShadowCache dropShadowCache;
Romain Guye2d345e2010-09-24 18:39:22 -0700139 FboCache fboCache;
Romain Guy11fd6542010-10-04 17:10:58 -0700140 GammaFontRenderer fontRenderer;
Romain Guy29d89972010-09-22 16:10:57 -0700141
142 Line line;
Romain Guyfb8b7632010-08-23 21:05:08 -0700143}; // class Caches
144
145}; // namespace uirenderer
146
Romain Guyf6fcac72010-08-24 18:17:31 -0700147#ifdef USE_OPENGL_RENDERER
Romain Guyfb8b7632010-08-23 21:05:08 -0700148using namespace uirenderer;
149ANDROID_SINGLETON_STATIC_INSTANCE(Caches);
Romain Guyf6fcac72010-08-24 18:17:31 -0700150#endif
Romain Guyfb8b7632010-08-23 21:05:08 -0700151
152}; // namespace android
153
154#endif // ANDROID_UI_CACHES_H