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