blob: 7f2f5faf33e8d89697eb618073cd1846f27b7baf [file] [log] [blame]
Romain Guyac670c02010-07-27 17:39:27 -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_PROGRAM_CACHE_H
18#define ANDROID_UI_PROGRAM_CACHE_H
19
20#include <utils/KeyedVector.h>
21#include <utils/Log.h>
22
23#include <SkXfermode.h>
24
25#include "Program.h"
26
27namespace android {
28namespace uirenderer {
29
30///////////////////////////////////////////////////////////////////////////////
31// Defines
32///////////////////////////////////////////////////////////////////////////////
33
34// Debug
35#define DEBUG_PROGRAM_CACHE 0
36
37// Debug
38#if DEBUG_PROGRAM_CACHE
39 #define PROGRAM_LOGD(...) LOGD(__VA_ARGS__)
40#else
41 #define PROGRAM_LOGD(...)
42#endif
43
44#define PROGRAM_KEY_TEXTURE 0x1
45#define PROGRAM_KEY_A8_TEXTURE 0x2
46#define PROGRAM_KEY_BITMAP 0x4
47#define PROGRAM_KEY_GRADIENT 0x8
48#define PROGRAM_KEY_BITMAP_FIRST 0x10
49#define PROGRAM_KEY_COLOR_MATRIX 0x20
50#define PROGRAM_KEY_COLOR_LIGHTING 0x40
51#define PROGRAM_KEY_COLOR_BLEND 0x80
52
53// Support only the 12 Porter-Duff modes for now
54#define PROGRAM_MAX_XFERMODE 0xC
55#define PROGRAM_XFERMODE_SHADER_SHIFT 24
56#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20
57
58///////////////////////////////////////////////////////////////////////////////
59// Types
60///////////////////////////////////////////////////////////////////////////////
61
62typedef uint32_t programid;
63
64///////////////////////////////////////////////////////////////////////////////
65// Cache
66///////////////////////////////////////////////////////////////////////////////
67
68/**
69 * Describe the features required for a given program. The features
70 * determine the generation of both the vertex and fragment shaders.
71 * A ProgramDescription must be used in conjunction with a ProgramCache.
72 */
73struct ProgramDescription {
74 enum ColorModifier {
75 kColorNone,
76 kColorMatrix,
77 kColorLighting,
78 kColorBlend
79 };
80
81 ProgramDescription():
82 hasTexture(false), hasAlpha8Texture(false),
83 hasBitmap(false), hasGradient(false), shadersMode(SkXfermode::kClear_Mode),
84 colorOp(kColorNone), colorMode(SkXfermode::kClear_Mode) {
85 }
86
87 // Texturing
88 bool hasTexture;
89 bool hasAlpha8Texture;
90
91 // Shaders
92 bool hasBitmap;
93 bool hasGradient;
94 SkXfermode::Mode shadersMode;
95 bool isBitmapFirst;
96
97 // Color operations
98 int colorOp;
99 SkXfermode::Mode colorMode;
100
101 programid key() const {
102 programid key = 0;
103 if (hasTexture) key |= PROGRAM_KEY_TEXTURE;
104 if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE;
105 if (hasBitmap) key |= PROGRAM_KEY_BITMAP;
106 if (hasGradient) key |= PROGRAM_KEY_GRADIENT;
107 if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST;
108 if (hasBitmap && hasGradient) {
109 key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT;
110 }
111 switch (colorOp) {
112 case kColorMatrix:
113 key |= PROGRAM_KEY_COLOR_MATRIX;
114 break;
115 case kColorLighting:
116 key |= PROGRAM_KEY_COLOR_LIGHTING;
117 break;
118 case kColorBlend:
119 key |= PROGRAM_KEY_COLOR_BLEND;
120 key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT;
121 break;
122 case kColorNone:
123 break;
124 }
125 return key;
126 }
127}; // struct ProgramDescription
128
129/**
130 * Generates and caches program. Programs are generated based on
131 * ProgramDescriptions.
132 */
133class ProgramCache {
134public:
135 ProgramCache();
136 ~ProgramCache();
137
138 Program* get(const ProgramDescription& description);
139
140 void clear();
141
142private:
143 Program* generateProgram(const ProgramDescription& description, programid key);
144 String8 generateVertexShader(const ProgramDescription& description);
145 String8 generateFragmentShader(const ProgramDescription& description);
146 void generatePorterDuffBlend(String8& shader, const char* name, SkXfermode::Mode mode);
147
148 KeyedVector<programid, Program*> mCache;
149
150}; // class ProgramCache
151
152}; // namespace uirenderer
153}; // namespace android
154
155#endif // ANDROID_UI_PROGRAM_CACHE_H