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