106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy/*
206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * Copyright (C) 2010 The Android Open Source Project
306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy *
406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * you may not use this file except in compliance with the License.
606f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * You may obtain a copy of the License at
706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy *
806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy *
1006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * Unless required by applicable law or agreed to in writing, software
1106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
1206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * See the License for the specific language governing permissions and
1406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * limitations under the License.
1506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy */
1606f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_SKIA_SHADER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_SKIA_SHADER_H
1906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
2006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <SkShader.h>
2106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <SkXfermode.h>
2206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
2306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <GLES2/gl2.h>
2406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
257953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
267953745dd565167113f8cbfc461bc0521d32d870Romain Guy
2706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "Extensions.h"
2806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "ProgramCache.h"
2906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "TextureCache.h"
3006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "GradientCache.h"
3106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
3206f96e2652e4855b6520ad9dd70583677605b79aRomain Guynamespace android {
3306f96e2652e4855b6520ad9dd70583677605b79aRomain Guynamespace uirenderer {
3406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
358aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guyclass Caches;
36d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass Layer;
3706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
3806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy/**
39d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * Type of Skia shader in use.
4006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy */
41d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIenum SkiaShaderType {
42d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    kNone_SkiaShaderType,
43d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    kBitmap_SkiaShaderType,
44d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    kGradient_SkiaShaderType,
45d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    kCompose_SkiaShaderType,
46d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    kLayer_SkiaShaderType
47d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III};
48d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III
49564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craikclass SkiaShader {
50564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craikpublic:
51d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static SkiaShaderType getType(const SkShader& shader);
52d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
53d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader);
54d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
55d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
56d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III};
57d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III
58d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass InvalidSkiaShader {
59d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIpublic:
60d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
61d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader) {
62d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III        // This shader is unsupported. Skip it.
6306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy    }
64d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
65d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader) {
66d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III        // This shader is unsupported. Skip it.
6714830948d02f768c41b97b7a8d15e1b3cab78267Romain Guy    }
6814830948d02f768c41b97b7a8d15e1b3cab78267Romain Guy
69d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III};
7006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy/**
713f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik * A shader that draws a layer.
723f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik */
73d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkiaLayerShader {
74d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIpublic:
75d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
76d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader);
77d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
78d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
79d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III}; // class SkiaLayerShader
803f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
813f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik/**
8206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * A shader that draws a bitmap.
8306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy */
84d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkiaBitmapShader {
85d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIpublic:
86d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
87d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader);
88d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
89d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
9006f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
9124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
92d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III}; // class SkiaBitmapShader
9306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
9406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy/**
95d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * A shader that draws one of three types of gradient, depending on shader param.
96ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy */
97d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkiaGradientShader {
98d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIpublic:
99d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
100d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader);
101d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
102d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
103d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III};
104ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy
105ddb80bebb0776e6d852aab6e8bba5d5591847a55Romain Guy/**
10606f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * A shader that draws two shaders, composited with an xfermode.
10706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy */
108d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkiaComposeShader {
109d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIpublic:
110d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void describe(Caches* caches, ProgramDescription& description,
111d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            const Extensions& extensions, const SkShader& shader);
112d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III    static void setupProgram(Caches* caches, const mat4& modelViewMatrix,
113d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III            GLuint* textureUnit, const Extensions& extensions, const SkShader& shader);
114d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III}; // class SkiaComposeShader
11506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
11606f96e2652e4855b6520ad9dd70583677605b79aRomain Guy}; // namespace uirenderer
11706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy}; // namespace android
11806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
1195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_SKIA_SHADER_H
120