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

Commit 453932d5 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Kawase blur filter

For better performance and more stable large radius.
Also removing LensFilter given that performance was not
good enough for real time effects.

Test: visual (on Kawase and Gaussian)
Bug: 148614710
Change-Id: I81fd2cce030dafb8d87a7c65606632ac1ecfa113
parent 3729f2c6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ filegroup {
        "gl/Program.cpp",
        "gl/ProgramCache.cpp",
        "gl/filters/BlurFilter.cpp",
        "gl/filters/LensBlurFilter.cpp",
        "gl/filters/KawaseBlurFilter.cpp",
        "gl/filters/GaussianBlurFilter.cpp",
        "gl/filters/GenericProgram.cpp",
    ],
+6 −3
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@
#include "ProgramCache.h"
#include "filters/BlurFilter.h"
#include "filters/GaussianBlurFilter.h"
#include "filters/LensBlurFilter.h"
#include "filters/KawaseBlurFilter.h"

extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);

@@ -285,6 +285,9 @@ std::unique_ptr<GLESRenderEngine> GLESRenderEngine::create(const RenderEngineCre
    // now figure out what version of GL did we actually get
    GlesVersion version = parseGlesVersion(extensions.getVersion());

    LOG_ALWAYS_FATAL_IF(args.supportsBackgroundBlur && version < GLES_VERSION_3_0,
        "Blurs require OpenGL ES 3.0. Please unset ro.surface_flinger.supports_background_blur");

    // initialize the renderer while GL is current
    std::unique_ptr<GLESRenderEngine> engine;
    switch (version) {
@@ -428,11 +431,11 @@ GLESRenderEngine::GLESRenderEngine(const RenderEngineCreationArgs& args, EGLDisp

    if (args.supportsBackgroundBlur) {
        char isGaussian[PROPERTY_VALUE_MAX];
        property_get("debug.sf.gaussianBlur", isGaussian, "1");
        property_get("debug.sf.gaussianBlur", isGaussian, "0");
        if (atoi(isGaussian)) {
            mBlurFilter = new GaussianBlurFilter(*this);
        } else {
            mBlurFilter = new LensBlurFilter(*this);
            mBlurFilter = new KawaseBlurFilter(*this);
        }
        checkErrors("BlurFilter creation");
    }
+1 −1
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ private:
    friend class GLFramebuffer;
    friend class BlurFilter;
    friend class GaussianBlurFilter;
    friend class LensBlurFilter;
    friend class KawaseBlurFilter;
    friend class GenericProgram;
    std::unique_ptr<FlushTracer> mFlushTracer;
    std::unique_ptr<ImageManager> mImageManager = std::make_unique<ImageManager>(this);
+13 −3
Original line number Diff line number Diff line
@@ -71,8 +71,18 @@ status_t BlurFilter::setAsDrawTarget(const DisplaySettings& display, uint32_t ra
}

void BlurFilter::drawMesh(GLuint uv, GLuint position) {
    GLfloat positions[] = {-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f};
    GLfloat texCoords[] = {0.0, 0.0, 0.0, 1.0f, 1.0f, 1.0f, 1.0f, 0};
    static constexpr auto size = 2.0f;
    static constexpr auto translation = 1.0f;
    GLfloat positions[] = {
        translation-size, -translation-size,
        translation-size, -translation+size,
        translation+size, -translation+size
    };
    GLfloat texCoords[] = {
        0.0f, 0.0f-translation,
        0.0f, size-translation,
        size, size-translation
    };

    // set attributes
    glEnableVertexAttribArray(uv);
@@ -82,7 +92,7 @@ void BlurFilter::drawMesh(GLuint uv, GLuint position) {
                          positions);

    // draw mesh
    glDrawArrays(GL_TRIANGLE_FAN, 0 /* first */, 4 /* count */);
    glDrawArrays(GL_TRIANGLES, 0 /* first */, 3 /* count */);
    mEngine.checkErrors("Drawing blur mesh");
}

+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ public:
    static constexpr float kFboScale = 0.25f;
    // To avoid downscaling artifacts, we interpolate the blurred fbo with the full composited
    // image, up to this radius.
    static constexpr float kMaxCrossFadeRadius = 15.0f;
    static constexpr float kMaxCrossFadeRadius = 30.0f;

    explicit BlurFilter(GLESRenderEngine& engine);
    virtual ~BlurFilter(){};
Loading