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 27096b8d96d539429de5e67b2821ef3f9ee0300842Chris Craik#include "Debug.h" 280b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy#include "Matrix.h" 29f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#include "Properties.h" 300b9db91c3dc8007b47c8fd4fb9dd85be97201a88Romain Guy 315cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android { 325cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer { 335cbbce535744b89df5ecea95de21ee3733298260Romain Guy 34f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 35f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Defines 36f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 37f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 38f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Debug 39f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS 405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define PROGRAM_LOGD(...) ALOGD(__VA_ARGS__) 41f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#else 42f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy #define PROGRAM_LOGD(...) 43f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif 44f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 45f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_THRESHOLD 1.0f 46f877308f77f7c6f3edd91618a092207dd3be9077Romain Guy#define COLOR_COMPONENT_INV_THRESHOLD 0.0f 47f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 48f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_TEXTURE 0x1 49f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_A8_TEXTURE 0x2 50f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP 0x4 51f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_GRADIENT 0x8 52f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_FIRST 0x10 53f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_MATRIX 0x20 54f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_LIGHTING 0x40 55f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_COLOR_BLEND 0x80 56f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_NPOT 0x100 57f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_SWAP_SRC_DST 0x2000 58f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 59f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600 60f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800 61f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 62f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Encode the xfermodes on 6 bits 63f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MAX_XFERMODE 0x1f 64f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_SHADER_SHIFT 26 65f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20 66f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14 67f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 68f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPS_SHIFT 9 69f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_BITMAP_WRAPT_SHIFT 11 70f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 716d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_GRADIENT_TYPE_SHIFT 33 // 2 bits for gradient type 72f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#define PROGRAM_MODULATE_SHIFT 35 73f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 746d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_AA_SHIFT 36 75f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 766d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 37 776d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 38 78f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 796d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_GAMMA_CORRECTION 39 80f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 816d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_IS_SIMPLE_GRADIENT 40 824121063313ac0d6f69f6253cac821d0c1c122086Romain Guy 836d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_COLORS 41 8442e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy 856d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_HAS_DEBUG_HIGHLIGHT 42 866d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#define PROGRAM_EMULATE_STENCIL 43 873ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 88f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 89f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Types 90f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 91f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 92f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guytypedef uint64_t programid; 93f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 94f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 95f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy// Program description 96f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/////////////////////////////////////////////////////////////////////////////// 97f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 98f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy/** 99f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Describe the features required for a given program. The features 100f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * determine the generation of both the vertex and fragment shaders. 101f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * A ProgramDescription must be used in conjunction with a ProgramCache. 102f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 103f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guystruct ProgramDescription { 104f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy enum ColorModifier { 10542e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy kColorNone = 0, 106f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorMatrix, 107f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorLighting, 108f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kColorBlend 109f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy }; 110f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 111f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy enum Gradient { 11242e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy kGradientLinear = 0, 113f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kGradientCircular, 114f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy kGradientSweep 115f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy }; 116f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 117f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy ProgramDescription() { 118f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy reset(); 119f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 120f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 121f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Texturing 122f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasTexture; 123f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasAlpha8Texture; 124f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasExternalTexture; 125f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasTextureTransform; 126f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 127ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy // Color attribute 128ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy bool hasColors; 129ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy 130f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Modulate, this should only be set when setColor() return true 131f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool modulate; 132f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 133f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Shaders 134f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasBitmap; 135f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isBitmapNpot; 136f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 13765cd612face362d054a85d0f7e5881c59cd523beChris Craik bool isAA; // drawing with a per-vertex alpha 138f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 139f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool hasGradient; 140f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy Gradient gradientType; 14142e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy bool isSimpleGradient; 142f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 143f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode shadersMode; 144f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 145f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool isBitmapFirst; 146f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy GLenum bitmapWrapS; 147f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy GLenum bitmapWrapT; 148f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 149f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Color operations 150f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy ColorModifier colorOp; 151f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode colorMode; 152f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 153f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Framebuffer blending (requires Extensions.hasFramebufferFetch()) 154f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy // Ignored for all values < SkXfermode::kPlus_Mode 155f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy SkXfermode::Mode framebufferMode; 156f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool swapSrcDst; 157f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 1584121063313ac0d6f69f6253cac821d0c1c122086Romain Guy bool hasGammaCorrection; 1594121063313ac0d6f69f6253cac821d0c1c122086Romain Guy float gamma; 1604121063313ac0d6f69f6253cac821d0c1c122086Romain Guy 1613ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy bool hasDebugHighlight; 16278dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy bool emulateStencil; 1633ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 164f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 165f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Resets this description. All fields are reset back to the default 166f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * values they hold after building a new instance. 167f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 168f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy void reset() { 169f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasTexture = false; 170f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasAlpha8Texture = false; 171f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasExternalTexture = false; 172f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasTextureTransform = false; 173f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 174ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy hasColors = false; 175ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy 176f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isAA = false; 177f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 178f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy modulate = false; 179f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 180f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasBitmap = false; 181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isBitmapNpot = false; 182f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy hasGradient = false; 184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy gradientType = kGradientLinear; 18542e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy isSimpleGradient = false; 186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy shadersMode = SkXfermode::kClear_Mode; 188f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 189f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy isBitmapFirst = false; 190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bitmapWrapS = GL_CLAMP_TO_EDGE; 191f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bitmapWrapT = GL_CLAMP_TO_EDGE; 192f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 193f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy colorOp = kColorNone; 194f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy colorMode = SkXfermode::kClear_Mode; 195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 196f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy framebufferMode = SkXfermode::kClear_Mode; 197f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy swapSrcDst = false; 198f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 1994121063313ac0d6f69f6253cac821d0c1c122086Romain Guy hasGammaCorrection = false; 2004121063313ac0d6f69f6253cac821d0c1c122086Romain Guy gamma = 2.2f; 2013ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy 2023ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy hasDebugHighlight = false; 203f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 204f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 205f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 206f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Indicates, for a given color, whether color modulation is required in 207f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * the fragment shader. When this method returns true, the program should 208f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * be provided with a modulation color. 209f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 210f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool setColor(const float r, const float g, const float b, const float a) { 211a938f569ce206c1ed68d736181016b5b708c0084Romain Guy modulate = a < COLOR_COMPONENT_THRESHOLD; 212f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return modulate; 213f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 214f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 215f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 216f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Indicates, for a given color, whether color modulation is required in 217f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * the fragment shader. When this method returns true, the program should 218f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * be provided with a modulation color. 219f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 220f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy bool setAlpha8Color(const float r, const float g, const float b, const float a) { 221f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD || 222f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD; 223f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return modulate; 224f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 225f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 226f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 227f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Computes the unique key identifying this program. 228f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 229f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid key() const { 230f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid key = 0; 231f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasTexture) key |= PROGRAM_KEY_TEXTURE; 232f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; 233f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasBitmap) { 234f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_BITMAP; 235f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isBitmapNpot) { 236f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_BITMAP_NPOT; 237f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; 238f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; 239f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 240f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 241f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasGradient) key |= PROGRAM_KEY_GRADIENT; 242f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT; 243f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST; 244f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasBitmap && hasGradient) { 245f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT; 246f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 247f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy switch (colorOp) { 248f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorMatrix: 249f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_MATRIX; 250f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 251f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorLighting: 252f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_LIGHTING; 253f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 254f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorBlend: 255f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= PROGRAM_KEY_COLOR_BLEND; 256f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT; 257f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 258f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case kColorNone: 259f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy break; 260f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 261f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT; 262f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST; 263f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT; 264f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (isAA) key |= programid(0x1) << PROGRAM_HAS_AA_SHIFT; 265f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasExternalTexture) key |= programid(0x1) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT; 266f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT; 2674121063313ac0d6f69f6253cac821d0c1c122086Romain Guy if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION; 26842e1e0d482d774cf18a55773e434f02edb9e4462Romain Guy if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT; 269ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy if (hasColors) key |= programid(0x1) << PROGRAM_HAS_COLORS; 2703ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy if (hasDebugHighlight) key |= programid(0x1) << PROGRAM_HAS_DEBUG_HIGHLIGHT; 27178dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy if (emulateStencil) key |= programid(0x1) << PROGRAM_EMULATE_STENCIL; 272f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return key; 273f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 274f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 275f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 276f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Logs the specified message followed by the key identifying this program. 277f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 278f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy void log(const char* message) const { 279f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#if DEBUG_PROGRAMS 280f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy programid k = key(); 281f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32), 282f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy uint32_t(k & 0xffffffff)); 283f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy#endif 284f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 285f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 286f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guyprivate: 2874121063313ac0d6f69f6253cac821d0c1c122086Romain Guy static inline uint32_t getEnumForWrap(GLenum wrap) { 288f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy switch (wrap) { 289f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_CLAMP_TO_EDGE: 290f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 0; 291f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_REPEAT: 292f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 1; 293f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy case GL_MIRRORED_REPEAT: 294f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 2; 295f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 296f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy return 0; 297f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy } 298f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 299f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy}; // struct ProgramDescription 300f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 3015cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 3025cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A program holds a vertex and a fragment shader. It offers several utility 3035cbbce535744b89df5ecea95de21ee3733298260Romain Guy * methods to query attributes and uniforms. 3045cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 305889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guyclass Program { 3065cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 3073e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy enum ShaderBindings { 3083e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy kBindingPosition, 3093e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy kBindingTexCoords 3103e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy }; 3113e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy 3125cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3135cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Creates a new program with the specified vertex and fragment 3145cbbce535744b89df5ecea95de21ee3733298260Romain Guy * shaders sources. 3155cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 316f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy Program(const ProgramDescription& description, const char* vertex, const char* fragment); 3176926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual ~Program(); 3185cbbce535744b89df5ecea95de21ee3733298260Romain Guy 3195cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3205cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Binds this program to the GL context. 3215cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 3226926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual void use(); 3235cbbce535744b89df5ecea95de21ee3733298260Romain Guy 324260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy /** 325260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * Marks this program as unused. This will not unbind 326260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * the program from the GL context. 327260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy */ 3286926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy virtual void remove(); 329260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 330260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy /** 331ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Returns the OpenGL name of the specified attribute. 332ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */ 333ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy int getAttrib(const char* name); 334ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy 335ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy /** 336ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Returns the OpenGL name of the specified uniform. 337ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */ 338ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy int getUniform(const char* name); 339ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy 340ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy /** 341260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * Indicates whether this program is currently in use with 342260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy * the GL context. 343260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy */ 344260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy inline bool isInUse() const { 345260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy return mUse; 346260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy } 347260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 348889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 34967f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy * Indicates whether this program was correctly compiled and linked. 35067f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy */ 35167f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy inline bool isInitialized() const { 35267f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy return mInitialized; 35367f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy } 35467f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy 35567f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy /** 356889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * Binds the program with the specified projection, modelView and 357889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * transform matrices. 358889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 359889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy void set(const mat4& projectionMatrix, const mat4& modelViewMatrix, 3608a5cc92a150bae38ec43732d941b38bb381fe153Chet Haase const mat4& transformMatrix, bool offset = false); 361889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 362889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 363707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy * Sets the color associated with this shader. 364889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 365707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy void setColor(const float r, const float g, const float b, const float a); 366889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 367889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 368707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy * Name of the position attribute. 369889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 370707b2f78ccaa09965d7e030fda3a883ce9b75ea8Romain Guy int position; 371889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 372889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy /** 373f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy * Name of the texCoords attribute if it exists, -1 otherwise. 374f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy */ 375f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy int texCoords; 376f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy 377f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy /** 378889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy * Name of the transform uniform. 379889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy */ 380889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy int transform; 381889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy 38239284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy /** 38339284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy * Name of the projection uniform. 38439284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy */ 38539284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy int projection; 38639284b763a09688468ed3799ebd2ebb76ea5dfd5Romain Guy 3875cbbce535744b89df5ecea95de21ee3733298260Romain Guyprotected: 3885cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3895cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Adds an attribute with the specified name. 3905cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 3915cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The OpenGL name of the attribute. 3925cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 3935cbbce535744b89df5ecea95de21ee3733298260Romain Guy int addAttrib(const char* name); 3945cbbce535744b89df5ecea95de21ee3733298260Romain Guy 3955cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 3963e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy * Binds the specified attribute name to the specified slot. 3973e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy */ 3983e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy int bindAttrib(const char* name, ShaderBindings bindingSlot); 3993e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy 4003e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy /** 4015cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Adds a uniform with the specified name. 4025cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 4035cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The OpenGL name of the uniform. 4045cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 4055cbbce535744b89df5ecea95de21ee3733298260Romain Guy int addUniform(const char* name); 4065cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4075cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 4085cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 4095cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Compiles the specified shader of the specified type. 4105cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 4115cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @return The name of the compiled shader. 4125cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 4135cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint buildShader(const char* source, GLenum type); 4145cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4153e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy // Name of the OpenGL program and shaders 41605bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy GLuint mProgramId; 4173e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy GLuint mVertexShader; 4183e263fac8c9c0e0fb242186b514a7af8efb40961Romain Guy GLuint mFragmentShader; 4195cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4205cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Keeps track of attributes and uniforms slots 42105bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy KeyedVector<const char*, int> mAttributes; 42205bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy KeyedVector<const char*, int> mUniforms; 423260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy 424260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy bool mUse; 42567f27952c1bcb2230beef9b5ca0bf42edad436a9Romain Guy bool mInitialized; 42605bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy 4273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy // Uniforms caching 42805bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy bool mHasColorUniform; 42905bbde70fd2a3af737656b9f8c5a25b56429632eRomain Guy int mColorUniform; 4302d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy 4312d4fd364843d3efc6e6ee59ccc5beb513a86d789Romain Guy bool mHasSampler; 4323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 4333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mat4 mProjection; 4345d39a77992ba6573fbc0cd4d85e0390bb5feb637Chris Craik bool mOffset; 4355cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Program 4365cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4375cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 4385cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 4395cbbce535744b89df5ecea95de21ee3733298260Romain Guy 4405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PROGRAM_H 441