/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_HWUI_GLOP_H
#define ANDROID_HWUI_GLOP_H
#include "FloatColor.h"
#include "Matrix.h"
#include "Program.h"
#include "Rect.h"
#include "SkiaShader.h"
#include "utils/Macros.h"
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <SkXfermode.h>
namespace android {
namespace uirenderer {
class Program;
class RoundRectClipState;
class Texture;
/*
* Enumerates optional vertex attributes
*
* Position is always enabled by MeshState, these other attributes
* are enabled/disabled dynamically based on mesh content.
*/
namespace VertexAttribFlags {
enum {
// Mesh is pure x,y vertex pairs
None = 0,
// Mesh has texture coordinates embedded. Note that texture can exist without this flag
// being set, if coordinates passed to sampler are determined another way.
TextureCoord = 1 << 0,
// Mesh has color embedded (to export to varying)
Color = 1 << 1,
// Mesh has alpha embedded (to export to varying)
Alpha = 1 << 2,
};
};
/*
* Enumerates transform features
*/
namespace TransformFlags {
enum {
None = 0,
// offset the eventual drawing matrix by a tiny amount to
// disambiguate sampling patterns with non-AA rendering
OffsetByFudgeFactor = 1 << 0,
// Canvas transform isn't applied to the mesh at draw time,
//since it's already built in.
MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS
};
};
/**
* Structure containing all data required to issue an OpenGL draw
*
* Includes all of the mesh, fill, and GL state required to perform
* the operation. Pieces of data are either directly copied into the
* structure, or stored as a pointer or GL object reference to data
* managed.
*
* Eventually, a Glop should be able to be drawn multiple times from
* a single construction, up until GL context destruction. Currently,
* vertex/index/Texture/RoundRectClipState pointers prevent this from
* being safe.
*/
struct Glop {
PREVENT_COPY_AND_ASSIGN(Glop);
public:
Glop() { }
struct Mesh {
GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
// buffer object and void* are mutually exclusive.
// Only GL_UNSIGNED_SHORT supported.
struct Indices {
GLuint bufferObject;
const void* indices;
} indices;
// buffer object and void*s are mutually exclusive.
// TODO: enforce mutual exclusion with restricted setters and/or unions
struct Vertices {
GLuint bufferObject;
int attribFlags;
const void* position;
const void* texCoord;
const void* color;
GLsizei stride;
} vertices;
int elementCount;
TextureVertex mappedVertices[4];
} mesh;
struct Fill {
Program* program;
struct TextureData {
Texture* texture;
GLenum target;
GLenum filter;
GLenum clamp;
Matrix4* textureTransform;
} texture;
bool colorEnabled;
FloatColor color;
ProgramDescription::ColorFilterMode filterMode;
union Filter {
struct Matrix {
float matrix[16];
float vector[4];
} matrix;
FloatColor color;
} filter;
SkiaShaderData skiaShaderData;
} fill;
struct Transform {
// modelView transform, accounting for delta between mesh transform and content of the mesh
// often represents x/y offsets within command, or scaling for mesh unit size
Matrix4 modelView;
// Canvas transform of Glop - not necessarily applied to geometry (see flags)
Matrix4 canvas;
int transformFlags;
const Matrix4& meshTransform() const {
return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
? Matrix4::identity() : canvas;
}
} transform;
const RoundRectClipState* roundRectClipState = nullptr;
/**
* Blending to be used by this draw - both GL_NONE if blending is disabled.
*
* Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
*/
struct Blend {
GLenum src;
GLenum dst;
} blend;
#if !HWUI_NEW_OPS
/**
* Bounds of the drawing command in layer space. Only mapped into layer
* space once GlopBuilder::build() is called.
*/
Rect bounds; // TODO: remove for HWUI_NEW_OPS
#endif
/**
* Additional render state to enumerate:
* - scissor + (bits for whether each of LTRB needed?)
* - stencil mode (draw into, mask, count, etc)
*/
};
} /* namespace uirenderer */
} /* namespace android */
#endif // ANDROID_HWUI_GLOP_H