Merge "HWUI: do nothing in case of empty layer" into nyc-dev

am: 21a608f27f

* commit '21a608f27f1f7b9c0fcfbb982f290fed29cc1817':
  HWUI: do nothing in case of empty layer

Change-Id: I264e20e2290f474636a21eb7322377e308d316c2
This commit is contained in:
sergeyv
2016-06-01 00:20:54 +00:00
committed by android-build-merger
2 changed files with 21 additions and 30 deletions

View File

@@ -805,27 +805,21 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
// Note that we don't use op->paint in this function - it's never set on a LayerOp
OffscreenBuffer* buffer = *op.layerHandle;
if (CC_UNLIKELY(!buffer)) {
// Layer was not allocated, which can occur if there were no draw ops inside. We draw the
// equivalent by drawing a rect with the same layer properties (alpha/xfer/filter).
int color = SkColorSetA(SK_ColorTRANSPARENT, op.alpha * 255);
renderRectForLayer(renderer, op, state,
color, op.mode, op.colorFilter);
} else {
float layerAlpha = op.alpha * state.alpha;
Glop glop;
GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
.setRoundRectClipState(state.roundRectClipState)
.setMeshTexturedIndexedVbo(buffer->vbo, buffer->elementCount)
.setFillLayer(buffer->texture, op.colorFilter, layerAlpha, op.mode, Blend::ModeOrderSwap::NoSwap)
.setTransform(state.computedState.transform, TransformFlags::None)
.setModelViewOffsetRectSnap(op.unmappedBounds.left, op.unmappedBounds.top,
Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight()))
.build();
renderer.renderGlop(state, glop);
}
if (CC_UNLIKELY(!buffer)) return;
if (buffer && !buffer->hasRenderedSinceRepaint) {
float layerAlpha = op.alpha * state.alpha;
Glop glop;
GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
.setRoundRectClipState(state.roundRectClipState)
.setMeshTexturedIndexedVbo(buffer->vbo, buffer->elementCount)
.setFillLayer(buffer->texture, op.colorFilter, layerAlpha, op.mode, Blend::ModeOrderSwap::NoSwap)
.setTransform(state.computedState.transform, TransformFlags::None)
.setModelViewOffsetRectSnap(op.unmappedBounds.left, op.unmappedBounds.top,
Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight()))
.build();
renderer.renderGlop(state, glop);
if (!buffer->hasRenderedSinceRepaint) {
buffer->hasRenderedSinceRepaint = true;
if (CC_UNLIKELY(Properties::debugLayersUpdates)) {
// render debug layer highlight

View File

@@ -53,7 +53,7 @@ private:
typedef void (*TestBakedOpReceiver)(BakedOpRenderer&, const BakedOpState&);
static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, RecordedOp* op,
std::function<void(const Glop& glop)> glopVerifier) {
std::function<void(const Glop& glop)> glopVerifier, int expectedGlopCount = 1) {
// Create op, and wrap with basic state.
LinearAllocator allocator;
auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 100));
@@ -61,8 +61,8 @@ static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, R
ASSERT_NE(nullptr, state);
int glopCount = 0;
auto glopReceiver = [&glopVerifier, &glopCount] (const Glop& glop) {
ASSERT_EQ(glopCount++, 0) << "Only one Glop expected";
auto glopReceiver = [&glopVerifier, &glopCount, &expectedGlopCount] (const Glop& glop) {
ASSERT_LE(glopCount++, expectedGlopCount) << expectedGlopCount << "glop(s) expected";
glopVerifier(glop);
};
ValidatingBakedOpRenderer renderer(renderThread.renderState(), glopReceiver);
@@ -75,7 +75,8 @@ static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, R
static TestBakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
#undef X
unmergedReceivers[op->opId](renderer, *state);
ASSERT_EQ(1, glopCount) << "Exactly one Glop expected";
ASSERT_EQ(expectedGlopCount, glopCount) << "Exactly " << expectedGlopCount
<< "Glop(s) expected";
}
RENDERTHREAD_TEST(BakedOpDispatcher, pathTexture_positionOvalArc) {
@@ -119,12 +120,8 @@ RENDERTHREAD_TEST(BakedOpDispatcher, onLayerOp_bufferless) {
OffscreenBuffer* buffer = nullptr; // no providing a buffer, should hit rect fallback case
LayerOp op(Rect(10, 10), Matrix4::identity(), nullptr, &layerPaint, &buffer);
testUnmergedGlopDispatch(renderThread, &op, [&renderThread] (const Glop& glop) {
// rect glop is dispatched with paint props applied
EXPECT_EQ(renderThread.renderState().meshState().getUnitQuadVBO(),
glop.mesh.vertices.bufferObject) << "Unit quad should be drawn";
EXPECT_EQ(nullptr, glop.fill.texture.texture) << "Should be no texture when layer is null";
EXPECT_FLOAT_EQ(128 / 255.0f, glop.fill.color.a) << "Rect quad should use op alpha";
});
ADD_FAILURE() << "Nothing should happen";
}, 0);
}
static int getGlopTransformFlags(renderthread::RenderThread& renderThread, RecordedOp* op) {