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