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

Commit 8604c8f1 authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Gerrit Code Review
Browse files

Merge "Forward-port surface dithering from CM10.2" into cm-11.0

parents d7065ba1 fe5087b3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info);

ssize_t bytesPerPixel(PixelFormat format);
ssize_t bitsPerPixel(PixelFormat format);
unsigned int minColorDepth(PixelFormat format);

}; // namespace android

+16 −0
Original line number Diff line number Diff line
@@ -160,6 +160,22 @@ ssize_t bitsPerPixel(PixelFormat format) {
    return BAD_VALUE;
}

unsigned int minColorDepth(PixelFormat format) {
    switch (format) {
        case PIXEL_FORMAT_RGBA_8888:
        case PIXEL_FORMAT_RGBX_8888:
        case PIXEL_FORMAT_BGRA_8888:
        case PIXEL_FORMAT_RGB_888:
            return 8;
        case PIXEL_FORMAT_RGB_565:
        case PIXEL_FORMAT_RGBA_5551:
            return 5;
        case PIXEL_FORMAT_RGBA_4444:
            return 4;
    }
    return BAD_VALUE;
}

// ----------------------------------------------------------------------------
}; // namespace android
// ----------------------------------------------------------------------------
+9 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
        mDebug(false),
        mFormat(PIXEL_FORMAT_NONE),
        mOpaqueLayer(true),
        mNeedsDithering(false),
        mTransactionFlags(0),
        mQueuedFrames(0),
        mCurrentTransform(0),
@@ -199,6 +200,12 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h,
    mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));

    if (mFlinger->getUseDithering()) {
        int displayMinColorDepth = mFlinger->getMinColorDepth();
        int layerMinColorDepth = minColorDepth(format);
        mNeedsDithering = (layerMinColorDepth > displayMinColorDepth);
    }

    return NO_ERROR;
}

@@ -573,6 +580,7 @@ void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& cli
{
    RenderEngine& engine(mFlinger->getRenderEngine());
    computeGeometry(hw, mMesh);
    engine.setDither(false);
    engine.setupFillWithColor(red, green, blue, alpha);
    engine.drawMesh(mMesh);
}
@@ -619,6 +627,7 @@ void Layer::drawWithOpenGL(
    texCoords[3] = vec2(right, 1.0f - top);

    RenderEngine& engine(mFlinger->getRenderEngine());
    engine.setDither(needsDithering());
    engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(), s.alpha);
    engine.drawMesh(mMesh);
    engine.disableBlending();
+6 −0
Original line number Diff line number Diff line
@@ -152,6 +152,11 @@ public:
     */
    virtual bool isOpaque() const;

    /*
     * needsDithering - true if this surface needs dithering
     */
    virtual bool needsDithering() const     { return mNeedsDithering; }

    /*
     * isSecure - true if this surface is secure, that is if it prevents
     * screenshots or VNC servers.
@@ -340,6 +345,7 @@ private:
    mutable bool mDebug;
    PixelFormat mFormat;
    bool mOpaqueLayer;
    bool mNeedsDithering;

    // these are protected by an external lock
    State mCurrentState;
+8 −0
Original line number Diff line number Diff line
@@ -205,6 +205,14 @@ void RenderEngine::readPixels(size_t l, size_t b, size_t w, size_t h, uint32_t*
    glReadPixels(l, b, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}

void RenderEngine::setDither(bool dither) {
    if (dither) {
        glEnable(GL_DITHER);
    } else {
        glDisable(GL_DITHER);
    }
}

void RenderEngine::dump(String8& result) {
    const GLExtensions& extensions(GLExtensions::getInstance());
    result.appendFormat("GLES: %s, %s, %s\n",
Loading