Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9757ac0b authored by Chris Craik's avatar Chris Craik
Browse files

Fix TextureView texture filtering.

bug:11748993

TextureView should always be drawn with linear filtering if drawing a
buffer sized differently from the layer.

This fixes a bug where TextureViews that were sized differently from
their contents wouldn't be drawn with texture filtering, causing
visible scaling artifacts.

Change-Id: I8a5d27452fe7269ec53896992f37cff51e3ce15a
parent 5eb4adcb
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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);
    }
}

+1 −0
Original line number Diff line number Diff line
@@ -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);
}
+14 −0
Original line number Diff line number Diff line
@@ -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;
    }
@@ -342,10 +350,16 @@ 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.
     */
+3 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
Loading