diff options
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/Layer.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/Layer.h | 14 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 5 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.h | 2 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 1 |
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); |