Program.h revision f877308f77f7c6f3edd91618a092207dd3be9077
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
25f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#include <SkXfermode.h>
265cbbce535744b89df5ecea95de21ee3733298260Romain Guy
270b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy#include "Matrix.h"
28f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#include "Properties.h"
290b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy
305cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android {
315cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer {
325cbbce535744b89df5ecea95de21ee3733298260Romain Guy
33f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
34f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Defines
35f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
36f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
37f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Debug
38f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS
395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define PROGRAM_LOGD(...) ALOGD(__VA_ARGS__)
40f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#else
41f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    #define PROGRAM_LOGD(...)
42f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif
43f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
44f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_THRESHOLD 1.0f
45f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_INV_THRESHOLD 0.0f
46f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
47f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_TEXTURE 0x1
48f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_A8_TEXTURE 0x2
49f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP 0x4
50f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_GRADIENT 0x8
51f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_FIRST 0x10
52f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_MATRIX 0x20
53f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_LIGHTING 0x40
54f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_BLEND 0x80
55f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_NPOT 0x100
56f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_SWAP_SRC_DST 0x2000
57f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
58f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600
59f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800
60f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
61f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Encode the xfermodes on 6 bits
62f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MAX_XFERMODE 0x1f
63f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_SHADER_SHIFT 26
64f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20
65f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14
66f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
67f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPS_SHIFT 9
68f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPT_SHIFT 11
69f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
70f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_GRADIENT_TYPE_SHIFT 33
71f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MODULATE_SHIFT 35
72f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
73f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_IS_POINT_SHIFT 36
74f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
75f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_HAS_AA_SHIFT 37
76f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
77f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 38
78f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 39
79f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
80f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
81f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Types
82f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
83f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
84f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guytypedef uint64_t programid;
85f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
86f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
87f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Program description
88f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy///////////////////////////////////////////////////////////////////////////////
89f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
90f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/**
91f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Describe the features required for a given program. The features
92f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * determine the generation of both the vertex and fragment shaders.
93f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * A ProgramDescription must be used in conjunction with a ProgramCache.
94f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */
95f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guystruct ProgramDescription {
96f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    enum ColorModifier {
97f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kColorNone,
98f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kColorMatrix,
99f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kColorLighting,
100f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kColorBlend
101f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    };
102f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
103f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    enum Gradient {
104f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kGradientLinear,
105f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kGradientCircular,
106f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        kGradientSweep
107f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    };
108f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
109f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    ProgramDescription() {
110f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        reset();
111f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
112f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
113f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Texturing
114f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasTexture;
115f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasAlpha8Texture;
116f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasExternalTexture;
117f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasTextureTransform;
118f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
119f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Modulate, this should only be set when setColor() return true
120f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool modulate;
121f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
122f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Shaders
123f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasBitmap;
124f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool isBitmapNpot;
125f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
126f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool isAA;
127f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
128f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool hasGradient;
129f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Gradient gradientType;
130f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
131f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    SkXfermode::Mode shadersMode;
132f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
133f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool isBitmapFirst;
134f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLenum bitmapWrapS;
135f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLenum bitmapWrapT;
136f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
137f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Color operations
138f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    ColorModifier colorOp;
139f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    SkXfermode::Mode colorMode;
140f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
141f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Framebuffer blending (requires Extensions.hasFramebufferFetch())
142f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Ignored for all values < SkXfermode::kPlus_Mode
143f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    SkXfermode::Mode framebufferMode;
144f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool swapSrcDst;
145f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
146f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool isPoint;
147f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    float pointSize;
148f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
149f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
150f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Resets this description. All fields are reset back to the default
151f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * values they hold after building a new instance.
152f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
153f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void reset() {
154f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasTexture = false;
155f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasAlpha8Texture = false;
156f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasExternalTexture = false;
157f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasTextureTransform = false;
158f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
159f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        isAA = false;
160f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
161f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        modulate = false;
162f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
163f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasBitmap = false;
164f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        isBitmapNpot = false;
165f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
166f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        hasGradient = false;
167f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        gradientType = kGradientLinear;
168f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
169f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        shadersMode = SkXfermode::kClear_Mode;
170f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
171f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        isBitmapFirst = false;
172f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        bitmapWrapS = GL_CLAMP_TO_EDGE;
173f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        bitmapWrapT = GL_CLAMP_TO_EDGE;
174f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
175f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        colorOp = kColorNone;
176f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        colorMode = SkXfermode::kClear_Mode;
177f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
178f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        framebufferMode = SkXfermode::kClear_Mode;
179f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        swapSrcDst = false;
180f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        isPoint = false;
182f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        pointSize = 0.0f;
183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
185f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Indicates, for a given color, whether color modulation is required in
187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * the fragment shader. When this method returns true, the program should
188f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * be provided with a modulation color.
189f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool setColor(const float r, const float g, const float b, const float a) {
191f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        modulate = a < COLOR_COMPONENT_THRESHOLD || r < COLOR_COMPONENT_THRESHOLD ||
192f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                g < COLOR_COMPONENT_THRESHOLD || b < COLOR_COMPONENT_THRESHOLD;
193f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return modulate;
194f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
196f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
197f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Indicates, for a given color, whether color modulation is required in
198f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * the fragment shader. When this method returns true, the program should
199f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * be provided with a modulation color.
200f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
201f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool setAlpha8Color(const float r, const float g, const float b, const float a) {
202f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD ||
203f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD;
204f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return modulate;
205f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
206f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
207f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
208f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Computes the unique key identifying this program.
209f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
210f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    programid key() const {
211f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        programid key = 0;
212f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasTexture) key |= PROGRAM_KEY_TEXTURE;
213f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE;
214f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasBitmap) {
215f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            key |= PROGRAM_KEY_BITMAP;
216f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            if (isBitmapNpot) {
217f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_BITMAP_NPOT;
218f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT;
219f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT;
220f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            }
221f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
222f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasGradient) key |= PROGRAM_KEY_GRADIENT;
223f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT;
224f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST;
225f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasBitmap && hasGradient) {
226f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT;
227f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
228f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        switch (colorOp) {
229f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case kColorMatrix:
230f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_COLOR_MATRIX;
231f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
232f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case kColorLighting:
233f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_COLOR_LIGHTING;
234f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
235f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case kColorBlend:
236f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= PROGRAM_KEY_COLOR_BLEND;
237f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT;
238f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
239f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case kColorNone:
240f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                break;
241f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
242f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT;
243f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST;
244f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT;
245f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (isPoint) key |= programid(0x1) << PROGRAM_IS_POINT_SHIFT;
246f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (isAA) key |= programid(0x1) << PROGRAM_HAS_AA_SHIFT;
247f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasExternalTexture) key |= programid(0x1) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT;
248f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT;
249f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return key;
250f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
251f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
252f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
253f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Logs the specified message followed by the key identifying this program.
254f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
255f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void log(const char* message) const {
256f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS
257f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        programid k = key();
258f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32),
259f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                uint32_t(k & 0xffffffff));
260f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif
261f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
262f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
263f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guyprivate:
264f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    inline uint32_t getEnumForWrap(GLenum wrap) const {
265f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        switch (wrap) {
266f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_CLAMP_TO_EDGE:
267f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 0;
268f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_REPEAT:
269f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 1;
270f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            case GL_MIRRORED_REPEAT:
271f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy                return 2;
272f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        }
273f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy        return 0;
274f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    }
275f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
276f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy}; // struct ProgramDescription
277f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
2785cbbce535744b89df5ecea95de21ee3733298260Romain Guy/**
2795cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A program holds a vertex and a fragment shader. It offers several utility
2805cbbce535744b89df5ecea95de21ee3733298260Romain Guy * methods to query attributes and uniforms.
2815cbbce535744b89df5ecea95de21ee3733298260Romain Guy */
282889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guyclass Program {
2835cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic:
2843e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    enum ShaderBindings {
2853e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy        kBindingPosition,
2863e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy        kBindingTexCoords
2873e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    };
2883e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy
2895cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
2905cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Creates a new program with the specified vertex and fragment
2915cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * shaders sources.
2925cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
293f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Program(const ProgramDescription& description, const char* vertex, const char* fragment);
2946926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual ~Program();
2955cbbce535744b89df5ecea95de21ee3733298260Romain Guy
2965cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
2975cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Binds this program to the GL context.
2985cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
2996926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual void use();
3005cbbce535744b89df5ecea95de21ee3733298260Romain Guy
301260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    /**
302260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * Marks this program as unused. This will not unbind
303260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * the program from the GL context.
304260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     */
3056926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy    virtual void remove();
306260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
307260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    /**
308ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     * Returns the OpenGL name of the specified attribute.
309ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     */
310ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    int getAttrib(const char* name);
311ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
312ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    /**
313ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     * Returns the OpenGL name of the specified uniform.
314ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     */
315ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    int getUniform(const char* name);
316ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
317ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    /**
318260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * Indicates whether this program is currently in use with
319260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     * the GL context.
320260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     */
321260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    inline bool isInUse() const {
322260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy        return mUse;
323260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    }
324260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
325889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
32667f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy     * Indicates whether this program was correctly compiled and linked.
32767f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy     */
32867f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    inline bool isInitialized() const {
32967f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy        return mInitialized;
33067f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    }
33167f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy
33267f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    /**
333889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * Binds the program with the specified projection, modelView and
334889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * transform matrices.
335889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
336889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    void set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
3378a5cc92a150bae38ec43732d941b38bb381fe153Chet Haase             const mat4& transformMatrix, bool offset = false);
338889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
339889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
340707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy     * Sets the color associated with this shader.
341889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
342707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy    void setColor(const float r, const float g, const float b, const float a);
343889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
344889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
345707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy     * Name of the position attribute.
346889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
347707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy    int position;
348889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
349889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    /**
350f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Name of the texCoords attribute if it exists, -1 otherwise.
351f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
352f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    int texCoords;
353f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
354f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
355889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     * Name of the transform uniform.
356889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy     */
357889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    int transform;
358889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
3595cbbce535744b89df5ecea95de21ee3733298260Romain Guyprotected:
3605cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
3615cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Adds an attribute with the specified name.
3625cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
3635cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The OpenGL name of the attribute.
3645cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
3655cbbce535744b89df5ecea95de21ee3733298260Romain Guy    int addAttrib(const char* name);
3665cbbce535744b89df5ecea95de21ee3733298260Romain Guy
3675cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
3683e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy     * Binds the specified attribute name to the specified slot.
3693e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy     */
3703e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    int bindAttrib(const char* name, ShaderBindings bindingSlot);
3713e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy
3723e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    /**
3735cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Adds a uniform with the specified name.
3745cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
3755cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The OpenGL name of the uniform.
3765cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
3775cbbce535744b89df5ecea95de21ee3733298260Romain Guy    int addUniform(const char* name);
3785cbbce535744b89df5ecea95de21ee3733298260Romain Guy
3795cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate:
3805cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
3815cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Compiles the specified shader of the specified type.
3825cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
3835cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The name of the compiled shader.
3845cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
3855cbbce535744b89df5ecea95de21ee3733298260Romain Guy    GLuint buildShader(const char* source, GLenum type);
3865cbbce535744b89df5ecea95de21ee3733298260Romain Guy
3873e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    // Name of the OpenGL program and shaders
38805bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    GLuint mProgramId;
3893e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    GLuint mVertexShader;
3903e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy    GLuint mFragmentShader;
3915cbbce535744b89df5ecea95de21ee3733298260Romain Guy
3925cbbce535744b89df5ecea95de21ee3733298260Romain Guy    // Keeps track of attributes and uniforms slots
39305bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    KeyedVector<const char*, int> mAttributes;
39405bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    KeyedVector<const char*, int> mUniforms;
395260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
396260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    bool mUse;
39767f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy    bool mInitialized;
39805bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy
39905bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    bool mHasColorUniform;
40005bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy    int mColorUniform;
4012d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy
4022d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy    bool mHasSampler;
4035cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Program
4045cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4055cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer
4065cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android
4075cbbce535744b89df5ecea95de21ee3733298260Romain Guy
4085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PROGRAM_H
409