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