15cbbce535744b89df5ecea95de21ee3733298260Romain Guy/*
25cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Copyright (C) 2010 The Android Open Source Project
35cbbce535744b89df5ecea95de21ee3733298260Romain Guy *
45cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
55cbbce535744b89df5ecea95de21ee3733298260Romain Guy * you may not use this file except in compliance with the License.
65cbbce535744b89df5ecea95de21ee3733298260Romain Guy * You may obtain a copy of the License at
75cbbce535744b89df5ecea95de21ee3733298260Romain Guy *
85cbbce535744b89df5ecea95de21ee3733298260Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
95cbbce535744b89df5ecea95de21ee3733298260Romain Guy *
105cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Unless required by applicable law or agreed to in writing, software
115cbbce535744b89df5ecea95de21ee3733298260Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
125cbbce535744b89df5ecea95de21ee3733298260Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cbbce535744b89df5ecea95de21ee3733298260Romain Guy * See the License for the specific language governing permissions and
145cbbce535744b89df5ecea95de21ee3733298260Romain Guy * limitations under the License.
155cbbce535744b89df5ecea95de21ee3733298260Romain Guy */
165cbbce535744b89df5ecea95de21ee3733298260Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_PROGRAM_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_PROGRAM_H
195cbbce535744b89df5ecea95de21ee3733298260Romain Guy
20f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#include <utils/KeyedVector.h>
21f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
225cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2.h>
235cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2ext.h>
245cbbce535744b89df5ecea95de21ee3733298260Romain Guy
25c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed#include <SkBlendMode.h>
265cbbce535744b89df5ecea95de21ee3733298260Romain Guy
27096b8d96d539429de5e67b2821ef3f9ee0300842Chris Craik#include "Debug.h"
280519c810a56bded1284fcb2ae40f438878c6585fChris Craik#include "FloatColor.h"
290b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy#include "Matrix.h"
30f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#include "Properties.h"
31caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#include "utils/Color.h"
320b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy
335cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android {
345cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer {
355cbbce535744b89df5ecea95de21ee3733298260Romain Guy
36f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
37f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Defines
38f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
39f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
40f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Debug
41f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS
425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define PROGRAM_LOGD(...) ALOGD(__VA_ARGS__)
43f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#else
44f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    #define PROGRAM_LOGD(...)
45f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif
46f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
47f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_THRESHOLD 1.0f
48f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_INV_THRESHOLD 0.0f
49f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
50deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_TEXTURE             0x01
51deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_A8_TEXTURE          0x02
52deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_BITMAP              0x04
53deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_GRADIENT            0x08
54deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_BITMAP_FIRST        0x10
55deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_COLOR_MATRIX        0x20
56deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_COLOR_BLEND         0x40
57deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_BITMAP_NPOT         0x80
589c97e48fbe389180b4b64845f093c53c92c374f3sergeyv#define PROGRAM_KEY_BITMAP_EXTERNAL    0x100
59deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
60deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik#define PROGRAM_KEY_BITMAP_WRAPS_MASK  0x600
61f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800
62f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
63caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#define PROGRAM_KEY_SWAP_SRC_DST_SHIFT 13
64caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy
65f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Encode the xfermodes on 6 bits
66f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MAX_XFERMODE 0x1f
67f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_SHADER_SHIFT 26
68f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20
69f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14
70f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
71f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPS_SHIFT 9
72f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPT_SHIFT 11
73f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
746d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_GRADIENT_TYPE_SHIFT 33 // 2 bits for gradient type
75f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MODULATE_SHIFT 35
76f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
7791a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik#define PROGRAM_HAS_VERTEX_ALPHA_SHIFT 36
7891a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik#define PROGRAM_USE_SHADOW_ALPHA_INTERP_SHIFT 37
79f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
80bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 38
81bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 39
82f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
8311718bc17bcfc56dfb9f4362eebf640b025c4415Chris Craik#define PROGRAM_IS_SIMPLE_GRADIENT 40
84f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
8511718bc17bcfc56dfb9f4362eebf640b025c4415Chris Craik#define PROGRAM_HAS_COLORS 41
864121063313ac0d6f69f6253cac821d0c1c122086Romain Guy
8711718bc17bcfc56dfb9f4362eebf640b025c4415Chris Craik#define PROGRAM_HAS_DEBUG_HIGHLIGHT 42
8811718bc17bcfc56dfb9f4362eebf640b025c4415Chris Craik#define PROGRAM_HAS_ROUND_RECT_CLIP 43
893ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy
90253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#define PROGRAM_HAS_GAMMA_CORRECTION 44
91636afc1877882dc9cf73b49f8a68c73cc418d8cdRomain Guy#define PROGRAM_HAS_LINEAR_TEXTURE 45
92253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy
93caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#define PROGRAM_HAS_COLOR_SPACE_CONVERSION 46
94caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#define PROGRAM_TRANSFER_FUNCTION 47 // 2 bits for transfer function
95caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#define PROGRAM_HAS_TRANSLUCENT_CONVERSION 49
96caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy
97f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
98f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Types
99f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
100f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
101f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guytypedef uint64_t programid;
102f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
103f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
104f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Program description
105f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
106f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
107f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/**
108f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Describe the features required for a given program. The features
109f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * determine the generation of both the vertex and fragment shaders.
110f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * A ProgramDescription must be used in conjunction with a ProgramCache.
111f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */
112f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guystruct ProgramDescription {
113caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    enum class ColorFilterMode : int8_t {
114b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        None = 0,
115b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Matrix,
116b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Blend
117f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    };
118f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
119caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    enum Gradient : int8_t {
12042e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy        kGradientLinear = 0,
121f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kGradientCircular,
122f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kGradientSweep
123f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    };
124f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
125f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    ProgramDescription() {
126f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        reset();
127f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
128f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
129f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Texturing
130f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasTexture;
131f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasAlpha8Texture;
132f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasExternalTexture;
133f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasTextureTransform;
134f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
135ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    // Color attribute
136ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    bool hasColors;
137ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
138f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Modulate, this should only be set when setColor() return true
139f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool modulate;
140f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
141f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Shaders
142f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasBitmap;
1439c97e48fbe389180b4b64845f093c53c92c374f3sergeyv    bool isShaderBitmapExternal;
144554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv    bool useShaderBasedWrap;
145f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
14691a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik    bool hasVertexAlpha;
14791a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik    bool useShadowAlphaInterp;
148f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
149f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasGradient;
150f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Gradient gradientType;
15142e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy    bool isSimpleGradient;
152f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
153c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed    SkBlendMode shadersMode;
154f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
155f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool isBitmapFirst;
156f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLenum bitmapWrapS;
157f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLenum bitmapWrapT;
158f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
159f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Color operations
160117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    ColorFilterMode colorOp;
161c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed    SkBlendMode colorMode;
162f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
163f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Framebuffer blending (requires Extensions.hasFramebufferFetch())
164c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed    // Ignored for all values < SkBlendMode::kPlus
165c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed    SkBlendMode framebufferMode;
166f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool swapSrcDst;
167f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
1683ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy    bool hasDebugHighlight;
169deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    bool hasRoundRectClip;
1703ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy
171636afc1877882dc9cf73b49f8a68c73cc418d8cdRomain Guy    // Extra gamma correction used for text
172253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy    bool hasGammaCorrection;
173636afc1877882dc9cf73b49f8a68c73cc418d8cdRomain Guy    // Set when sampling an image in linear space
174636afc1877882dc9cf73b49f8a68c73cc418d8cdRomain Guy    bool hasLinearTexture;
175253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy
176caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    bool hasColorSpaceConversion;
177caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    TransferFunctionType transferFunction;
178caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    // Indicates whether the bitmap to convert between color spaces is translucent
179caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy    bool hasTranslucentConversion;
180caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy
181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
182f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Resets this description. All fields are reset back to the default
183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * values they hold after building a new instance.
184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
185f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void reset() {
186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasTexture = false;
187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasAlpha8Texture = false;
188f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasExternalTexture = false;
189f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasTextureTransform = false;
190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
191ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        hasColors = false;
192ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
19391a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik        hasVertexAlpha = false;
19491a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik        useShadowAlphaInterp = false;
195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
196f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        modulate = false;
197f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
198f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasBitmap = false;
1999c97e48fbe389180b4b64845f093c53c92c374f3sergeyv        isShaderBitmapExternal = false;
200554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv        useShaderBasedWrap = false;
201f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
202f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasGradient = false;
203f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        gradientType = kGradientLinear;
20442e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy        isSimpleGradient = false;
205f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
206c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed        shadersMode = SkBlendMode::kClear;
207f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
208f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        isBitmapFirst = false;
209f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        bitmapWrapS = GL_CLAMP_TO_EDGE;
210f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        bitmapWrapT = GL_CLAMP_TO_EDGE;
211f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
212b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        colorOp = ColorFilterMode::None;
213c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed        colorMode = SkBlendMode::kClear;
214f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
215c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed        framebufferMode = SkBlendMode::kClear;
216f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        swapSrcDst = false;
217f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
2183ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy        hasDebugHighlight = false;
219deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik        hasRoundRectClip = false;
220253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy
221253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy        hasGammaCorrection = false;
222636afc1877882dc9cf73b49f8a68c73cc418d8cdRomain Guy        hasLinearTexture = false;
223caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy
224caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        hasColorSpaceConversion = false;
225caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        transferFunction = TransferFunctionType::None;
226caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        hasTranslucentConversion = false;
227f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
228f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
229f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
230f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Indicates, for a given color, whether color modulation is required in
231f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * the fragment shader. When this method returns true, the program should
232f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * be provided with a modulation color.
233f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
234e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik    bool setColorModulate(const float a) {
235a938f569ce206c1ed68d736181016b5b708c0084Romain Guy        modulate = a < COLOR_COMPONENT_THRESHOLD;
236f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return modulate;
237f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
238f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
239f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
240f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Indicates, for a given color, whether color modulation is required in
241f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * the fragment shader. When this method returns true, the program should
242f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * be provided with a modulation color.
243f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
244e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik    bool setAlpha8ColorModulate(const float r, const float g, const float b, const float a) {
245f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD ||
246f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD;
247f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return modulate;
248f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
249f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
250f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
251f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Computes the unique key identifying this program.
252f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
253f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    programid key() const {
254f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        programid key = 0;
255f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasTexture) key |= PROGRAM_KEY_TEXTURE;
256f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE;
257f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasBitmap) {
258f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            key |= PROGRAM_KEY_BITMAP;
259554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv            if (useShaderBasedWrap) {
260f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_BITMAP_NPOT;
261f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT;
262f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT;
263f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            }
2649c97e48fbe389180b4b64845f093c53c92c374f3sergeyv            if (isShaderBitmapExternal) {
2659c97e48fbe389180b4b64845f093c53c92c374f3sergeyv                key |= PROGRAM_KEY_BITMAP_EXTERNAL;
2669c97e48fbe389180b4b64845f093c53c92c374f3sergeyv            }
267f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
268f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasGradient) key |= PROGRAM_KEY_GRADIENT;
269f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT;
270f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST;
271f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasBitmap && hasGradient) {
272c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed            key |= ((int)shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT;
273f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
274f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        switch (colorOp) {
275b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik            case ColorFilterMode::Matrix:
276f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_COLOR_MATRIX;
277f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
278b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik            case ColorFilterMode::Blend:
279f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_COLOR_BLEND;
280caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy                key |= ((int) colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT;
281f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
282b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik            case ColorFilterMode::None:
283f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
284f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
285caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= ((int) framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT;
286caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(swapSrcDst) << PROGRAM_KEY_SWAP_SRC_DST_SHIFT;
287caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(modulate) << PROGRAM_MODULATE_SHIFT;
288caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasVertexAlpha) << PROGRAM_HAS_VERTEX_ALPHA_SHIFT;
289caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(useShadowAlphaInterp) << PROGRAM_USE_SHADOW_ALPHA_INTERP_SHIFT;
290caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasExternalTexture) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT;
291caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasTextureTransform) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT;
292caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(isSimpleGradient) << PROGRAM_IS_SIMPLE_GRADIENT;
293caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasColors) << PROGRAM_HAS_COLORS;
294caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasDebugHighlight) << PROGRAM_HAS_DEBUG_HIGHLIGHT;
295caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasRoundRectClip) << PROGRAM_HAS_ROUND_RECT_CLIP;
296caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasGammaCorrection) << PROGRAM_HAS_GAMMA_CORRECTION;
297caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasLinearTexture) << PROGRAM_HAS_LINEAR_TEXTURE;
298caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasColorSpaceConversion) << PROGRAM_HAS_COLOR_SPACE_CONVERSION;
299caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(transferFunction) << PROGRAM_TRANSFER_FUNCTION;
300caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy        key |= programid(hasTranslucentConversion) << PROGRAM_HAS_TRANSLUCENT_CONVERSION;
301f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return key;
302f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
303f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
304f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
305f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Logs the specified message followed by the key identifying this program.
306f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
307f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void log(const char* message) const {
308f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS
309f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        programid k = key();
310f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32),
311f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                uint32_t(k & 0xffffffff));
312f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif
313f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
314f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
315f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guyprivate:
3164121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    static inline uint32_t getEnumForWrap(GLenum wrap) {
317f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        switch (wrap) {
318f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_CLAMP_TO_EDGE:
319f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 0;
320f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_REPEAT:
321f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 1;
322f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_MIRRORED_REPEAT:
323f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 2;
324f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
325f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return 0;
326f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
327f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
328f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy}; // struct ProgramDescription
329f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
3305cbbce535744b89df5ecea95de21ee3733298260Romain Guy/**
3315cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A program holds a vertex and a fragment shader. It offers several utility
3325cbbce535744b89df5ecea95de21ee3733298260Romain Guy * methods to query attributes and uniforms.
3335cbbce535744b89df5ecea95de21ee3733298260Romain Guy */
334889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guyclass Program {
3355cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic:
3363e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    enum ShaderBindings {
3373e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy        kBindingPosition,
3383e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy        kBindingTexCoords
3393e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    };
3403e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy
3415cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
3425cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Creates a new program with the specified vertex and fragment
3435cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * shaders sources.
3445cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
345f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Program(const ProgramDescription& description, const char* vertex, const char* fragment);
3466926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual ~Program();
3475cbbce535744b89df5ecea95de21ee3733298260Romain Guy
3485cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
3495cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Binds this program to the GL context.
3505cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
3516926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual void use();
3525cbbce535744b89df5ecea95de21ee3733298260Romain Guy
353260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    /**
354260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * Marks this program as unused. This will not unbind
355260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * the program from the GL context.
356260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     */
3576926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual void remove();
358260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
359260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    /**
360ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     * Returns the OpenGL name of the specified attribute.
361ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     */
362ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    int getAttrib(const char* name);
363ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
364ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    /**
365ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     * Returns the OpenGL name of the specified uniform.
366ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     */
367ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    int getUniform(const char* name);
368ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
369ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    /**
370260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * Indicates whether this program is currently in use with
371260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * the GL context.
372260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     */
373260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    inline bool isInUse() const {
374260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy        return mUse;
375260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    }
376260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
377889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
37867f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy     * Indicates whether this program was correctly compiled and linked.
37967f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy     */
38067f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    inline bool isInitialized() const {
38167f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy        return mInitialized;
38267f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    }
38367f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy
38467f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    /**
385889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * Binds the program with the specified projection, modelView and
386889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * transform matrices.
387889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
388889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    void set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
3898a5cc92a150bae38ec43732d941b38bb381fe153Chet Haase             const mat4& transformMatrix, bool offset = false);
390889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
391889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
392707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy     * Sets the color associated with this shader.
393889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
3940519c810a56bded1284fcb2ae40f438878c6585fChris Craik    void setColor(FloatColor color);
395889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
396889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
3976c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Name of the texCoords attribute if it exists (kBindingTexCoords), -1 otherwise.
398f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
399f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    int texCoords;
400f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
401f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
402889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * Name of the transform uniform.
403889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
404889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    int transform;
405889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
40639284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy    /**
40739284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy     * Name of the projection uniform.
40839284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy     */
40939284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy    int projection;
41039284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy
4115cbbce535744b89df5ecea95de21ee3733298260Romain Guyprotected:
4125cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
4135cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Adds an attribute with the specified name.
4145cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
4155cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The OpenGL name of the attribute.
4165cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
4175cbbce535744b89df5ecea95de21ee3733298260Romain Guy    int addAttrib(const char* name);
4185cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4195cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
4203e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy     * Binds the specified attribute name to the specified slot.
4213e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy     */
4223e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    int bindAttrib(const char* name, ShaderBindings bindingSlot);
4233e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy
4243e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    /**
4255cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Adds a uniform with the specified name.
4265cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
4275cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The OpenGL name of the uniform.
4285cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
4295cbbce535744b89df5ecea95de21ee3733298260Romain Guy    int addUniform(const char* name);
4305cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4315cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate:
4325cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
4335cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Compiles the specified shader of the specified type.
4345cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
4355cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The name of the compiled shader.
4365cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
4375cbbce535744b89df5ecea95de21ee3733298260Romain Guy    GLuint buildShader(const char* source, GLenum type);
4385cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4393e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    // Name of the OpenGL program and shaders
44005bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    GLuint mProgramId;
4413e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    GLuint mVertexShader;
4423e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    GLuint mFragmentShader;
4435cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4445cbbce535744b89df5ecea95de21ee3733298260Romain Guy    // Keeps track of attributes and uniforms slots
44505bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    KeyedVector<const char*, int> mAttributes;
44605bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    KeyedVector<const char*, int> mUniforms;
447260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
448260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    bool mUse;
44967f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    bool mInitialized;
45005bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy
4513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    // Uniforms caching
45205bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    bool mHasColorUniform;
45305bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    int mColorUniform;
4542d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy
4552d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy    bool mHasSampler;
4563b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
4573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    mat4 mProjection;
458d04a6b15f74035fd2068f34225825b55e94521f4Chris Craik    bool mOffset;
4595cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Program
4605cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4615cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer
4625cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android
4635cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PROGRAM_H
465