Loading libs/hwui/RecordingCanvas.cpp +3 −3 Original line number Original line Diff line number Diff line Loading @@ -24,8 +24,8 @@ namespace android { namespace android { namespace uirenderer { namespace uirenderer { #define MIL_PIX 1000000 static Rect sUnreasonablyLargeBounds(-10000, -10000, 10000, 10000); static Rect sUnreasonablyLargeBounds(-MIL_PIX, -MIL_PIX, MIL_PIX, MIL_PIX); static const Rect& getConservativeOpBounds(const ClipBase* clip) { static const Rect& getConservativeOpBounds(const ClipBase* clip) { // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect Loading Loading @@ -595,7 +595,7 @@ void RecordingCanvas::callDrawGLFunction(Functor* functor) { mDisplayList->functors.push_back(functor); mDisplayList->functors.push_back(functor); auto clip = getRecordedClip(); auto clip = getRecordedClip(); addOp(alloc().create_trivial<FunctorOp>( addOp(alloc().create_trivial<FunctorOp>( getConservativeOpBounds(clip), // TODO: explicitly define bounds getConservativeOpBounds(clip), *(mState.currentSnapshot()->transform), *(mState.currentSnapshot()->transform), clip, clip, functor)); functor)); Loading libs/hwui/tests/unit/FrameBuilderTests.cpp +24 −0 Original line number Original line Diff line number Diff line Loading @@ -349,6 +349,29 @@ RENDERTHREAD_TEST(FrameBuilder, textureLayer) { EXPECT_EQ(1, renderer.getIndex()); EXPECT_EQ(1, renderer.getIndex()); } } TEST(FrameBuilder, functor_reject) { class FunctorTestRenderer : public TestRendererBase { public: void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override { EXPECT_EQ(0, mIndex++); } }; Functor noopFunctor; // 1 million pixel tall view, scrolled down 80% auto scrolledFunctorView = TestUtils::createNode(0, 0, 400, 1000000, [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) { canvas.translate(0, -800000); canvas.callDrawGLFunction(&noopFunctor); }); FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(200, 200), 200, 200, TestUtils::createSyncedNodeList(scrolledFunctorView), sLightGeometry, nullptr); FunctorTestRenderer renderer; frameBuilder.replayBakedOps<TestDispatcher>(renderer); EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected"; } TEST(FrameBuilder, renderNode) { TEST(FrameBuilder, renderNode) { class RenderNodeTestRenderer : public TestRendererBase { class RenderNodeTestRenderer : public TestRendererBase { public: public: Loading Loading @@ -391,6 +414,7 @@ TEST(FrameBuilder, renderNode) { TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); RenderNodeTestRenderer renderer; RenderNodeTestRenderer renderer; frameBuilder.replayBakedOps<TestDispatcher>(renderer); frameBuilder.replayBakedOps<TestDispatcher>(renderer); EXPECT_EQ(2, renderer.getIndex()); } } TEST(FrameBuilder, clipped) { TEST(FrameBuilder, clipped) { Loading Loading
libs/hwui/RecordingCanvas.cpp +3 −3 Original line number Original line Diff line number Diff line Loading @@ -24,8 +24,8 @@ namespace android { namespace android { namespace uirenderer { namespace uirenderer { #define MIL_PIX 1000000 static Rect sUnreasonablyLargeBounds(-10000, -10000, 10000, 10000); static Rect sUnreasonablyLargeBounds(-MIL_PIX, -MIL_PIX, MIL_PIX, MIL_PIX); static const Rect& getConservativeOpBounds(const ClipBase* clip) { static const Rect& getConservativeOpBounds(const ClipBase* clip) { // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect // if op is clipped, that rect can be used, but otherwise just use a conservatively large rect Loading Loading @@ -595,7 +595,7 @@ void RecordingCanvas::callDrawGLFunction(Functor* functor) { mDisplayList->functors.push_back(functor); mDisplayList->functors.push_back(functor); auto clip = getRecordedClip(); auto clip = getRecordedClip(); addOp(alloc().create_trivial<FunctorOp>( addOp(alloc().create_trivial<FunctorOp>( getConservativeOpBounds(clip), // TODO: explicitly define bounds getConservativeOpBounds(clip), *(mState.currentSnapshot()->transform), *(mState.currentSnapshot()->transform), clip, clip, functor)); functor)); Loading
libs/hwui/tests/unit/FrameBuilderTests.cpp +24 −0 Original line number Original line Diff line number Diff line Loading @@ -349,6 +349,29 @@ RENDERTHREAD_TEST(FrameBuilder, textureLayer) { EXPECT_EQ(1, renderer.getIndex()); EXPECT_EQ(1, renderer.getIndex()); } } TEST(FrameBuilder, functor_reject) { class FunctorTestRenderer : public TestRendererBase { public: void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override { EXPECT_EQ(0, mIndex++); } }; Functor noopFunctor; // 1 million pixel tall view, scrolled down 80% auto scrolledFunctorView = TestUtils::createNode(0, 0, 400, 1000000, [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) { canvas.translate(0, -800000); canvas.callDrawGLFunction(&noopFunctor); }); FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(200, 200), 200, 200, TestUtils::createSyncedNodeList(scrolledFunctorView), sLightGeometry, nullptr); FunctorTestRenderer renderer; frameBuilder.replayBakedOps<TestDispatcher>(renderer); EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected"; } TEST(FrameBuilder, renderNode) { TEST(FrameBuilder, renderNode) { class RenderNodeTestRenderer : public TestRendererBase { class RenderNodeTestRenderer : public TestRendererBase { public: public: Loading Loading @@ -391,6 +414,7 @@ TEST(FrameBuilder, renderNode) { TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); TestUtils::createSyncedNodeList(parent), sLightGeometry, nullptr); RenderNodeTestRenderer renderer; RenderNodeTestRenderer renderer; frameBuilder.replayBakedOps<TestDispatcher>(renderer); frameBuilder.replayBakedOps<TestDispatcher>(renderer); EXPECT_EQ(2, renderer.getIndex()); } } TEST(FrameBuilder, clipped) { TEST(FrameBuilder, clipped) { Loading