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 804121063313ac0d6f69f6253cac821d0c1c122086Romain Guy#define PROGRAM_HAS_GAMMA_CORRECTION 40 814121063313ac0d6f69f6253cac821d0c1c122086Romain Guy 8242e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy#define PROGRAM_IS_SIMPLE_GRADIENT 41 8342e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy 84710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik#define PROGRAM_IS_VERTEX_SHAPE_SHIFT 42 856ebdc114e0d72137394f02bc8ffe9d7a782a65c4Chris Craik 86f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 87f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Types 88f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 89f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 90f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guytypedef uint64_t programid; 91f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 92f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 93f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Program description 94f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 95f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 96f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/** 97f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Describe the features required for a given program. The features 98f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * determine the generation of both the vertex and fragment shaders. 99f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * A ProgramDescription must be used in conjunction with a ProgramCache. 100f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 101f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guystruct ProgramDescription { 102f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy enum ColorModifier { 10342e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy kColorNone = 0, 104f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorMatrix, 105f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorLighting, 106f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorBlend 107f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy }; 108f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 109f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy enum Gradient { 11042e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy kGradientLinear = 0, 111f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kGradientCircular, 112f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kGradientSweep 113f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy }; 114f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 115f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy ProgramDescription() { 116f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy reset(); 117f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 118f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 119f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Texturing 120f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasTexture; 121f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasAlpha8Texture; 122f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasExternalTexture; 123f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasTextureTransform; 124f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 125f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Modulate, this should only be set when setColor() return true 126f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool modulate; 127f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 128f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Shaders 129f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasBitmap; 130f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isBitmapNpot; 131f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 132f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isAA; 133710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik bool isVertexShape; 134f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 135f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasGradient; 136f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy Gradient gradientType; 13742e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy bool isSimpleGradient; 138f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 139f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode shadersMode; 140f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 141f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isBitmapFirst; 142f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy GLenum bitmapWrapS; 143f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy GLenum bitmapWrapT; 144f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 145f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Color operations 146f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy ColorModifier colorOp; 147f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode colorMode; 148f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 149f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Framebuffer blending (requires Extensions.hasFramebufferFetch()) 150f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Ignored for all values < SkXfermode::kPlus_Mode 151f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode framebufferMode; 152f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool swapSrcDst; 153f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 154f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isPoint; 155f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy float pointSize; 156f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 1574121063313ac0d6f69f6253cac821d0c1c122086Romain Guy bool hasGammaCorrection; 1584121063313ac0d6f69f6253cac821d0c1c122086Romain Guy float gamma; 1594121063313ac0d6f69f6253cac821d0c1c122086Romain Guy 160f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 161f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Resets this description. All fields are reset back to the default 162f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * values they hold after building a new instance. 163f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 164f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy void reset() { 165f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasTexture = false; 166f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasAlpha8Texture = false; 167f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasExternalTexture = false; 168f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasTextureTransform = false; 169f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 170f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isAA = false; 171710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik isVertexShape = false; 172f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 173f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy modulate = false; 174f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 175f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasBitmap = false; 176f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isBitmapNpot = false; 177f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 178f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasGradient = false; 179f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy gradientType = kGradientLinear; 18042e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy isSimpleGradient = false; 181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 182f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy shadersMode = SkXfermode::kClear_Mode; 183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isBitmapFirst = false; 185f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bitmapWrapS = GL_CLAMP_TO_EDGE; 186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bitmapWrapT = GL_CLAMP_TO_EDGE; 187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 188f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy colorOp = kColorNone; 189f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy colorMode = SkXfermode::kClear_Mode; 190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 191f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy framebufferMode = SkXfermode::kClear_Mode; 192f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy swapSrcDst = false; 193f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 194f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isPoint = false; 195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy pointSize = 0.0f; 1964121063313ac0d6f69f6253cac821d0c1c122086Romain Guy 1974121063313ac0d6f69f6253cac821d0c1c122086Romain Guy hasGammaCorrection = false; 1984121063313ac0d6f69f6253cac821d0c1c122086Romain Guy gamma = 2.2f; 199f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 200f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 201f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 202f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Indicates, for a given color, whether color modulation is required in 203f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * the fragment shader. When this method returns true, the program should 204f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * be provided with a modulation color. 205f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 206f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool setColor(const float r, const float g, const float b, const float a) { 207a938f569ce206c1ed68d736181016b5b708c0084Romain Guy modulate = a < COLOR_COMPONENT_THRESHOLD; 208f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return modulate; 209f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 210f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 211f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 212f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Indicates, for a given color, whether color modulation is required in 213f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * the fragment shader. When this method returns true, the program should 214f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * be provided with a modulation color. 215f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 216f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool setAlpha8Color(const float r, const float g, const float b, const float a) { 217f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD || 218f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD; 219f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return modulate; 220f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 221f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 222f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 223f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Computes the unique key identifying this program. 224f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 225f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid key() const { 226f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid key = 0; 227f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasTexture) key |= PROGRAM_KEY_TEXTURE; 228f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; 229f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasBitmap) { 230f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_BITMAP; 231f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isBitmapNpot) { 232f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_BITMAP_NPOT; 233f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; 234f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; 235f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 236f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 237f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasGradient) key |= PROGRAM_KEY_GRADIENT; 238f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT; 239f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST; 240f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasBitmap && hasGradient) { 241f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT; 242f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 243f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy switch (colorOp) { 244f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorMatrix: 245f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_MATRIX; 246f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 247f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorLighting: 248f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_LIGHTING; 249f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 250f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorBlend: 251f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_BLEND; 252f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT; 253f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 254f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorNone: 255f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 256f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 257f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT; 258f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST; 259f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT; 260f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isPoint) key |= programid(0x1) << PROGRAM_IS_POINT_SHIFT; 261f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isAA) key |= programid(0x1) << PROGRAM_HAS_AA_SHIFT; 262f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasExternalTexture) key |= programid(0x1) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT; 263f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT; 2644121063313ac0d6f69f6253cac821d0c1c122086Romain Guy if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION; 26542e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT; 266710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik if (isVertexShape) key |= programid(0x1) << PROGRAM_IS_VERTEX_SHAPE_SHIFT; 267f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return key; 268f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 269f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 270f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 271f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Logs the specified message followed by the key identifying this program. 272f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 273f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy void log(const char* message) const { 274f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS 275f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid k = key(); 276f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32), 277f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy uint32_t(k & 0xffffffff)); 278f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif 279f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 280f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 281f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guyprivate: 2824121063313ac0d6f69f6253cac821d0c1c122086Romain Guy static inline uint32_t getEnumForWrap(GLenum wrap) { 283f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy switch (wrap) { 284f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_CLAMP_TO_EDGE: 285f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 0; 286f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_REPEAT: 287f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 1; 288f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_MIRRORED_REPEAT: 289f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 2; 290f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 291f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 0; 292f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 293f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 294f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy}; // struct ProgramDescription 295f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 2965cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 2975cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A program holds a vertex and a fragment shader. It offers several utility 2985cbbce535744b89df5ecea95de21ee3733298260Romain Guy * methods to query attributes and uniforms. 2995cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 300889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guyclass Program { 3015cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 3023e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy enum ShaderBindings { 3033e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy kBindingPosition, 3043e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy kBindingTexCoords 3053e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy }; 3063e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy 3075cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3085cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Creates a new program with the specified vertex and fragment 3095cbbce535744b89df5ecea95de21ee3733298260Romain Guy * shaders sources. 3105cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 311f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy Program(const ProgramDescription& description, const char* vertex, const char* fragment); 3126926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual ~Program(); 3135cbbce535744b89df5ecea95de21ee3733298260Romain Guy 3145cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3155cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Binds this program to the GL context. 3165cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 3176926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual void use(); 3185cbbce535744b89df5ecea95de21ee3733298260Romain Guy 319260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy /** 320260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * Marks this program as unused. This will not unbind 321260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * the program from the GL context. 322260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy */ 3236926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual void remove(); 324260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 325260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy /** 326ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Returns the OpenGL name of the specified attribute. 327ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */ 328ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy int getAttrib(const char* name); 329ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy 330ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy /** 331ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Returns the OpenGL name of the specified uniform. 332ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */ 333ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy int getUniform(const char* name); 334ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy 335ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy /** 336260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * Indicates whether this program is currently in use with 337260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * the GL context. 338260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy */ 339260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy inline bool isInUse() const { 340260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy return mUse; 341260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy } 342260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 343889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 34467f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy * Indicates whether this program was correctly compiled and linked. 34567f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy */ 34667f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy inline bool isInitialized() const { 34767f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy return mInitialized; 34867f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy } 34967f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy 35067f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy /** 351889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * Binds the program with the specified projection, modelView and 352889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * transform matrices. 353889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 354889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy void set(const mat4& projectionMatrix, const mat4& modelViewMatrix, 3558a5cc92a150bae38ec43732d941b38bb381fe153Chet Haase const mat4& transformMatrix, bool offset = false); 356889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 357889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 358707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy * Sets the color associated with this shader. 359889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 360707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy void setColor(const float r, const float g, const float b, const float a); 361889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 362889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 363707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy * Name of the position attribute. 364889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 365707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy int position; 366889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 367889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 368f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Name of the texCoords attribute if it exists, -1 otherwise. 369f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 370f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy int texCoords; 371f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 372f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 373889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * Name of the transform uniform. 374889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 375889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy int transform; 376889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 37739284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy /** 37839284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy * Name of the projection uniform. 37939284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy */ 38039284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy int projection; 38139284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy 3825cbbce535744b89df5ecea95de21ee3733298260Romain Guyprotected: 3835cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3845cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Adds an attribute with the specified name. 3855cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 3865cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The OpenGL name of the attribute. 3875cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 3885cbbce535744b89df5ecea95de21ee3733298260Romain Guy int addAttrib(const char* name); 3895cbbce535744b89df5ecea95de21ee3733298260Romain Guy 3905cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3913e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy * Binds the specified attribute name to the specified slot. 3923e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy */ 3933e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy int bindAttrib(const char* name, ShaderBindings bindingSlot); 3943e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy 3953e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy /** 3965cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Adds a uniform with the specified name. 3975cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 3985cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The OpenGL name of the uniform. 3995cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 4005cbbce535744b89df5ecea95de21ee3733298260Romain Guy int addUniform(const char* name); 4015cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4025cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 4035cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 4045cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Compiles the specified shader of the specified type. 4055cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 4065cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The name of the compiled shader. 4075cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 4085cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint buildShader(const char* source, GLenum type); 4095cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4103e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy // Name of the OpenGL program and shaders 41105bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy GLuint mProgramId; 4123e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy GLuint mVertexShader; 4133e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy GLuint mFragmentShader; 4145cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4155cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Keeps track of attributes and uniforms slots 41605bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy KeyedVector<const char*, int> mAttributes; 41705bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy KeyedVector<const char*, int> mUniforms; 418260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 419260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy bool mUse; 42067f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy bool mInitialized; 42105bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy 42205bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy bool mHasColorUniform; 42305bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy int mColorUniform; 4242d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy 4252d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy bool mHasSampler; 4265cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Program 4275cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4285cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 4295cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 4305cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PROGRAM_H 432