summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/hwui/DeferredLayerUpdater.cpp13
-rw-r--r--libs/hwui/Layer.cpp1
-rw-r--r--libs/hwui/Layer.h14
-rw-r--r--libs/hwui/LayerRenderer.cpp5
-rw-r--r--libs/hwui/LayerRenderer.h2
-rw-r--r--libs/hwui/OpenGLRenderer.cpp1
6 files changed, 31 insertions, 5 deletions
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp
index 62f6c7636883..7a2e288af13f 100644
--- a/libs/hwui/DeferredLayerUpdater.cpp
+++ b/libs/hwui/DeferredLayerUpdater.cpp
@@ -112,6 +112,15 @@ void DeferredLayerUpdater::doUpdateTexImage() {
frameNumber = newFrameNumber;
dropCounter++;
}
+
+ bool forceFilter = false;
+ sp<GraphicBuffer> buffer = mSurfaceTexture->getCurrentBuffer();
+ if (buffer != NULL) {
+ // force filtration if buffer size != layer size
+ forceFilter = mWidth != buffer->getWidth()
+ || mHeight != buffer->getHeight();
+ }
+
#if DEBUG_RENDERER
if (dropCounter > 0) {
RENDERER_LOGD("Dropped %d frames on texture layer update", dropCounter);
@@ -120,8 +129,8 @@ void DeferredLayerUpdater::doUpdateTexImage() {
mSurfaceTexture->getTransformMatrix(transform);
GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
- LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight, !mBlend,
- renderTarget, transform);
+ LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight,
+ !mBlend, forceFilter, renderTarget, transform);
}
}
diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp
index 54ce64f4069d..8992a13a5c91 100644
--- a/libs/hwui/Layer.cpp
+++ b/libs/hwui/Layer.cpp
@@ -46,6 +46,7 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight):
stencil = NULL;
debugDrawUpdate = false;
hasDrawnSinceUpdate = false;
+ forceFilter = false;
deferredList = NULL;
caches.resourceCache.incrementRefcount(this);
}
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index 8cc027ae117a..f6538f29dcc4 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -127,6 +127,14 @@ public:
return texture.blend;
}
+ inline void setForceFilter(bool forceFilter) {
+ this->forceFilter = forceFilter;
+ }
+
+ inline bool getForceFilter() const {
+ return forceFilter;
+ }
+
inline void setAlpha(int alpha) {
this->alpha = alpha;
}
@@ -343,9 +351,15 @@ private:
SkColorFilter* colorFilter;
/**
+ * Indicates raster data backing the layer is scaled, requiring filtration.
+ */
+ bool forceFilter;
+
+ /**
* Opacity of the layer.
*/
int alpha;
+
/**
* Blending mode of the layer.
*/
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index ea8eb31f8437..e0ac2ba31faa 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -290,14 +290,15 @@ Layer* LayerRenderer::createTextureLayer() {
}
void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
- bool isOpaque, GLenum renderTarget, float* transform) {
+ bool isOpaque, bool forceFilter, GLenum renderTarget, float* textureTransform) {
if (layer) {
layer->setBlend(!isOpaque);
+ layer->setForceFilter(forceFilter);
layer->setSize(width, height);
layer->layer.set(0.0f, 0.0f, width, height);
layer->region.set(width, height);
layer->regionRect.set(0.0f, 0.0f, width, height);
- layer->getTexTransform().load(transform);
+ layer->getTexTransform().load(textureTransform);
if (renderTarget != layer->getRenderTarget()) {
layer->setRenderTarget(renderTarget);
diff --git a/libs/hwui/LayerRenderer.h b/libs/hwui/LayerRenderer.h
index 84acd4452000..40e461a345dc 100644
--- a/libs/hwui/LayerRenderer.h
+++ b/libs/hwui/LayerRenderer.h
@@ -56,7 +56,7 @@ public:
ANDROID_API static Layer* createRenderLayer(uint32_t width, uint32_t height);
ANDROID_API static bool resizeLayer(Layer* layer, uint32_t width, uint32_t height);
ANDROID_API static void updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
- bool isOpaque, GLenum renderTarget, float* transform);
+ bool isOpaque, bool forceFilter, GLenum renderTarget, float* textureTransform);
ANDROID_API static void destroyLayer(Layer* layer);
ANDROID_API static void destroyLayerDeferred(Layer* layer);
ANDROID_API static bool copyLayer(Layer* layer, SkBitmap* bitmap);
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 2da0fd394eeb..c507c8183048 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -1068,6 +1068,7 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) {
setupDrawExternalTexture(layer->getTexture());
}
if (currentTransform()->isPureTranslate() &&
+ !layer->getForceFilter() &&
layer->getWidth() == (uint32_t) rect.getWidth() &&
layer->getHeight() == (uint32_t) rect.getHeight()) {
const float x = (int) floorf(rect.left + currentTransform()->getTranslateX() + 0.5f);