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
175e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#pragma once
186c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
190519c810a56bded1284fcb2ae40f438878c6585fChris Craik#include "FloatColor.h"
206c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Matrix.h"
21922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik#include "Program.h"
226c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Rect.h"
23922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik#include "SkiaShader.h"
246c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "utils/Macros.h"
256c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
266c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2.h>
276c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2ext.h>
286c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
296c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace android {
306c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace uirenderer {
316c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
32031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craikclass Program;
330519c810a56bded1284fcb2ae40f438878c6585fChris Craikclass RoundRectClipState;
34922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craikclass Texture;
35031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik
366c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/*
376c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Enumerates optional vertex attributes
386c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Position is always enabled by MeshState, these other attributes
406c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * are enabled/disabled dynamically based on mesh content.
416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
4253e51e4aa933f9603587e1780f446c18816bf9beChris Craik
4353e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace VertexAttribFlags {
4453e51e4aa933f9603587e1780f446c18816bf9beChris Craik    enum {
45138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh is pure x,y vertex pairs
4653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
47138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has texture coordinates embedded. Note that texture can exist without this flag
48138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // being set, if coordinates passed to sampler are determined another way.
4953e51e4aa933f9603587e1780f446c18816bf9beChris Craik        TextureCoord = 1 << 0,
50138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has color embedded (to export to varying)
5153e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Color = 1 << 1,
52138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik        // Mesh has alpha embedded (to export to varying)
5353e51e4aa933f9603587e1780f446c18816bf9beChris Craik        Alpha = 1 << 2,
5453e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
5553e51e4aa933f9603587e1780f446c18816bf9beChris Craik};
5653e51e4aa933f9603587e1780f446c18816bf9beChris Craik
5753e51e4aa933f9603587e1780f446c18816bf9beChris Craik/*
5853e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Enumerates transform features
5953e51e4aa933f9603587e1780f446c18816bf9beChris Craik */
6053e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace TransformFlags {
6153e51e4aa933f9603587e1780f446c18816bf9beChris Craik    enum {
6253e51e4aa933f9603587e1780f446c18816bf9beChris Craik        None = 0,
6353e51e4aa933f9603587e1780f446c18816bf9beChris Craik
6453e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // offset the eventual drawing matrix by a tiny amount to
6553e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // disambiguate sampling patterns with non-AA rendering
6653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        OffsetByFudgeFactor = 1 << 0,
6753e51e4aa933f9603587e1780f446c18816bf9beChris Craik
6853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform isn't applied to the mesh at draw time,
695e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik        // since it's already built in.
70e4db79de127cfe961195f52907af8451026eaa20Chris Craik        MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS
7153e51e4aa933f9603587e1780f446c18816bf9beChris Craik    };
726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/**
750519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Structure containing all data required to issue an OpenGL draw
766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
776c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform
786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the
796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data
800519c810a56bded1284fcb2ae40f438878c6585fChris Craik * managed.
810519c810a56bded1284fcb2ae40f438878c6585fChris Craik *
820519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Eventually, a Glop should be able to be drawn multiple times from
830519c810a56bded1284fcb2ae40f438878c6585fChris Craik * a single construction, up until GL context destruction. Currently,
840519c810a56bded1284fcb2ae40f438878c6585fChris Craik * vertex/index/Texture/RoundRectClipState pointers prevent this from
850519c810a56bded1284fcb2ae40f438878c6585fChris Craik * being safe.
866c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
876c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop {
88f42bf3e2573bccb01babec448f925e9395bf224csergeyv    PREVENT_COPY_AND_ASSIGN(Glop);
89f42bf3e2573bccb01babec448f925e9395bf224csergeyvpublic:
90f42bf3e2573bccb01babec448f925e9395bf224csergeyv    Glop() { }
916c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
926c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
93ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
94ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void* are mutually exclusive.
95ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // Only GL_UNSIGNED_SHORT supported.
96ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Indices {
97ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
98ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* indices;
99ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } indices;
100ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
101ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void*s are mutually exclusive.
102ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // TODO: enforce mutual exclusion with restricted setters and/or unions
103ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Vertices {
104ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
105eb911c2b0e8edeb7595a98af4b9f1bd47de1381eChris Craik            int attribFlags;
106ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* position;
107ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* texCoord;
108ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* color;
109ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLsizei stride;
110ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } vertices;
111ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
1120519c810a56bded1284fcb2ae40f438878c6585fChris Craik        int elementCount;
1130519c810a56bded1284fcb2ae40f438878c6585fChris Craik        TextureVertex mappedVertices[4];
1146c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } mesh;
1156c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1166c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Fill {
1176c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Program* program;
11830036092b40badecbe64d9c2bff4850132147f78Chris Craik
119f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        struct TextureData {
120f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            Texture* texture;
121f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum filter;
122f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum clamp;
12326bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            Matrix4* textureTransform;
124f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        } texture;
1250519c810a56bded1284fcb2ae40f438878c6585fChris Craik
1260519c810a56bded1284fcb2ae40f438878c6585fChris Craik        bool colorEnabled;
127117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        FloatColor color;
1286c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
129117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        ProgramDescription::ColorFilterMode filterMode;
130117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        union Filter {
131117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            struct Matrix {
132117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float matrix[16];
133117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float vector[4];
134117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            } matrix;
135117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            FloatColor color;
136117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        } filter;
137922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik
138922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik        SkiaShaderData skiaShaderData;
1396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
1406c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
14253e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // modelView transform, accounting for delta between mesh transform and content of the mesh
14353e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // often represents x/y offsets within command, or scaling for mesh unit size
1446c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
14553e51e4aa933f9603587e1780f446c18816bf9beChris Craik
14653e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform of Glop - not necessarily applied to geometry (see flags)
1476c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
14853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        int transformFlags;
14953e51e4aa933f9603587e1780f446c18816bf9beChris Craik
15053e51e4aa933f9603587e1780f446c18816bf9beChris Craik       const Matrix4& meshTransform() const {
15153e51e4aa933f9603587e1780f446c18816bf9beChris Craik           return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
15253e51e4aa933f9603587e1780f446c18816bf9beChris Craik                   ? Matrix4::identity() : canvas;
15353e51e4aa933f9603587e1780f446c18816bf9beChris Craik       }
1546c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } transform;
1556c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
156f42bf3e2573bccb01babec448f925e9395bf224csergeyv    const RoundRectClipState* roundRectClipState = nullptr;
15730036092b40badecbe64d9c2bff4850132147f78Chris Craik
15830036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
15930036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Blending to be used by this draw - both GL_NONE if blending is disabled.
16030036092b40badecbe64d9c2bff4850132147f78Chris Craik     *
16130036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
16230036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
1636c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Blend {
164031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum src;
165031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum dst;
1666c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } blend;
1676c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
16830036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
1696c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
1706c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1716c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
177