Fix Glop vertex alpha blending
Need to force blending if vertices have alpha attribute Change-Id: I821792db6b613b4d0243cf9c7a045cba014acdc1
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user