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 */ 4453e51e4aa933f9603587e1780f446c18816bf9beChris Craik 4553e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace VertexAttribFlags { 4653e51e4aa933f9603587e1780f446c18816bf9beChris Craik enum { 47138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik // Mesh is pure x,y vertex pairs 4853e51e4aa933f9603587e1780f446c18816bf9beChris Craik None = 0, 49138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik // Mesh has texture coordinates embedded. Note that texture can exist without this flag 50138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik // being set, if coordinates passed to sampler are determined another way. 5153e51e4aa933f9603587e1780f446c18816bf9beChris Craik TextureCoord = 1 << 0, 52138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik // Mesh has color embedded (to export to varying) 5353e51e4aa933f9603587e1780f446c18816bf9beChris Craik Color = 1 << 1, 54138c21fbec12bead3c7ca1f181c3fd35542ccb00Chris Craik // Mesh has alpha embedded (to export to varying) 5553e51e4aa933f9603587e1780f446c18816bf9beChris Craik Alpha = 1 << 2, 5653e51e4aa933f9603587e1780f446c18816bf9beChris Craik }; 5753e51e4aa933f9603587e1780f446c18816bf9beChris Craik}; 5853e51e4aa933f9603587e1780f446c18816bf9beChris Craik 5953e51e4aa933f9603587e1780f446c18816bf9beChris Craik/* 6053e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Enumerates transform features 6153e51e4aa933f9603587e1780f446c18816bf9beChris Craik */ 6253e51e4aa933f9603587e1780f446c18816bf9beChris Craiknamespace TransformFlags { 6353e51e4aa933f9603587e1780f446c18816bf9beChris Craik enum { 6453e51e4aa933f9603587e1780f446c18816bf9beChris Craik None = 0, 6553e51e4aa933f9603587e1780f446c18816bf9beChris Craik 6653e51e4aa933f9603587e1780f446c18816bf9beChris Craik // offset the eventual drawing matrix by a tiny amount to 6753e51e4aa933f9603587e1780f446c18816bf9beChris Craik // disambiguate sampling patterns with non-AA rendering 6853e51e4aa933f9603587e1780f446c18816bf9beChris Craik OffsetByFudgeFactor = 1 << 0, 6953e51e4aa933f9603587e1780f446c18816bf9beChris Craik 7053e51e4aa933f9603587e1780f446c18816bf9beChris Craik // Canvas transform isn't applied to the mesh at draw time, 7153e51e4aa933f9603587e1780f446c18816bf9beChris Craik //since it's already built in. 72e4db79de127cfe961195f52907af8451026eaa20Chris Craik MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS 7353e51e4aa933f9603587e1780f446c18816bf9beChris Craik }; 746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik}; 756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik/** 770519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Structure containing all data required to issue an OpenGL draw 786c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * 796c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Includes all of the mesh, fill, and GL state required to perform 806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * the operation. Pieces of data are either directly copied into the 816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * structure, or stored as a pointer or GL object reference to data 820519c810a56bded1284fcb2ae40f438878c6585fChris Craik * managed. 830519c810a56bded1284fcb2ae40f438878c6585fChris Craik * 840519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Eventually, a Glop should be able to be drawn multiple times from 850519c810a56bded1284fcb2ae40f438878c6585fChris Craik * a single construction, up until GL context destruction. Currently, 860519c810a56bded1284fcb2ae40f438878c6585fChris Craik * vertex/index/Texture/RoundRectClipState pointers prevent this from 870519c810a56bded1284fcb2ae40f438878c6585fChris Craik * being safe. 886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */ 896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikstruct Glop { 90f42bf3e2573bccb01babec448f925e9395bf224csergeyv PREVENT_COPY_AND_ASSIGN(Glop); 91f42bf3e2573bccb01babec448f925e9395bf224csergeyvpublic: 92f42bf3e2573bccb01babec448f925e9395bf224csergeyv Glop() { } 936c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik struct Mesh { 946c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported 95ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik 96ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik // buffer object and void* are mutually exclusive. 97ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik // Only GL_UNSIGNED_SHORT supported. 98ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik struct Indices { 99ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik GLuint bufferObject; 100ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik const void* indices; 101ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik } indices; 102ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik 103ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik // buffer object and void*s are mutually exclusive. 104ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik // TODO: enforce mutual exclusion with restricted setters and/or unions 105ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik struct Vertices { 106ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik GLuint bufferObject; 107eb911c2b0e8edeb7595a98af4b9f1bd47de1381eChris Craik int attribFlags; 108ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik const void* position; 109ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik const void* texCoord; 110ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik const void* color; 111ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik GLsizei stride; 112ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik } vertices; 113ef2507439c08f4e9c4c9bba1c6243ca9df2ee827Chris Craik 1140519c810a56bded1284fcb2ae40f438878c6585fChris Craik int elementCount; 1150519c810a56bded1284fcb2ae40f438878c6585fChris Craik TextureVertex mappedVertices[4]; 1166c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik } mesh; 1176c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 1186c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik struct Fill { 1196c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Program* program; 12030036092b40badecbe64d9c2bff4850132147f78Chris Craik 121f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik struct TextureData { 122f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik Texture* texture; 12326bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik GLenum target; 124f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik GLenum filter; 125f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik GLenum clamp; 12626bf34200e40a0fa8c66366559aa016380cd8c6fChris Craik Matrix4* textureTransform; 127f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik } texture; 1280519c810a56bded1284fcb2ae40f438878c6585fChris Craik 1290519c810a56bded1284fcb2ae40f438878c6585fChris Craik bool colorEnabled; 130117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik FloatColor color; 1316c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 132117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik ProgramDescription::ColorFilterMode filterMode; 133117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik union Filter { 134117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik struct Matrix { 135117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik float matrix[16]; 136117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik float vector[4]; 137117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik } matrix; 138117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik FloatColor color; 139117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik } filter; 140922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik 141922d3a7f6f8c1c05a996ee3e91e8cbadfff560c9Chris Craik SkiaShaderData skiaShaderData; 1426c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik } fill; 1436c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 1446c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik struct Transform { 14553e51e4aa933f9603587e1780f446c18816bf9beChris Craik // modelView transform, accounting for delta between mesh transform and content of the mesh 14653e51e4aa933f9603587e1780f446c18816bf9beChris Craik // often represents x/y offsets within command, or scaling for mesh unit size 1476c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Matrix4 modelView; 14853e51e4aa933f9603587e1780f446c18816bf9beChris Craik 14953e51e4aa933f9603587e1780f446c18816bf9beChris Craik // Canvas transform of Glop - not necessarily applied to geometry (see flags) 1506c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik Matrix4 canvas; 15153e51e4aa933f9603587e1780f446c18816bf9beChris Craik int transformFlags; 15253e51e4aa933f9603587e1780f446c18816bf9beChris Craik 15353e51e4aa933f9603587e1780f446c18816bf9beChris Craik const Matrix4& meshTransform() const { 15453e51e4aa933f9603587e1780f446c18816bf9beChris Craik return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform) 15553e51e4aa933f9603587e1780f446c18816bf9beChris Craik ? Matrix4::identity() : canvas; 15653e51e4aa933f9603587e1780f446c18816bf9beChris Craik } 1576c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik } transform; 1586c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 159f42bf3e2573bccb01babec448f925e9395bf224csergeyv const RoundRectClipState* roundRectClipState = nullptr; 16030036092b40badecbe64d9c2bff4850132147f78Chris Craik 16130036092b40badecbe64d9c2bff4850132147f78Chris Craik /** 16230036092b40badecbe64d9c2bff4850132147f78Chris Craik * Blending to be used by this draw - both GL_NONE if blending is disabled. 16330036092b40badecbe64d9c2bff4850132147f78Chris Craik * 16430036092b40badecbe64d9c2bff4850132147f78Chris Craik * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib 16530036092b40badecbe64d9c2bff4850132147f78Chris Craik */ 1666c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik struct Blend { 167031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik GLenum src; 168031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik GLenum dst; 1696c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik } blend; 1706c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 17170969ccde405ea410fc7ccfe869999a03f056686Chris Craik#if !HWUI_NEW_OPS 1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik /** 17330036092b40badecbe64d9c2bff4850132147f78Chris Craik * Bounds of the drawing command in layer space. Only mapped into layer 17430036092b40badecbe64d9c2bff4850132147f78Chris Craik * space once GlopBuilder::build() is called. 17530036092b40badecbe64d9c2bff4850132147f78Chris Craik */ 176f42bf3e2573bccb01babec448f925e9395bf224csergeyv Rect bounds; // TODO: remove for HWUI_NEW_OPS 17770969ccde405ea410fc7ccfe869999a03f056686Chris Craik#endif 17830036092b40badecbe64d9c2bff4850132147f78Chris Craik 17930036092b40badecbe64d9c2bff4850132147f78Chris Craik /** 1806c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * Additional render state to enumerate: 1816c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * - scissor + (bits for whether each of LTRB needed?) 1826c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik * - stencil mode (draw into, mask, count, etc) 1836c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik */ 1846c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik}; 1856c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 1866c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace uirenderer */ 1876c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik} /* namespace android */ 1886c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 1896c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik#endif // ANDROID_HWUI_GLOP_H 190