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 {
47138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh is pure x,y vertex pairs
4853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
49138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has texture coordinates embedded. Note that texture can exist without this flag
50138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // being set, if coordinates passed to sampler are determined another way.
5153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        TextureCoord = 1 << 0,
52138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has color embedded (to export to varying)
5353e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Color = 1 << 1,
54138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has alpha embedded (to export to varying)
5553e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Alpha = 1 << 2,
5653e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
5753e51e4aa933f9603587e1780f446c18816bf9beChris Craik};
5853e51e4aa933f9603587e1780f446c18816bf9beChris Craik
5953e51e4aa933f9603587e1780f446c18816bf9beChris Craik/*
6053e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Enumerates transform features
6153e51e4aa933f9603587e1780f446c18816bf9beChris Craik */
6253e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace TransformFlags {
6353e51e4aa933f9603587e1780f446c18816bf9beChris Craik    enum {
6453e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
6553e51e4aa933f9603587e1780f446c18816bf9beChris Craik
6653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // offset the eventual drawing matrix by a tiny amount to
6753e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // disambiguate sampling patterns with non-AA rendering
6853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        OffsetByFudgeFactor = 1 << 0,
6953e51e4aa933f9603587e1780f446c18816bf9beChris Craik
7053e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform isn't applied to the mesh at draw time,
7153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        //since it's already built in.
72e4db79de127cfe961195f52907af8451026eaa20Chris Craik        MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS
7353e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/**
770519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Structure containing all data required to issue an OpenGL draw
786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform
806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the
816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data
820519c810a56bded1284fcb2ae40f438878c6585fChris Craik * managed.
830519c810a56bded1284fcb2ae40f438878c6585fChris Craik *
840519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Eventually, a Glop should be able to be drawn multiple times from
850519c810a56bded1284fcb2ae40f438878c6585fChris Craik * a single construction, up until GL context destruction. Currently,
860519c810a56bded1284fcb2ae40f438878c6585fChris Craik * vertex/index/Texture/RoundRectClipState pointers prevent this from
870519c810a56bded1284fcb2ae40f438878c6585fChris Craik * being safe.
886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop {
90f42bf3e2573bccb01babec448f925e9395bf224csergeyv    PREVENT_COPY_AND_ASSIGN(Glop);
91f42bf3e2573bccb01babec448f925e9395bf224csergeyvpublic:
92f42bf3e2573bccb01babec448f925e9395bf224csergeyv    Glop() { }
936c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
946c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
95ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
96ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void* are mutually exclusive.
97ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // Only GL_UNSIGNED_SHORT supported.
98ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Indices {
99ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
100ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* indices;
101ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } indices;
102ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
103ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void*s are mutually exclusive.
104ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // TODO: enforce mutual exclusion with restricted setters and/or unions
105ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Vertices {
106ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
107eb911c2b0e8edeb7595a98af4b9f1bd47de1381eChris Craik            int attribFlags;
108ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* position;
109ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* texCoord;
110ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* color;
111ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLsizei stride;
112ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } vertices;
113ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
1140519c810a56bded1284fcb2ae40f438878c6585fChris Craik        int elementCount;
1150519c810a56bded1284fcb2ae40f438878c6585fChris Craik        TextureVertex mappedVertices[4];
1166c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } mesh;
1176c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1186c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Fill {
1196c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Program* program;
12030036092b40badecbe64d9c2bff4850132147f78Chris Craik
121f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        struct TextureData {
122f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            Texture* texture;
12326bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            GLenum target;
124f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum filter;
125f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum clamp;
12626bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            Matrix4* textureTransform;
127f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        } texture;
1280519c810a56bded1284fcb2ae40f438878c6585fChris Craik
1290519c810a56bded1284fcb2ae40f438878c6585fChris Craik        bool colorEnabled;
130117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        FloatColor color;
1316c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
132117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        ProgramDescription::ColorFilterMode filterMode;
133117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        union Filter {
134117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            struct Matrix {
135117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float matrix[16];
136117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float vector[4];
137117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            } matrix;
138117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            FloatColor color;
139117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        } filter;
140922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik
141922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik        SkiaShaderData skiaShaderData;
1426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
1436c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1446c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
14553e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // modelView transform, accounting for delta between mesh transform and content of the mesh
14653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // often represents x/y offsets within command, or scaling for mesh unit size
1476c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
14853e51e4aa933f9603587e1780f446c18816bf9beChris Craik
14953e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform of Glop - not necessarily applied to geometry (see flags)
1506c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
15153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        int transformFlags;
15253e51e4aa933f9603587e1780f446c18816bf9beChris Craik
15353e51e4aa933f9603587e1780f446c18816bf9beChris Craik       const Matrix4& meshTransform() const {
15453e51e4aa933f9603587e1780f446c18816bf9beChris Craik           return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
15553e51e4aa933f9603587e1780f446c18816bf9beChris Craik                   ? Matrix4::identity() : canvas;
15653e51e4aa933f9603587e1780f446c18816bf9beChris Craik       }
1576c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } transform;
1586c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
159f42bf3e2573bccb01babec448f925e9395bf224csergeyv    const RoundRectClipState* roundRectClipState = nullptr;
16030036092b40badecbe64d9c2bff4850132147f78Chris Craik
16130036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
16230036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Blending to be used by this draw - both GL_NONE if blending is disabled.
16330036092b40badecbe64d9c2bff4850132147f78Chris Craik     *
16430036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
16530036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
1666c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Blend {
167031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum src;
168031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum dst;
1696c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } blend;
1706c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
17170969ccde405ea410fc7ccfe869999a03f056686Chris Craik#if !HWUI_NEW_OPS
1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    /**
17330036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Bounds of the drawing command in layer space. Only mapped into layer
17430036092b40badecbe64d9c2bff4850132147f78Chris Craik     * space once GlopBuilder::build() is called.
17530036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
176f42bf3e2573bccb01babec448f925e9395bf224csergeyv    Rect bounds; // TODO: remove for HWUI_NEW_OPS
17770969ccde405ea410fc7ccfe869999a03f056686Chris Craik#endif
17830036092b40badecbe64d9c2bff4850132147f78Chris Craik
17930036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
1806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
1816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1826c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1836c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1846c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1856c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1866c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1876c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
1886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#endif // ANDROID_HWUI_GLOP_H
190