SkiaShader.cpp revision 9cccc2b9bdd4850a3f9679569aaec3ab98477a5d
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "OpenGLRenderer" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <SkMatrix.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SkiaShader.h" 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Texture.h" 2599b49840d309727678b77403d6cc9f920111623fMathias Agopian#include "Matrix.h" 26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2799b49840d309727678b77403d6cc9f920111623fMathias Agopiannamespace android { 2899b49840d309727678b77403d6cc9f920111623fMathias Agopiannamespace uirenderer { 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian/////////////////////////////////////////////////////////////////////////////// 3199b49840d309727678b77403d6cc9f920111623fMathias Agopian// Support 32375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian/////////////////////////////////////////////////////////////////////////////// 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3499b49840d309727678b77403d6cc9f920111623fMathias Agopianstatic const GLenum gTextureUnitsMap[] = { 359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian GL_TEXTURE0, 367e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian GL_TEXTURE1, 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GL_TEXTURE2 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const GLint gTileModes[] = { 41f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian GL_CLAMP_TO_EDGE, // == SkShader::kClamp_TileMode 42f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian GL_REPEAT, // == SkShader::kRepeat_Mode 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GL_MIRRORED_REPEAT // == SkShader::kMirror_TileMode 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Base shader 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSkiaShader::SkiaShader(Type type, SkShader* key, SkShader::TileMode tileX, 51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian SkShader::TileMode tileY, SkMatrix* matrix, bool blend): 52a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mType(type), mKey(key), mTileX(tileX), mTileY(tileY), mMatrix(matrix), mBlend(blend) { 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSkiaShader::~SkiaShader() { 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaShader::describe(ProgramDescription& description, const Extensions& extensions) { 5996f0819f81293076e652792794a961543e6750d7Mathias Agopian} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaShader::setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, 6296f0819f81293076e652792794a961543e6750d7Mathias Agopian GLuint* textureUnit) { 6396f0819f81293076e652792794a961543e6750d7Mathias Agopian} 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6596f0819f81293076e652792794a961543e6750d7Mathias Agopianvoid SkiaShader::bindTexture(GLuint texture, GLenum wrapS, GLenum wrapT, GLuint textureUnit) { 6696f0819f81293076e652792794a961543e6750d7Mathias Agopian glActiveTexture(gTextureUnitsMap[textureUnit]); 6796f0819f81293076e652792794a961543e6750d7Mathias Agopian glBindTexture(GL_TEXTURE_2D, texture); 684f113740180b6512b43723c4728f262882dc9b45Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS); 69b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT); 7096f0819f81293076e652792794a961543e6750d7Mathias Agopian} 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 7396f0819f81293076e652792794a961543e6750d7Mathias Agopian// Bitmap shader 7496f0819f81293076e652792794a961543e6750d7Mathias Agopian/////////////////////////////////////////////////////////////////////////////// 750ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian 7696f0819f81293076e652792794a961543e6750d7Mathias AgopianSkiaBitmapShader::SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::TileMode tileX, 7796f0819f81293076e652792794a961543e6750d7Mathias Agopian SkShader::TileMode tileY, SkMatrix* matrix, bool blend): 7896f0819f81293076e652792794a961543e6750d7Mathias Agopian SkiaShader(kBitmap, key, tileX, tileY, matrix, blend), mBitmap(bitmap), mTexture(NULL) { 79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 80a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 8196f0819f81293076e652792794a961543e6750d7Mathias Agopianvoid SkiaBitmapShader::describe(ProgramDescription& description, const Extensions& extensions) { 824f113740180b6512b43723c4728f262882dc9b45Mathias Agopian const Texture* texture = mTextureCache->get(mBitmap); 83b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian if (!texture) return; 844f113740180b6512b43723c4728f262882dc9b45Mathias Agopian mTexture = texture; 854f113740180b6512b43723c4728f262882dc9b45Mathias Agopian 864f113740180b6512b43723c4728f262882dc9b45Mathias Agopian const float width = texture->width; 874f113740180b6512b43723c4728f262882dc9b45Mathias Agopian const float height = texture->height; 884f113740180b6512b43723c4728f262882dc9b45Mathias Agopian 894f113740180b6512b43723c4728f262882dc9b45Mathias Agopian description.hasBitmap = true; 904f113740180b6512b43723c4728f262882dc9b45Mathias Agopian // The driver does not support non-power of two mirrored/repeated 91b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // textures, so do it ourselves 92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian if (!extensions.hasNPot() && !isPowerOfTwo(width) && !isPowerOfTwo(height)) { 939a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis description.isBitmapNpot = true; 949a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis description.bitmapWrapS = gTileModes[mTileX]; 959a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis description.bitmapWrapT = gTileModes[mTileY]; 969a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 979a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis} 989a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 999a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisvoid SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView, 1009a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis const Snapshot& snapshot, GLuint* textureUnit) { 1019a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis GLuint textureSlot = (*textureUnit)++; 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glActiveTexture(gTextureUnitsMap[textureSlot]); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Texture* texture = mTexture; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTexture = NULL; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!texture) return; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const AutoTexture autoCleanup(texture); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float width = texture->width; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float height = texture->height; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mat4 textureTransform; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mMatrix) { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SkMatrix inverse; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mMatrix->invert(&inverse); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project textureTransform.load(inverse); 1170d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian textureTransform.multiply(modelView); 1182b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian } else { 1192b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian textureTransform.load(modelView); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12259119e658a12279e8fff508f8773843de2d90917Mathias Agopian // Uniforms 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bindTexture(texture->id, gTileModes[mTileX], gTileModes[mTileY], textureSlot); 124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glUniform1i(program->getUniform("bitmapSampler"), textureSlot); 125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glUniformMatrix4fv(program->getUniform("textureTransform"), 1, 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GL_FALSE, &textureTransform.data[0]); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glUniform2f(program->getUniform("textureDimension"), 1.0f / width, 1.0f / height); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Linear gradient shader 1322b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian/////////////////////////////////////////////////////////////////////////////// 1330d1318b974feba2e6ff13e36a1781343c2fce045Mathias Agopian 1342b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias AgopianSkiaLinearGradientShader::SkiaLinearGradientShader(float* bounds, uint32_t* colors, 1352b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian float* positions, int count, SkShader* key, SkShader::TileMode tileMode, 1362b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian SkMatrix* matrix, bool blend): 1372b92d89e23e1a2a07d0e0d01c00eed33ea580affMathias Agopian SkiaShader(kLinearGradient, key, tileMode, tileMode, matrix, blend), 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBounds(bounds), mColors(colors), mPositions(positions), mCount(count) { 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSkiaLinearGradientShader::~SkiaLinearGradientShader() { 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete[] mBounds; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete[] mColors; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete[] mPositions; 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopianvoid SkiaLinearGradientShader::describe(ProgramDescription& description, 148a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian const Extensions& extensions) { 149a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian description.hasGradient = true; 1501f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian} 151a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaLinearGradientShader::setupProgram(Program* program, const mat4& modelView, 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Snapshot& snapshot, GLuint* textureUnit) { 154a1e6bc864fb821c1b470b7aad9b75c441f54eeb4Mathias Agopian GLuint textureSlot = (*textureUnit)++; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glActiveTexture(gTextureUnitsMap[textureSlot]); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Texture* texture = mGradientCache->get(mKey); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!texture) { 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project texture = mGradientCache->addLinearGradient(mKey, mBounds, mColors, mPositions, 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCount, mTileX); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect start(mBounds[0], mBounds[1], mBounds[2], mBounds[3]); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mMatrix) { 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mat4 shaderMatrix(*mMatrix); 1667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian shaderMatrix.mapRect(start); 1679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 1687303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian snapshot.transform.mapRect(start); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const float gradientX = start.right - start.left; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float gradientY = start.bottom - start.top; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 173c08731e756868653d09d3e49b723706df3687070Mathias Agopian mat4 screenSpace(snapshot.transform); 174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis screenSpace.multiply(modelView); 175bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 176bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian // Uniforms 177bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian bindTexture(texture->id, gTileModes[mTileX], gTileModes[mTileY], textureSlot); 178bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian glUniform1i(program->getUniform("gradientSampler"), textureSlot); 179bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian glUniform2f(program->getUniform("gradientStart"), start.left, start.top); 180bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian glUniform2f(program->getUniform("gradient"), gradientX, gradientY); 181bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian glUniform1f(program->getUniform("gradientLength"), 18259119e658a12279e8fff508f8773843de2d90917Mathias Agopian 1.0f / (gradientX * gradientX + gradientY * gradientY)); 1839daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian glUniformMatrix4fv(program->getUniform("screenSpace"), 1, GL_FALSE, &screenSpace.data[0]); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Compose shader 188076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/////////////////////////////////////////////////////////////////////////////// 189076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 190076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianSkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second, 191ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian SkXfermode::Mode mode, SkShader* key): 192ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian SkiaShader(kCompose, key, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, 193b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) { 194b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 195b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaComposeShader::set(TextureCache* textureCache, GradientCache* gradientCache) { 1971f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian SkiaShader::set(textureCache, gradientCache); 1981f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian mFirst->set(textureCache, gradientCache); 1991f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian mSecond->set(textureCache, gradientCache); 2001f339ff3875afad128a8e16ee6395c5fad295826Mathias Agopian} 20196f0819f81293076e652792794a961543e6750d7Mathias Agopian 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaComposeShader::describe(ProgramDescription& description, const Extensions& extensions) { 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFirst->describe(description, extensions); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mSecond->describe(description, extensions); 205945ebbfd3dc07c7168602a1603eeb76ea7425376Mathias Agopian if (mFirst->type() == kBitmap) { 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project description.isBitmapFirst = true; 2070ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian } 2087e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian description.shadersMode = mMode; 2090ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian} 2100ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid SkiaComposeShader::setupProgram(Program* program, const mat4& modelView, 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Snapshot& snapshot, GLuint* textureUnit) { 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFirst->setupProgram(program, modelView, snapshot, textureUnit); 214b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mSecond->setupProgram(program, modelView, snapshot, textureUnit); 215f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian} 21696f0819f81293076e652792794a961543e6750d7Mathias Agopian 2171c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian}; // namespace uirenderer 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 219b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian