Refactoring of Program ownership/lifecycle, and WIP Glop rendering path
Change-Id: I2549032790bddbc048b0bccc224ed8f386b4517c
diff --git a/libs/hwui/Glop.h b/libs/hwui/Glop.h
new file mode 100644
index 0000000..730d9df
--- /dev/null
+++ b/libs/hwui/Glop.h
@@ -0,0 +1,108 @@
+/*
+ * 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 "Matrix.h"
+#include "Rect.h"
+#include "utils/Macros.h"
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+namespace android {
+namespace uirenderer {
+
+/*
+ * Enumerates optional vertex attributes
+ *
+ * Position is always enabled by MeshState, these other attributes
+ * are enabled/disabled dynamically based on mesh content.
+ */
+enum VertexAttribFlags {
+ // NOTE: position attribute always enabled
+ kTextureCoord_Attrib = 1 << 0,
+ kColor_Attrib = 1 << 1,
+ kAlpha_Attrib = 1 << 2,
+};
+
+/**
+ * Structure containing all data required to issue a single 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
+ */
+// TODO: PREVENT_COPY_AND_ASSIGN(...) or similar
+struct Glop {
+ Rect bounds;
+
+ struct Mesh {
+ VertexAttribFlags vertexFlags = static_cast<VertexAttribFlags>(0);
+ GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
+ GLuint vertexBufferObject = 0;
+ GLuint indexBufferObject = 0;
+ int vertexCount;
+ GLsizei stride;
+ } mesh;
+
+ struct Fill {
+ Program* program;
+ GLuint shaderId;
+ GLuint textureId;
+
+ struct Color {
+ float a, r, g, b;
+ } color;
+
+ /* TODO
+ union shader {
+ //...
+ }; TODO
+ union filter {
+ //color
+ //matrix + vector
+ };
+ */
+ } fill;
+
+ struct Transform {
+ Matrix4 ortho; // TODO: out of op, since this is static per FBO
+ Matrix4 modelView;
+ Matrix4 canvas;
+ bool offset;
+ } transform;
+
+ struct Blend {
+ static const SkXfermode::Mode kDisable =
+ static_cast<SkXfermode::Mode>(SkXfermode::kLastMode + 1);
+ SkXfermode::Mode mode;
+ bool swapSrcDst;
+ } blend;
+
+ /**
+ * 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