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

Commit 69ff5de1 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

improve video performance to minimize the tearing effect seen in 720p movies

always rescale videos to their target size using copybit during yuv->rgb
conversion. this improves performance of the GPU pass and doesn't require
linear filtering to be enabled. Also always use 16-bits buffers.

the average processing time for 720p dropped from ~50ms to ~30ms
parent ac16968d
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -120,9 +120,7 @@ uint32_t LayerBuffer::doTransaction(uint32_t flags)
        source->onTransaction(flags);
    uint32_t res = LayerBase::doTransaction(flags);
    // we always want filtering for these surfaces
    if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
        mUseLinearFiltering = true;
    }
    mUseLinearFiltering = !(mFlags & DisplayHardware::SLOW_CONFIG);
    return res;
}

@@ -371,25 +369,33 @@ LayerBuffer::BufferSource::BufferSource(LayerBuffer& layer,
        // note that the size of this buffer doesn't really matter,
        // the final image will always be drawn with proper aspect ratio.

        int w = buffers.w;
        int h = buffers.h;
        int w = layer.mTransformedBounds.width();
        int h = layer.mTransformedBounds.height();
        if (buffers.w * h != buffers.h * w) {
            int t = w; w = h; h = t;
        }
        if (buffers.w * h == buffers.h * w) {
            // same pixel area, don't use filtering
            layer.mUseLinearFiltering = false;
        }

        mTempGraphicBuffer.clear();
        mTempGraphicBuffer = new GraphicBuffer(
                w, h, HAL_PIXEL_FORMAT_RGBX_8888,
                w, h, HAL_PIXEL_FORMAT_RGB_565,
                GraphicBuffer::USAGE_HW_TEXTURE |
                GraphicBuffer::USAGE_HW_2D);

        if (mTempGraphicBuffer->initCheck() == NO_ERROR) {
            NativeBuffer& dst(mTempBuffer);
            dst.img.w = mTempGraphicBuffer->getStride();
            dst.img.h = mTempGraphicBuffer->getHeight();
            dst.img.h = h;
            dst.img.format = mTempGraphicBuffer->getPixelFormat();
            dst.img.handle = (native_handle_t *)mTempGraphicBuffer->handle;
            dst.img.base = 0;
            dst.crop.l = 0;
            dst.crop.t = 0;
            dst.crop.r = mTempGraphicBuffer->getWidth();
            dst.crop.b = mTempGraphicBuffer->getHeight();
            dst.crop.r = w;
            dst.crop.b = h;
        } else {
            mTempGraphicBuffer.clear();
        }