1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gtest/gtest.h> 18 19#include <BakedOpRenderer.h> 20#include <GlopBuilder.h> 21#include <tests/common/TestUtils.h> 22 23using namespace android::uirenderer; 24 25const BakedOpRenderer::LightInfo sLightInfo = {128, 128}; 26 27RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, startRepaintLayer_clear) { 28 BakedOpRenderer renderer(Caches::getInstance(), renderThread.renderState(), true, false, 29 sLightInfo); 30 OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200u, 200u); 31 32 layer.dirty(Rect(200, 200)); 33 { 34 renderer.startRepaintLayer(&layer, Rect(200, 200)); 35 EXPECT_TRUE(layer.region.isEmpty()) << "Repaint full layer should clear region"; 36 renderer.endLayer(); 37 } 38 39 layer.dirty(Rect(200, 200)); 40 { 41 renderer.startRepaintLayer(&layer, Rect(100, 200)); // repainting left side 42 EXPECT_TRUE(layer.region.isRect()); 43 // ALOGD("bounds %d %d %d %d", RECT_ARGS(layer.region.getBounds())); 44 EXPECT_EQ(android::Rect(100, 0, 200, 200), layer.region.getBounds()) 45 << "Left side being repainted, so right side should be clear"; 46 renderer.endLayer(); 47 } 48 49 // right side is now only dirty portion 50 { 51 renderer.startRepaintLayer(&layer, Rect(100, 0, 200, 200)); // repainting right side 52 EXPECT_TRUE(layer.region.isEmpty()) 53 << "Now right side being repainted, so region should be entirely clear"; 54 renderer.endLayer(); 55 } 56} 57 58static void drawFirstOp(RenderState& renderState, int color, SkBlendMode mode) { 59 BakedOpRenderer renderer(Caches::getInstance(), renderState, true, false, sLightInfo); 60 61 renderer.startFrame(100, 100, Rect(100, 100)); 62 SkPaint paint; 63 paint.setColor(color); 64 paint.setBlendMode(mode); 65 66 Rect dest(0, 0, 100, 100); 67 Glop glop; 68 GlopBuilder(renderState, Caches::getInstance(), &glop) 69 .setRoundRectClipState(nullptr) 70 .setMeshUnitQuad() 71 .setFillPaint(paint, 1.0f) 72 .setTransform(Matrix4::identity(), TransformFlags::None) 73 .setModelViewMapUnitToRectSnap(dest) 74 .build(); 75 renderer.renderGlop(nullptr, nullptr, glop); 76 renderer.endFrame(Rect(100, 100)); 77} 78 79static void verifyBlend(RenderState& renderState, GLenum expectedSrc, GLenum expectedDst) { 80 EXPECT_TRUE(renderState.blend().getEnabled()); 81 GLenum src; 82 GLenum dst; 83 renderState.blend().getFactors(&src, &dst); 84 EXPECT_EQ(expectedSrc, src); 85 EXPECT_EQ(expectedDst, dst); 86} 87 88static void verifyBlendDisabled(RenderState& renderState) { 89 EXPECT_FALSE(renderState.blend().getEnabled()); 90} 91 92RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_clear) { 93 // initialize blend state to nonsense value 94 renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE); 95 96 drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kClear); 97 verifyBlend(renderThread.renderState(), GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 98} 99 100RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_srcover) { 101 // initialize blend state to nonsense value 102 renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE); 103 104 drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kSrcOver); 105 verifyBlendDisabled(renderThread.renderState()); 106} 107