summaryrefslogtreecommitdiffstats
path: root/libs/hwui/OpenGLRenderer.cpp
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-01-11 14:29:25 -0800
committerRomain Guy <romainguy@google.com>2011-01-11 17:53:19 -0800
commit6c319ca1275c8db892c39b48fc54864c949f9171 (patch)
treed89e4222487db2ccd9a6b03b0d55f8361a7d1856 /libs/hwui/OpenGLRenderer.cpp
parentb796889671c089fb7e2fc4498aa701d3e8e552a3 (diff)
downloadframeworks_base-6c319ca1275c8db892c39b48fc54864c949f9171.zip
frameworks_base-6c319ca1275c8db892c39b48fc54864c949f9171.tar.gz
frameworks_base-6c319ca1275c8db892c39b48fc54864c949f9171.tar.bz2
Better backend for hardware layers.
With this new backend, a hardware layer is only recreated when its associated view is udpated. This offers fast composition in GL and fast update of the layer in GL as well. Change-Id: I97c43a612f5955c6bf1c192c8ca4af10fdf1d076
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r--libs/hwui/OpenGLRenderer.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 99bb6f0..aefefe4 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -178,7 +178,7 @@ void OpenGLRenderer::finish() {
#endif
}
-void OpenGLRenderer::acquireContext() {
+void OpenGLRenderer::interrupt() {
if (mCaches.currentProgram) {
if (mCaches.currentProgram->isInUse()) {
mCaches.currentProgram->remove();
@@ -188,7 +188,11 @@ void OpenGLRenderer::acquireContext() {
mCaches.unbindMeshBuffer();
}
-void OpenGLRenderer::releaseContext() {
+void OpenGLRenderer::acquireContext() {
+ interrupt();
+}
+
+void OpenGLRenderer::resume() {
glViewport(0, 0, mSnapshot->viewport.getWidth(), mSnapshot->viewport.getHeight());
glEnable(GL_SCISSOR_TEST);
@@ -205,6 +209,10 @@ void OpenGLRenderer::releaseContext() {
glBlendEquation(GL_FUNC_ADD);
}
+void OpenGLRenderer::releaseContext() {
+ resume();
+}
+
///////////////////////////////////////////////////////////////////////////////
// State management
///////////////////////////////////////////////////////////////////////////////
@@ -1477,6 +1485,30 @@ void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {
finishDrawTexture();
}
+void OpenGLRenderer::drawLayer(int texture, float left, float top, float right, float bottom,
+ float u, float v, SkPaint* paint) {
+ if (quickReject(left, top, right, bottom)) {
+ return;
+ }
+
+ glActiveTexture(gTextureUnits[0]);
+ if (!texture) return;
+
+ mCaches.unbindMeshBuffer();
+ resetDrawTextureTexCoords(0.0f, v, u, 0.0f);
+
+ int alpha;
+ SkXfermode::Mode mode;
+ getAlphaAndMode(paint, &alpha, &mode);
+
+ // TODO: Should get the blend info from the caller
+ drawTextureMesh(left, top, right, bottom, texture, alpha / 255.0f, mode, true,
+ &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0],
+ GL_TRIANGLE_STRIP, gMeshCount);
+
+ resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
+}
+
///////////////////////////////////////////////////////////////////////////////
// Shaders
///////////////////////////////////////////////////////////////////////////////