Glop.h revision 922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9
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 */
446c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikenum VertexAttribFlags {
45117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    kNone_Attrib = 0,
466c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kTextureCoord_Attrib = 1 << 0,
476c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kColor_Attrib = 1 << 1,
486c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kAlpha_Attrib = 1 << 2,
496c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
506c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
516c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/**
520519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Structure containing all data required to issue an OpenGL draw
536c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
546c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform
556c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the
566c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data
570519c810a56bded1284fcb2ae40f438878c6585fChris Craik * managed.
580519c810a56bded1284fcb2ae40f438878c6585fChris Craik *
590519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Eventually, a Glop should be able to be drawn multiple times from
600519c810a56bded1284fcb2ae40f438878c6585fChris Craik * a single construction, up until GL context destruction. Currently,
610519c810a56bded1284fcb2ae40f438878c6585fChris Craik * vertex/index/Texture/RoundRectClipState pointers prevent this from
620519c810a56bded1284fcb2ae40f438878c6585fChris Craik * being safe.
636c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
646c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik// TODO: PREVENT_COPY_AND_ASSIGN(...) or similar
656c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop {
66117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    /*
67117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik     * Stores mesh - vertex and index data.
68117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik     *
69117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik     * buffer objects and void*s are mutually exclusive
702ab95d780b023152556d9f8659de734ec7b55047Chris Craik     * indices are optional, currently only GL_UNSIGNED_SHORT supported
71117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik     */
726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
73031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        VertexAttribFlags vertexFlags;
746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
75031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLuint vertexBufferObject;
76031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLuint indexBufferObject;
77117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        const void* vertices;
78117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        const void* indices;
790519c810a56bded1284fcb2ae40f438878c6585fChris Craik        int elementCount;
806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLsizei stride;
810519c810a56bded1284fcb2ae40f438878c6585fChris Craik        GLvoid* texCoordOffset;
820519c810a56bded1284fcb2ae40f438878c6585fChris Craik        TextureVertex mappedVertices[4];
836c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } mesh;
846c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
856c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Fill {
866c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Program* program;
8730036092b40badecbe64d9c2bff4850132147f78Chris Craik
880519c810a56bded1284fcb2ae40f438878c6585fChris Craik        Texture* texture;
890519c810a56bded1284fcb2ae40f438878c6585fChris Craik        GLenum textureFilter;
9030036092b40badecbe64d9c2bff4850132147f78Chris Craik        GLenum textureClamp;
910519c810a56bded1284fcb2ae40f438878c6585fChris Craik
920519c810a56bded1284fcb2ae40f438878c6585fChris Craik        bool colorEnabled;
93117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        FloatColor color;
946c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
95117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        ProgramDescription::ColorFilterMode filterMode;
96117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        union Filter {
97117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            struct Matrix {
98117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float matrix[16];
99117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik                float vector[4];
100117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            } matrix;
101117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik            FloatColor color;
102117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        } filter;
103922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik
104922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik        SkiaShaderData skiaShaderData;
1056c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
1066c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1076c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
1086c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 ortho; // TODO: out of op, since this is static per FBO
1096c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
1106c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
111117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik        bool fudgingOffset;
1126c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } transform;
1136c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
11430036092b40badecbe64d9c2bff4850132147f78Chris Craik    const RoundRectClipState* roundRectClipState;
11530036092b40badecbe64d9c2bff4850132147f78Chris Craik
11630036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
11730036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Blending to be used by this draw - both GL_NONE if blending is disabled.
11830036092b40badecbe64d9c2bff4850132147f78Chris Craik     *
11930036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
12030036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
1216c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Blend {
122031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum src;
123031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum dst;
1246c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } blend;
1256c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1266c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    /**
12730036092b40badecbe64d9c2bff4850132147f78Chris Craik     * Bounds of the drawing command in layer space. Only mapped into layer
12830036092b40badecbe64d9c2bff4850132147f78Chris Craik     * space once GlopBuilder::build() is called.
12930036092b40badecbe64d9c2bff4850132147f78Chris Craik     */
13030036092b40badecbe64d9c2bff4850132147f78Chris Craik    Rect bounds;
13130036092b40badecbe64d9c2bff4850132147f78Chris Craik
13230036092b40badecbe64d9c2bff4850132147f78Chris Craik    /**
1336c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
1346c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1356c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1366c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1376c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1386c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1406c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
1416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#endif // ANDROID_HWUI_GLOP_H
143