Glop.h revision f42bf3e2573bccb01babec448f925e9395bf224c
16c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/*
26c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Copyright (C) 2015 The Android Open Source Project
36c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
46c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
56c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * you may not use this file except in compliance with the License.
66c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * You may obtain a copy of the License at
76c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
86c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
96c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
106c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Unless required by applicable law or agreed to in writing, software
116c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
126c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * See the License for the specific language governing permissions and
146c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * limitations under the License.
156c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
166c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
176c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#ifndef ANDROID_HWUI_GLOP_H
186c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#define ANDROID_HWUI_GLOP_H
196c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
200519c810a56bded1284fcb2ae40f438878c6585fChris Craik#include "FloatColor.h"
216c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Matrix.h"
22922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik#include "Program.h"
236c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Rect.h"
24922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik#include "SkiaShader.h"
256c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "utils/Macros.h"
266c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
276c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2.h>
286c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2ext.h>
29031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik#include <SkXfermode.h>
306c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
316c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace android {
326c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace uirenderer {
336c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
34031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craikclass Program;
350519c810a56bded1284fcb2ae40f438878c6585fChris Craikclass RoundRectClipState;
36922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craikclass Texture;
37031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik
386c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/*
396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Enumerates optional vertex attributes
406c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Position is always enabled by MeshState, these other attributes
426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * are enabled/disabled dynamically based on mesh content.
436c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
4453e51e4aa933f9603587e1780f446c18816bf9beChris Craik
4553e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace VertexAttribFlags {
4653e51e4aa933f9603587e1780f446c18816bf9beChris Craik    enum {
4753e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
4853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        TextureCoord = 1 << 0,
4953e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Color = 1 << 1,
5053e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Alpha = 1 << 2,
5153e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
5253e51e4aa933f9603587e1780f446c18816bf9beChris Craik};
5353e51e4aa933f9603587e1780f446c18816bf9beChris Craik
5453e51e4aa933f9603587e1780f446c18816bf9beChris Craik/*
5553e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Enumerates transform features
5653e51e4aa933f9603587e1780f446c18816bf9beChris Craik */
5753e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace TransformFlags {
5853e51e4aa933f9603587e1780f446c18816bf9beChris Craik    enum {
5953e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
6053e51e4aa933f9603587e1780f446c18816bf9beChris Craik
6153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // offset the eventual drawing matrix by a tiny amount to
6253e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // disambiguate sampling patterns with non-AA rendering
6353e51e4aa933f9603587e1780f446c18816bf9beChris Craik        OffsetByFudgeFactor = 1 << 0,
6453e51e4aa933f9603587e1780f446c18816bf9beChris Craik
6553e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform isn't applied to the mesh at draw time,
6653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        //since it's already built in.
67e4db79de127cfe961195f52907af8451026eaa20Chris Craik        MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS
6853e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
696c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
706c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
716c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/**
720519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Structure containing all data required to issue an OpenGL draw
736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform
756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the
766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data
770519c810a56bded1284fcb2ae40f438878c6585fChris Craik * managed.
780519c810a56bded1284fcb2ae40f438878c6585fChris Craik *
790519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Eventually, a Glop should be able to be drawn multiple times from
800519c810a56bded1284fcb2ae40f438878c6585fChris Craik * a single construction, up until GL context destruction. Currently,
810519c810a56bded1284fcb2ae40f438878c6585fChris Craik * vertex/index/Texture/RoundRectClipState pointers prevent this from
820519c810a56bded1284fcb2ae40f438878c6585fChris Craik * being safe.
836c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
846c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop {
85f42bf3e2573bccb01babec448f925e9395bf224csergeyv    PREVENT_COPY_AND_ASSIGN(Glop);
86f42bf3e2573bccb01babec448f925e9395bf224csergeyvpublic:
87f42bf3e2573bccb01babec448f925e9395bf224csergeyv    Glop() { }
886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
90ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
91ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void* are mutually exclusive.
92ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // Only GL_UNSIGNED_SHORT supported.
93ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Indices {
94ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
95ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* indices;
96ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } indices;
97ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
98ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void*s are mutually exclusive.
99ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // TODO: enforce mutual exclusion with restricted setters and/or unions
100ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Vertices {
101ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
102eb911c2b0e8edeb7595a98af4b9f1bd47de1381eChris Craik            int attribFlags;
103ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* position;
104ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* texCoord;
105ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* color;
106ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLsizei stride;
107ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } vertices;
108ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
1090519c810a56bded1284fcb2ae40f438878c6585fChris Craik        int elementCount;
1100519c810a56bded1284fcb2ae40f438878c6585fChris Craik        TextureVertex mappedVertices[4];
1116c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } mesh;
1126c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1136c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Fill {
1146c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Program* program;
11530036092b40badecbe64d9c2bff4850132147f78Chris Craik
116f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        struct TextureData {
117f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            Texture* texture;
11826bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            GLenum target;
119f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum filter;
120f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum clamp;
12126bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            Matrix4* textureTransform;
122f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        } texture;
1230519c810a56bded1284fcb2ae40f438878c6585fChris Craik
1240519c810a56bded1284fcb2ae40f438878c6585fChris Craik        bool colorEnabled;
125117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        FloatColor color;
1266c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
127117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        ProgramDescription::ColorFilterMode filterMode;
128117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        union Filter {
129117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            struct Matrix {
130117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float matrix[16];
131117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float vector[4];
132117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            } matrix;
133117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            FloatColor color;
134117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        } filter;
135922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik
136922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik        SkiaShaderData skiaShaderData;
1376c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
1386c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
14053e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // modelView transform, accounting for delta between mesh transform and content of the mesh
14153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // often represents x/y offsets within command, or scaling for mesh unit size
1426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
14353e51e4aa933f9603587e1780f446c18816bf9beChris Craik
14453e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform of Glop - not necessarily applied to geometry (see flags)
1456c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
14653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        int transformFlags;
14753e51e4aa933f9603587e1780f446c18816bf9beChris Craik
14853e51e4aa933f9603587e1780f446c18816bf9beChris Craik       const Matrix4& meshTransform() const {
14953e51e4aa933f9603587e1780f446c18816bf9beChris Craik           return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
15053e51e4aa933f9603587e1780f446c18816bf9beChris Craik                   ? Matrix4::identity() : canvas;
15153e51e4aa933f9603587e1780f446c18816bf9beChris Craik       }
1526c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } transform;
1536c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
154f42bf3e2573bccb01babec448f925e9395bf224csergeyv    const RoundRectClipState* roundRectClipState = nullptr;
15530036092b40badecbe64d9c2bff4850132147f78Chris Craik
15630036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
15730036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Blending to be used by this draw - both GL_NONE if blending is disabled.
15830036092b40badecbe64d9c2bff4850132147f78Chris Craik     *
15930036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
16030036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
1616c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Blend {
162031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum src;
163031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum dst;
1646c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } blend;
1656c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1666c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    /**
16730036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Bounds of the drawing command in layer space. Only mapped into layer
16830036092b40badecbe64d9c2bff4850132147f78Chris Craik     * space once GlopBuilder::build() is called.
16930036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
170f42bf3e2573bccb01babec448f925e9395bf224csergeyv    Rect bounds; // TODO: remove for HWUI_NEW_OPS
17130036092b40badecbe64d9c2bff4850132147f78Chris Craik
17230036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
1746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1776c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
1816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1826c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#endif // ANDROID_HWUI_GLOP_H
183