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