diff options
author | Romain Guy <romainguy@google.com> | 2011-11-30 20:21:23 -0800 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2011-11-30 20:21:23 -0800 |
commit | d21b6e1fe337b35f62cf2028e9bd0637fd009a75 (patch) | |
tree | 8831d34e2dd0335c158c2aa12bee68452745c8c5 | |
parent | 28147b654bba8ae2b7976e58aa7869255e436b0b (diff) | |
download | frameworks_base-d21b6e1fe337b35f62cf2028e9bd0637fd009a75.zip frameworks_base-d21b6e1fe337b35f62cf2028e9bd0637fd009a75.tar.gz frameworks_base-d21b6e1fe337b35f62cf2028e9bd0637fd009a75.tar.bz2 |
Optimize away unnecessary state changes
Change-Id: I0f6816f9f6234853575ecee5033186ad19e76380
-rw-r--r-- | libs/hwui/Layer.h | 8 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 48 | ||||
-rw-r--r-- | libs/hwui/ShapeCache.h | 4 | ||||
-rw-r--r-- | libs/hwui/SkiaShader.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/Texture.h | 14 | ||||
-rw-r--r-- | libs/hwui/TextureCache.cpp | 14 |
7 files changed, 58 insertions, 38 deletions
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index a8ae5c6..ee6ef1a 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -147,12 +147,12 @@ struct Layer { this->renderTarget = renderTarget; } - void setWrap(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false) { - texture.setWrap(wrapS, wrapT, bindTexture, force, renderTarget); + void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) { + texture.setWrap(wrap, bindTexture, force, renderTarget); } - void setFilter(GLenum min, GLenum mag, bool bindTexture = false, bool force = false) { - texture.setFilter(min, mag,bindTexture, force, renderTarget); + void setFilter(GLenum filter, bool bindTexture = false, bool force = false) { + texture.setFilter(filter, bindTexture, force, renderTarget); } inline bool isCacheable() { diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index e38b479..6bf6004 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -294,8 +294,8 @@ void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t he if (renderTarget != layer->getRenderTarget()) { layer->setRenderTarget(renderTarget); layer->bindTexture(); - layer->setFilter(GL_NEAREST, GL_NEAREST, false, true); - layer->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, false, true); + layer->setFilter(GL_NEAREST, false, true); + layer->setWrap(GL_CLAMP_TO_EDGE, false, true); } } } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 718c131..3c838fc 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -47,6 +47,8 @@ namespace uirenderer { // TODO: This should be set in properties #define ALPHA_THRESHOLD (0x7f / PANEL_BIT_DEPTH) +#define FILTER(paint) (paint && paint->isFilterBitmap() ? GL_LINEAR : GL_NEAREST) + /////////////////////////////////////////////////////////////////////////////// // Globals /////////////////////////////////////////////////////////////////////////////// @@ -665,10 +667,10 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) { const float x = (int) floorf(rect.left + mSnapshot->transform->getTranslateX() + 0.5f); const float y = (int) floorf(rect.top + mSnapshot->transform->getTranslateY() + 0.5f); - layer->setFilter(GL_NEAREST, GL_NEAREST); + layer->setFilter(GL_NEAREST); setupDrawModelView(x, y, x + rect.getWidth(), y + rect.getHeight(), true); } else { - layer->setFilter(GL_LINEAR, GL_LINEAR); + layer->setFilter(GL_LINEAR); setupDrawModelView(rect.left, rect.top, rect.right, rect.bottom); } setupDrawTextureTransformUniforms(layer->getTexTransform()); @@ -702,9 +704,9 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) y = (int) floorf(rect.top + mSnapshot->transform->getTranslateY() + 0.5f); } - layer->setFilter(GL_NEAREST, GL_NEAREST, true); + layer->setFilter(GL_NEAREST, true); } else { - layer->setFilter(GL_LINEAR, GL_LINEAR, true); + layer->setFilter(GL_LINEAR, true); } drawTextureMesh(x, y, x + rect.getWidth(), y + rect.getHeight(), @@ -760,10 +762,10 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { const float x = (int) floorf(rect.left + mSnapshot->transform->getTranslateX() + 0.5f); const float y = (int) floorf(rect.top + mSnapshot->transform->getTranslateY() + 0.5f); - layer->setFilter(GL_NEAREST, GL_NEAREST); + layer->setFilter(GL_NEAREST); setupDrawModelViewTranslate(x, y, x + rect.getWidth(), y + rect.getHeight(), true); } else { - layer->setFilter(GL_LINEAR, GL_LINEAR); + layer->setFilter(GL_LINEAR); setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom); } setupDrawMesh(&mesh[0].position[0], &mesh[0].texture[0]); @@ -1320,6 +1322,8 @@ void OpenGLRenderer::drawAlphaBitmap(Texture* texture, float left, float top, Sk y = (int) floorf(top + mSnapshot->transform->getTranslateY() + 0.5f); ignoreTransform = true; filter = GL_NEAREST; + } else { + filter = FILTER(paint); } setupDraw(); @@ -1334,8 +1338,8 @@ void OpenGLRenderer::drawAlphaBitmap(Texture* texture, float left, float top, Sk setupDrawModelView(x, y, x + texture->width, y + texture->height, ignoreTransform); setupDrawTexture(texture->id); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE); - texture->setFilter(filter, filter); + texture->setWrap(GL_CLAMP_TO_EDGE); + texture->setFilter(filter); setupDrawPureColorUniforms(); setupDrawColorFilterUniforms(); @@ -1401,8 +1405,8 @@ void OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHei if (!texture) return; const AutoTexture autoCleanup(texture); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, true); - texture->setFilter(GL_LINEAR, GL_LINEAR, true); + texture->setWrap(GL_CLAMP_TO_EDGE, true); + texture->setFilter(FILTER(paint), true); int alpha; SkXfermode::Mode mode; @@ -1485,7 +1489,6 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, true); const float width = texture->width; const float height = texture->height; @@ -1502,6 +1505,8 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); + texture->setWrap(GL_CLAMP_TO_EDGE, true); + if (mSnapshot->transform->isPureTranslate()) { const float x = (int) floorf(dstLeft + mSnapshot->transform->getTranslateX() + 0.5f); const float y = (int) floorf(dstTop + mSnapshot->transform->getTranslateY() + 0.5f); @@ -1509,17 +1514,16 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, GLenum filter = GL_NEAREST; // Enable linear filtering if the source rectangle is scaled if (srcRight - srcLeft != dstRight - dstLeft || srcBottom - srcTop != dstBottom - dstTop) { - filter = GL_LINEAR; + filter = FILTER(paint); } - texture->setFilter(filter, filter, true); + texture->setFilter(filter, true); drawTextureMesh(x, y, x + (dstRight - dstLeft), y + (dstBottom - dstTop), texture->id, alpha / 255.0f, mode, texture->blend, &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0], GL_TRIANGLE_STRIP, gMeshCount, false, true); } else { - texture->setFilter(GL_LINEAR, GL_LINEAR, true); - + texture->setFilter(FILTER(paint), true); drawTextureMesh(dstLeft, dstTop, dstRight, dstBottom, texture->id, alpha / 255.0f, mode, texture->blend, &mMeshVertices[0].position[0], &mMeshVertices[0].texture[0], GL_TRIANGLE_STRIP, gMeshCount); @@ -1539,8 +1543,8 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, true); - texture->setFilter(GL_LINEAR, GL_LINEAR, true); + texture->setWrap(GL_CLAMP_TO_EDGE, true); + texture->setFilter(GL_LINEAR, true); int alpha; SkXfermode::Mode mode; @@ -2250,11 +2254,11 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { x = (int) floorf(x + mSnapshot->transform->getTranslateX() + 0.5f); y = (int) floorf(y + mSnapshot->transform->getTranslateY() + 0.5f); - layer->setFilter(GL_NEAREST, GL_NEAREST); + layer->setFilter(GL_NEAREST); setupDrawModelViewTranslate(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), true); } else { - layer->setFilter(GL_LINEAR, GL_LINEAR); + layer->setFilter(GL_LINEAR); setupDrawModelViewTranslate(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); } @@ -2447,18 +2451,18 @@ void OpenGLRenderer::drawTextureRect(float left, float top, float right, float b SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, true); + texture->setWrap(GL_CLAMP_TO_EDGE, true); if (mSnapshot->transform->isPureTranslate()) { const float x = (int) floorf(left + mSnapshot->transform->getTranslateX() + 0.5f); const float y = (int) floorf(top + mSnapshot->transform->getTranslateY() + 0.5f); - texture->setFilter(GL_NEAREST, GL_NEAREST, true); + texture->setFilter(GL_NEAREST, true); drawTextureMesh(x, y, x + texture->width, y + texture->height, texture->id, alpha / 255.0f, mode, texture->blend, (GLvoid*) NULL, (GLvoid*) gMeshTextureOffset, GL_TRIANGLE_STRIP, gMeshCount, false, true); } else { - texture->setFilter(GL_LINEAR, GL_LINEAR, true); + texture->setFilter(FILTER(paint), true); drawTextureMesh(left, top, right, bottom, texture->id, alpha / 255.0f, mode, texture->blend, (GLvoid*) NULL, (GLvoid*) gMeshTextureOffset, GL_TRIANGLE_STRIP, gMeshCount); diff --git a/libs/hwui/ShapeCache.h b/libs/hwui/ShapeCache.h index 0660b69..8b88d30 100644 --- a/libs/hwui/ShapeCache.h +++ b/libs/hwui/ShapeCache.h @@ -584,8 +584,8 @@ void ShapeCache<Entry>::generateTexture(SkBitmap& bitmap, Texture* texture) { glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texture->width, texture->height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.getPixels()); - texture->setFilter(GL_LINEAR, GL_LINEAR); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE); + texture->setFilter(GL_LINEAR); + texture->setWrap(GL_CLAMP_TO_EDGE); } }; // namespace uirenderer diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp index 2428295..32e7533 100644 --- a/libs/hwui/SkiaShader.cpp +++ b/libs/hwui/SkiaShader.cpp @@ -77,7 +77,7 @@ void SkiaShader::setupProgram(Program* program, const mat4& modelView, const Sna void SkiaShader::bindTexture(Texture* texture, GLenum wrapS, GLenum wrapT) { glBindTexture(GL_TEXTURE_2D, texture->id); - texture->setWrap(wrapS, wrapT); + texture->setWrapST(wrapS, wrapT); } void SkiaShader::computeScreenSpaceMatrix(mat4& screenSpace, const mat4& modelView) { @@ -148,7 +148,7 @@ void SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView, // ::updateTransforms() but we don't have the texture object // available at that point. The optimization is not worth the // effort for now. - texture->setFilter(GL_LINEAR, GL_LINEAR); + texture->setFilter(GL_LINEAR); glUniform1i(program->getUniform("bitmapSampler"), textureSlot); glUniformMatrix4fv(program->getUniform("textureTransform"), 1, diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h index 48229b6..a4aed07 100644 --- a/libs/hwui/Texture.h +++ b/libs/hwui/Texture.h @@ -40,7 +40,12 @@ struct Texture { firstWrap = true; } - void setWrap(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false, + void setWrap(GLenum wrap, bool bindTexture = false, bool force = false, + GLenum renderTarget = GL_TEXTURE_2D) { + setWrapST(wrap, wrap, bindTexture, force, renderTarget); + } + + void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false, bool force = false, GLenum renderTarget = GL_TEXTURE_2D) { if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) { @@ -58,7 +63,12 @@ struct Texture { } } - void setFilter(GLenum min, GLenum mag, bool bindTexture = false, bool force = false, + void setFilter(GLenum filter, bool bindTexture = false, bool force = false, + GLenum renderTarget = GL_TEXTURE_2D) { + setFilterMinMag(filter, filter, bindTexture, force, renderTarget); + } + + void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false, bool force = false, GLenum renderTarget = GL_TEXTURE_2D) { if (firstFilter || force || min != minFilter || mag != magFilter) { diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index 018ce3e..711277a 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -217,11 +217,15 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege texture->height = bitmap->height(); glBindTexture(GL_TEXTURE_2D, texture->id); - glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap->bytesPerPixel()); + if (!regenerate) { + glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap->bytesPerPixel()); + } switch (bitmap->getConfig()) { case SkBitmap::kA8_Config: - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + if (!regenerate) { + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + } uploadToTexture(resize, GL_ALPHA, bitmap->rowBytesAsPixels(), texture->height, GL_UNSIGNED_BYTE, bitmap->getPixels()); texture->blend = true; @@ -248,8 +252,10 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege break; } - texture->setFilter(GL_LINEAR, GL_LINEAR); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE); + if (!regenerate) { + texture->setFilter(GL_NEAREST); + texture->setWrap(GL_CLAMP_TO_EDGE); + } } void TextureCache::uploadLoFiTexture(bool resize, SkBitmap* bitmap, |