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

Commit 08fa43fd authored by Chris Craik's avatar Chris Craik
Browse files

Fix Glop vertex alpha blending

Need to force blending if vertices have alpha attribute

Change-Id: I821792db6b613b4d0243cf9c7a045cba014acdc1
parent 2ab95d78
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -35,6 +35,10 @@ namespace uirenderer {
    LOG_ALWAYS_FATAL_IF(stageFlag & mStageFlags, "Stage %d cannot be run twice"); \
    mStageFlags = static_cast<StageFlags>(mStageFlags | stageFlag)

#define REQUIRE_STAGES(requiredFlags) \
    LOG_ALWAYS_FATAL_IF((mStageFlags & requiredFlags) != requiredFlags, \
            "not prepared for current stage")

GlopBuilder::GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop)
        : mRenderState(renderState)
        , mCaches(caches)
@@ -127,12 +131,14 @@ GlopBuilder& GlopBuilder::setOptionalPaint(const SkPaint* paint, float alphaScal
    }

    TRIGGER_STAGE(kFillStage);
    REQUIRE_STAGES(kMeshStage);

    mOutGlop->fill.color = { alphaScale, alphaScale, alphaScale, alphaScale };

    const bool SWAP_SRC_DST = false;
    // TODO: account for texture blend
    if (alphaScale < 1.0f) {
    if (alphaScale < 1.0f
            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)) {
        Blend::getFactors(SkXfermode::kSrcOver_Mode, SWAP_SRC_DST,
                &mOutGlop->blend.src, &mOutGlop->blend.dst);
    } else {
@@ -143,6 +149,7 @@ GlopBuilder& GlopBuilder::setOptionalPaint(const SkPaint* paint, float alphaScal
}
GlopBuilder& GlopBuilder::setPaint(const SkPaint& paint, float alphaScale) {
    TRIGGER_STAGE(kFillStage);
    REQUIRE_STAGES(kMeshStage);

    const SkShader* shader = paint.getShader();
    const SkColorFilter* colorFilter = paint.getColorFilter();
@@ -169,6 +176,7 @@ GlopBuilder& GlopBuilder::setPaint(const SkPaint& paint, float alphaScale) {

    mOutGlop->blend = { GL_ZERO, GL_ZERO };
    if (mOutGlop->fill.color.a < 1.0f
            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)
            || PaintUtils::isBlendedShader(shader)
            || PaintUtils::isBlendedColorFilter(colorFilter)
            || mode != SkXfermode::kSrcOver_Mode) {
@@ -242,7 +250,7 @@ GlopBuilder& GlopBuilder::setPaint(const SkPaint& paint, float alphaScale) {
}

void GlopBuilder::build() {
    LOG_ALWAYS_FATAL_IF(mStageFlags != kAllStages, "glop not fully prepared!");
    REQUIRE_STAGES(kAllStages);

    mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
    mOutGlop->fill.program = mCaches.programCache.get(mDescription);
+5 −1
Original line number Diff line number Diff line
@@ -67,7 +67,11 @@ MeshState::~MeshState() {
}

void MeshState::dump() {
    ALOGD("MeshState vertices: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer);
    ALOGD("MeshState VBOs: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer);
    ALOGD("MeshState vertices: vertex data %p, stride %d",
            mCurrentPositionPointer, mCurrentPositionStride);
    ALOGD("MeshState texCoord: data %p, stride %d",
            mCurrentTexCoordsPointer, mCurrentTexCoordsStride);
}

///////////////////////////////////////////////////////////////////////////////
+2 −3
Original line number Diff line number Diff line
@@ -210,7 +210,7 @@ public:
        renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
        renderer->insertReorderBarrier(true);

        card = createCard(40, 40, 200, 200);
        card = createCard(40, 40, 400, 400);
        renderer->drawRenderNode(card.get(), DUMMY, 0);

        renderer->insertReorderBarrier(false);
@@ -228,11 +228,10 @@ private:
        node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);

        DisplayListRenderer* renderer = startRecording(node.get());
        renderer->drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode);

        SkPaint paint;
        paint.setAntiAlias(true);
        paint.setColor(0xFF00FFFF);
        paint.setColor(0xFF000000);
        renderer->drawOval(0, 0, width, height, paint);

        endRecording(renderer, node.get());