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 {
441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum {
451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // Mesh is pure x,y vertex pairs
461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    None = 0,
471bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // Mesh has texture coordinates embedded. Note that texture can exist without this flag
481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // being set, if coordinates passed to sampler are determined another way.
491bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    TextureCoord = 1 << 0,
501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // Mesh has color embedded (to export to varying)
511bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    Color = 1 << 1,
521bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // Mesh has alpha embedded (to export to varying)
531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    Alpha = 1 << 2,
541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};
5553e51e4aa933f9603587e1780f446c18816bf9beChris Craik};
5653e51e4aa933f9603587e1780f446c18816bf9beChris Craik
5753e51e4aa933f9603587e1780f446c18816bf9beChris Craik/*
5853e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Enumerates transform features
5953e51e4aa933f9603587e1780f446c18816bf9beChris Craik */
6053e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace TransformFlags {
611bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum {
621bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    None = 0,
6353e51e4aa933f9603587e1780f446c18816bf9beChris Craik
641bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // offset the eventual drawing matrix by a tiny amount to
651bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // disambiguate sampling patterns with non-AA rendering
661bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    OffsetByFudgeFactor = 1 << 0,
6753e51e4aa933f9603587e1780f446c18816bf9beChris Craik
681bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // Canvas transform isn't applied to the mesh at draw time,
691bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    // since it's already built in.
701bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    MeshIgnoresCanvasTransform = 1 << 1,  // TODO: remove for HWUI_NEW_OPS
711bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};
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);
891bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
90f42bf3e2573bccb01babec448f925e9395bf224csergeyvpublic:
911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    Glop() {}
926c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
931bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        GLuint primitiveMode;  // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
94ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
95ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void* are mutually exclusive.
96ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // Only GL_UNSIGNED_SHORT supported.
97ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Indices {
98ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
99ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* indices;
100ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } indices;
101ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
102ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // buffer object and void*s are mutually exclusive.
103ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        // TODO: enforce mutual exclusion with restricted setters and/or unions
104ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        struct Vertices {
105ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLuint bufferObject;
106eb911c2b0e8edeb7595a98af4b9f1bd47de1381eChris Craik            int attribFlags;
107ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* position;
108ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* texCoord;
109ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            const void* color;
110ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik            GLsizei stride;
111ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik        } vertices;
112ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik
1130519c810a56bded1284fcb2ae40f438878c6585fChris Craik        int elementCount;
1141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        int vertexCount;  // only used for meshes (for glDrawRangeElements)
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;
123f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum filter;
124f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik            GLenum clamp;
12526bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik            Matrix4* textureTransform;
126f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik        } texture;
1270519c810a56bded1284fcb2ae40f438878c6585fChris Craik
1280519c810a56bded1284fcb2ae40f438878c6585fChris Craik        bool colorEnabled;
129117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        FloatColor color;
1306c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
131117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        ProgramDescription::ColorFilterMode filterMode;
132117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        union Filter {
133117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            struct Matrix {
134117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float matrix[16];
135117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float vector[4];
136117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            } matrix;
137117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            FloatColor color;
138117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        } filter;
139922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik
140922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik        SkiaShaderData skiaShaderData;
1416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
1426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1436c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
14453e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // modelView transform, accounting for delta between mesh transform and content of the mesh
14553e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // often represents x/y offsets within command, or scaling for mesh unit size
1466c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
14753e51e4aa933f9603587e1780f446c18816bf9beChris Craik
14853e51e4aa933f9603587e1780f446c18816bf9beChris Craik        // Canvas transform of Glop - not necessarily applied to geometry (see flags)
1496c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
15053e51e4aa933f9603587e1780f446c18816bf9beChris Craik        int transformFlags;
15153e51e4aa933f9603587e1780f446c18816bf9beChris Craik
1521bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        const Matrix4& meshTransform() const {
1531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                           ? Matrix4::identity()
1551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                           : canvas;
1561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck        }
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
17130036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1776c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
180