Glop.h revision 922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9
1c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala/*
2c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Copyright (C) 2015 The Android Open Source Project
3c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
4c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * you may not use this file except in compliance with the License.
6c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * You may obtain a copy of the License at
7c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
8c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
10c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * See the License for the specific language governing permissions and
14c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * limitations under the License.
15c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala */
16c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
17c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#ifndef ANDROID_HWUI_GLOP_H
18c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#define ANDROID_HWUI_GLOP_H
19c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
20c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "FloatColor.h"
21c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "Matrix.h"
22c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "Program.h"
23c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "Rect.h"
24c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "SkiaShader.h"
25c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include "utils/Macros.h"
26c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
27c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include <GLES2/gl2.h>
28c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include <GLES2/gl2ext.h>
29c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#include <SkXfermode.h>
30c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
31c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalanamespace android {
32c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalanamespace uirenderer {
33c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
34c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalaclass Program;
35c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalaclass RoundRectClipState;
36c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalaclass Texture;
37c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
38c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala/*
39c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Enumerates optional vertex attributes
40c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
41c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Position is always enabled by MeshState, these other attributes
42c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * are enabled/disabled dynamically based on mesh content.
43c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala */
44c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalaenum VertexAttribFlags {
45c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    kNone_Attrib = 0,
46c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    kTextureCoord_Attrib = 1 << 0,
47c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    kColor_Attrib = 1 << 1,
48c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    kAlpha_Attrib = 1 << 2,
49c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala};
50c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
51c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala/**
52c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Structure containing all data required to issue an OpenGL draw
53c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
54c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Includes all of the mesh, fill, and GL state required to perform
55c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * the operation. Pieces of data are either directly copied into the
56c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * structure, or stored as a pointer or GL object reference to data
57c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * managed.
58c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala *
59c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * Eventually, a Glop should be able to be drawn multiple times from
60c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * a single construction, up until GL context destruction. Currently,
61c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * vertex/index/Texture/RoundRectClipState pointers prevent this from
62c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala * being safe.
63c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala */
64c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala// TODO: PREVENT_COPY_AND_ASSIGN(...) or similar
65c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvalastruct Glop {
66c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    /*
67c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * Stores mesh - vertex and index data.
68c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     *
69c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * buffer objects and void*s are mutually exclusive
70c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * indices are optional, currently only GL_UNSIGNED_SHORT supported
71c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     */
72c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    struct Mesh {
73c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        VertexAttribFlags vertexFlags;
74c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
75c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLuint vertexBufferObject;
76c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLuint indexBufferObject;
77c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        const void* vertices;
78c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        const void* indices;
79c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        int elementCount;
80c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLsizei stride;
81c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLvoid* texCoordOffset;
82c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        TextureVertex mappedVertices[4];
83c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    } mesh;
84c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
85c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    struct Fill {
86c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        Program* program;
87c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
88c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        Texture* texture;
89c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLenum textureFilter;
90c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLenum textureClamp;
91c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
92c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        bool colorEnabled;
93c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        FloatColor color;
94c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
95c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        ProgramDescription::ColorFilterMode filterMode;
96c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        union Filter {
97c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala            struct Matrix {
98c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala                float matrix[16];
99c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala                float vector[4];
100c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala            } matrix;
101c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala            FloatColor color;
102c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        } filter;
103c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
104c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        SkiaShaderData skiaShaderData;
105b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    } fill;
106b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
107b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    struct Transform {
108b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        Matrix4 ortho; // TODO: out of op, since this is static per FBO
109b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        Matrix4 modelView;
110b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        Matrix4 canvas;
111cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk        bool fudgingOffset;
112cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk    } transform;
113cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk
114c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    const RoundRectClipState* roundRectClipState;
115c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
116c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    /**
117c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * Blending to be used by this draw - both GL_NONE if blending is disabled.
118c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     *
119c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
120c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     */
121c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    struct Blend {
122c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLenum src;
123c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala        GLenum dst;
124c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    } blend;
125c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
126c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    /**
127c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * Bounds of the drawing command in layer space. Only mapped into layer
128c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * space once GlopBuilder::build() is called.
129c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     */
130c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    Rect bounds;
131c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
132c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala    /**
133c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * Additional render state to enumerate:
134c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * - scissor + (bits for whether each of LTRB needed?)
135c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     * - stencil mode (draw into, mask, count, etc)
136c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala     */
137c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala};
138c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
139c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala} /* namespace uirenderer */
140c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala} /* namespace android */
141c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala
142c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala#endif // ANDROID_HWUI_GLOP_H
143c2d6427f693f1847100c8f4b9a4aff6c1a12bb29Eino-Ville Talvala