Glop.h revision 031888744e24b5c7243ac99ec98b78aff5db1c78
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
206c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Matrix.h"
216c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "Rect.h"
226c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include "utils/Macros.h"
236c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
246c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2.h>
256c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#include <GLES2/gl2ext.h>
26031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik#include <SkXfermode.h>
276c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
286c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace android {
296c15ffa196fc9b7724c189d833c3435d8db12266Chris Craiknamespace uirenderer {
306c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
31031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craikclass Program;
32031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik
336c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/*
346c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Enumerates optional vertex attributes
356c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
366c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Position is always enabled by MeshState, these other attributes
376c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * are enabled/disabled dynamically based on mesh content.
386c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikenum VertexAttribFlags {
406c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    // NOTE: position attribute always enabled
416c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kTextureCoord_Attrib = 1 << 0,
426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kColor_Attrib = 1 << 1,
436c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    kAlpha_Attrib = 1 << 2,
446c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
456c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
466c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/**
476c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Structure containing all data required to issue a single OpenGL draw
486c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik *
496c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform
506c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the
516c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data
526c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * managed
536c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */
546c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik// TODO: PREVENT_COPY_AND_ASSIGN(...) or similar
556c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop {
566c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    Rect bounds;
576c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
586c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Mesh {
59031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        VertexAttribFlags vertexFlags;
606c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
61031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLuint vertexBufferObject;
62031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLuint indexBufferObject;
636c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        int vertexCount;
646c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        GLsizei stride;
656c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } mesh;
666c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
676c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Fill {
686c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Program* program;
696c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
706c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        struct Color {
716c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik            float a, r, g, b;
726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        } color;
736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        /* TODO
756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        union shader {
766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik            //...
776c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        }; TODO
786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        union filter {
796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik            //color
806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik            //matrix + vector
816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        };
826c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        */
836c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } fill;
846c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
856c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Transform {
866c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 ortho; // TODO: out of op, since this is static per FBO
876c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 modelView;
886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        Matrix4 canvas;
896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik        bool offset;
906c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } transform;
916c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
926c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    struct Blend {
93031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum src;
94031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik        GLenum dst;
956c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    } blend;
966c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
976c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    /**
986c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * Additional render state to enumerate:
996c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - scissor + (bits for whether each of LTRB needed?)
1006c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     * - stencil mode (draw into, mask, count, etc)
1016c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik     */
1026c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik};
1036c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1046c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */
1056c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */
1066c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
1076c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#endif // ANDROID_HWUI_GLOP_H
108