summaryrefslogtreecommitdiffstats
path: root/libs/hwui/OpenGLRenderer.cpp
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-09-12 13:02:16 -0700
committerRomain Guy <romainguy@google.com>2010-09-12 13:02:16 -0700
commit8694230ff25fa0a60e480d424843e56b718f0516 (patch)
tree4fa55299cb6a516c443ce2c2082530ec69928211 /libs/hwui/OpenGLRenderer.cpp
parentf607bdc167f66b3e7003acaa4736ae46d78c1492 (diff)
downloadframeworks_base-8694230ff25fa0a60e480d424843e56b718f0516.zip
frameworks_base-8694230ff25fa0a60e480d424843e56b718f0516.tar.gz
frameworks_base-8694230ff25fa0a60e480d424843e56b718f0516.tar.bz2
Optimize calls to glCopyTexImage2D().
Change-Id: I34ee87bd4472864f440916e03a2894fae24bbe4a
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r--libs/hwui/OpenGLRenderer.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 7cf70f7..de27090 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -309,17 +309,12 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top,
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bounds.left, mHeight - bounds.bottom,
bounds.getWidth(), bounds.getHeight(), 0);
- // Clear the framebuffer where the layer will draw
- glScissor(bounds.left, mHeight - bounds.bottom, bounds.getWidth(), bounds.getHeight());
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClear(GL_COLOR_BUFFER_BIT);
-
if (flags & SkCanvas::kClipToLayer_SaveFlag) {
- mSnapshot->clipTransformed(bounds);
+ if (mSnapshot->clipTransformed(bounds)) setScissorFromClip();
}
- // Restore the initial clip
- setScissorFromClip();
+ // Enqueue the buffer coordinates to clear the corresponding region later
+ mLayers.push(new Rect(bounds));
return true;
}
@@ -371,6 +366,26 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
}
}
+void OpenGLRenderer::clearLayerRegions() {
+ if (mLayers.size() == 0) return;
+
+ for (uint32_t i = 0; i < mLayers.size(); i++) {
+ Rect* bounds = mLayers.itemAt(i);
+
+ // Clear the framebuffer where the layer will draw
+ glScissor(bounds->left, mHeight - bounds->bottom,
+ bounds->getWidth(), bounds->getHeight());
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ delete bounds;
+ }
+ mLayers.clear();
+
+ // Restore the clip
+ setScissorFromClip();
+}
+
///////////////////////////////////////////////////////////////////////////////
// Transforms
///////////////////////////////////////////////////////////////////////////////
@@ -612,6 +627,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
mode, false, true);
const Rect& clip = mSnapshot->getLocalClip();
+ clearLayerRegions();
fontRenderer.renderText(paint, &clip, text, 0, bytesCount, count, x, y);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -651,6 +667,8 @@ void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {
setupTextureAlpha8(texture, textureUnit, x, y, r, g, b, a, mode, true, true);
+ clearLayerRegions();
+
// Draw the mesh
glDrawArrays(GL_TRIANGLE_STRIP, 0, gMeshCount);
glDisableVertexAttribArray(mCaches.currentProgram->getAttrib("texCoords"));
@@ -836,6 +854,8 @@ void OpenGLRenderer::drawTextDecorations(const char* text, int bytesCount, float
void OpenGLRenderer::drawColorRect(float left, float top, float right, float bottom,
int color, SkXfermode::Mode mode, bool ignoreTransform, bool ignoreBlending) {
+ clearLayerRegions();
+
// If a shader is set, preserve only the alpha
if (mShader) {
color |= 0x00ffffff;
@@ -914,6 +934,8 @@ void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float b
GLuint texture, float alpha, SkXfermode::Mode mode, bool blend,
GLvoid* vertices, GLvoid* texCoords, GLvoid* indices, GLsizei elementsCount,
bool swapSrcDst, bool ignoreTransform) {
+ clearLayerRegions();
+
ProgramDescription description;
description.hasTexture = true;
if (mColorFilter) {