blob: 2962441c6da2de6378a898e0dc91bd8fb118723a [file] [log] [blame]
Romain Guy06f96e22010-07-30 19:18:16 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_SKIA_SHADER_H
18#define ANDROID_HWUI_SKIA_SHADER_H
Romain Guy06f96e22010-07-30 19:18:16 -070019
Chris Craik922d3a72015-02-13 17:47:21 -080020#include "FloatColor.h"
21#include "Matrix.h"
Romain Guy06f96e22010-07-30 19:18:16 -070022
23#include <GLES2/gl2.h>
Chris Craik922d3a72015-02-13 17:47:21 -080024#include <SkShader.h>
25#include <SkXfermode.h>
Romain Guy79537452011-10-12 13:48:51 -070026#include <cutils/compiler.h>
27
Romain Guy06f96e22010-07-30 19:18:16 -070028namespace android {
29namespace uirenderer {
30
Romain Guy8aa195d2013-06-04 18:00:09 -070031class Caches;
Tom Hudson2dc236b2014-10-15 15:46:42 -040032class Extensions;
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -040033class Layer;
Chris Craik922d3a72015-02-13 17:47:21 -080034class Texture;
Tom Hudson73edbfe2014-10-16 09:10:41 -040035struct ProgramDescription;
Romain Guy06f96e22010-07-30 19:18:16 -070036
37/**
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -040038 * Type of Skia shader in use.
Chris Craik922d3a72015-02-13 17:47:21 -080039 *
40 * Note that kBitmap | kGradient = kCompose, since Compose implies
41 * both its component types are in use simultaneously. No other
42 * composition of multiple types is supported.
Romain Guy06f96e22010-07-30 19:18:16 -070043 */
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -040044enum SkiaShaderType {
Chris Craik922d3a72015-02-13 17:47:21 -080045 kNone_SkiaShaderType = 0,
46 kBitmap_SkiaShaderType = 1,
47 kGradient_SkiaShaderType = 2,
48 kCompose_SkiaShaderType = kBitmap_SkiaShaderType | kGradient_SkiaShaderType,
49 kLayer_SkiaShaderType = 4,
50};
51
52struct SkiaShaderData {
53 SkiaShaderType skiaShaderType;
54 struct BitmapShaderData {
55 Texture* bitmapTexture;
56 GLuint bitmapSampler;
57 GLenum wrapS;
58 GLenum wrapT;
59
60 Matrix4 textureTransform;
61 float textureDimension[2];
62 } bitmapData;
63 struct GradientShaderData {
64 Matrix4 screenSpace;
65 GLuint ditherSampler;
66
67 // simple gradient
68 FloatColor startColor;
69 FloatColor endColor;
70
71 // complex gradient
72 Texture* gradientTexture;
73 GLuint gradientSampler;
74 GLenum wrapST;
75
76 } gradientData;
77 struct LayerShaderData {
78 Layer* layer;
79 GLuint bitmapSampler;
80 GLenum wrapS;
81 GLenum wrapT;
82
83 Matrix4 textureTransform;
84 float textureDimension[2];
85 } layerData;
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -040086};
87
Chris Craik564acf72014-01-02 16:46:18 -080088class SkiaShader {
89public:
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -040090 static SkiaShaderType getType(const SkShader& shader);
91 static void describe(Caches* caches, ProgramDescription& description,
92 const Extensions& extensions, const SkShader& shader);
93 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
94 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
Chris Craik922d3a72015-02-13 17:47:21 -080095
96 // new SkiaShader interaction model - store into ShaderData, and apply to Caches/Program/GL
97 static void store(Caches& caches, const SkShader* shader, const Matrix4& modelViewMatrix,
98 GLuint* textureUnit, ProgramDescription* description,
99 SkiaShaderData* outData);
100 static void apply(Caches& caches, const SkiaShaderData& data);
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400101};
Romain Guy06f96e22010-07-30 19:18:16 -0700102
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400103class InvalidSkiaShader {
104public:
Andreas Gampe64bb4132014-11-22 00:35:09 +0000105 static void describe(Caches* caches, ProgramDescription& description,
106 const Extensions& extensions, const SkShader& shader) {
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400107 // This shader is unsupported. Skip it.
108 }
Andreas Gampe64bb4132014-11-22 00:35:09 +0000109 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
110 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader) {
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400111 // This shader is unsupported. Skip it.
Chet Haase5c13d892010-10-08 08:37:55 -0700112 }
113
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400114};
Romain Guy06f96e22010-07-30 19:18:16 -0700115/**
Chris Craik3f0854292014-04-15 16:18:08 -0700116 * A shader that draws a layer.
117 */
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400118class SkiaLayerShader {
119public:
120 static void describe(Caches* caches, ProgramDescription& description,
121 const Extensions& extensions, const SkShader& shader);
122 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
123 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
124}; // class SkiaLayerShader
Chris Craik3f0854292014-04-15 16:18:08 -0700125
126/**
Romain Guy06f96e22010-07-30 19:18:16 -0700127 * A shader that draws a bitmap.
128 */
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400129class SkiaBitmapShader {
130public:
131 static void describe(Caches* caches, ProgramDescription& description,
132 const Extensions& extensions, const SkShader& shader);
133 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
134 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
Romain Guy06f96e22010-07-30 19:18:16 -0700135
Romain Guy06f96e22010-07-30 19:18:16 -0700136
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400137}; // class SkiaBitmapShader
Romain Guy06f96e22010-07-30 19:18:16 -0700138
139/**
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400140 * A shader that draws one of three types of gradient, depending on shader param.
Romain Guy06f96e22010-07-30 19:18:16 -0700141 */
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400142class SkiaGradientShader {
143public:
144 static void describe(Caches* caches, ProgramDescription& description,
145 const Extensions& extensions, const SkShader& shader);
146 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
147 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
148};
Romain Guyddb80be2010-09-20 19:04:33 -0700149
150/**
Romain Guy06f96e22010-07-30 19:18:16 -0700151 * A shader that draws two shaders, composited with an xfermode.
152 */
Leon Scroggins IIId1ad5e62014-05-05 12:50:38 -0400153class SkiaComposeShader {
154public:
155 static void describe(Caches* caches, ProgramDescription& description,
156 const Extensions& extensions, const SkShader& shader);
157 static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
158 GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
159}; // class SkiaComposeShader
Romain Guy06f96e22010-07-30 19:18:16 -0700160
161}; // namespace uirenderer
162}; // namespace android
163
Romain Guy5b3b3522010-10-27 18:57:51 -0700164#endif // ANDROID_HWUI_SKIA_SHADER_H