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