Loading libs/hwui/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ LOCAL_SRC_FILES += \ tests/unit/SkiaBehaviorTests.cpp \ tests/unit/SnapshotTests.cpp \ tests/unit/StringUtilsTests.cpp \ tests/unit/TestUtilsTests.cpp \ tests/unit/TextDropShadowCacheTests.cpp \ tests/unit/VectorDrawableTests.cpp Loading libs/hwui/BakedOpDispatcher.cpp +26 −6 Original line number Diff line number Diff line Loading @@ -791,6 +791,16 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur renderer.renderGlop(state, glop); } void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state, int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) { SkPaint paint; paint.setColor(color); paint.setXfermodeMode(mode); paint.setColorFilter(colorFilter); RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); } void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) { // Note that we don't use op->paint in this function - it's never set on a LayerOp OffscreenBuffer* buffer = *op.layerHandle; Loading @@ -798,12 +808,9 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, 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). SkPaint paint; paint.setAlpha(op.alpha * 255); paint.setXfermodeMode(op.mode); paint.setColorFilter(op.colorFilter); RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); 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; Loading @@ -817,6 +824,19 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, .build(); renderer.renderGlop(state, glop); } if (buffer && !buffer->hasRenderedSinceRepaint) { buffer->hasRenderedSinceRepaint = true; if (CC_UNLIKELY(Properties::debugLayersUpdates)) { // render debug layer highlight renderRectForLayer(renderer, op, state, 0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr); } else if (CC_UNLIKELY(Properties::debugOverdraw)) { // render transparent to increment overdraw for repaint area renderRectForLayer(renderer, op, state, SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr); } } } void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) { Loading libs/hwui/BakedOpRenderer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const } mRenderTarget.offscreenBuffer = offscreenBuffer; mRenderTarget.offscreenBuffer->hasRenderedSinceRepaint = false; // create and bind framebuffer mRenderTarget.frameBufferId = mRenderState.createFramebuffer(); Loading libs/hwui/FrameBuilder.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // only schedule repaint if node still on layer - possible it may have been // removed during a dropped frame, but layers may still remain scheduled so // as not to lose info on what portion is damaged if (CC_LIKELY(layerNode->getLayer() != nullptr)) { OffscreenBuffer* layer = layerNode->getLayer(); if (CC_LIKELY(layer)) { ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u", layerNode->getName(), layerNode->getWidth(), layerNode->getHeight()); Loading @@ -90,7 +91,7 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // map current light center into RenderNode's coordinate space Vector3 lightCenter = mCanvasState.currentSnapshot()->getRelativeLightCenter(); layerNode->getLayer()->inverseTransformInWindow.mapPoint3d(lightCenter); layer->inverseTransformInWindow.mapPoint3d(lightCenter); saveForLayer(layerNode->getWidth(), layerNode->getHeight(), 0, 0, layerDamage, lightCenter, nullptr, layerNode); Loading libs/hwui/renderstate/OffscreenBufferPool.h +2 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,8 @@ public: // vbo / size of mesh GLsizei elementCount = 0; GLuint vbo = 0; bool hasRenderedSinceRepaint; }; /** Loading Loading
libs/hwui/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ LOCAL_SRC_FILES += \ tests/unit/SkiaBehaviorTests.cpp \ tests/unit/SnapshotTests.cpp \ tests/unit/StringUtilsTests.cpp \ tests/unit/TestUtilsTests.cpp \ tests/unit/TextDropShadowCacheTests.cpp \ tests/unit/VectorDrawableTests.cpp Loading
libs/hwui/BakedOpDispatcher.cpp +26 −6 Original line number Diff line number Diff line Loading @@ -791,6 +791,16 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur renderer.renderGlop(state, glop); } void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state, int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) { SkPaint paint; paint.setColor(color); paint.setXfermodeMode(mode); paint.setColorFilter(colorFilter); RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); } void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state) { // Note that we don't use op->paint in this function - it's never set on a LayerOp OffscreenBuffer* buffer = *op.layerHandle; Loading @@ -798,12 +808,9 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, 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). SkPaint paint; paint.setAlpha(op.alpha * 255); paint.setXfermodeMode(op.mode); paint.setColorFilter(op.colorFilter); RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); 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; Loading @@ -817,6 +824,19 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, .build(); renderer.renderGlop(state, glop); } if (buffer && !buffer->hasRenderedSinceRepaint) { buffer->hasRenderedSinceRepaint = true; if (CC_UNLIKELY(Properties::debugLayersUpdates)) { // render debug layer highlight renderRectForLayer(renderer, op, state, 0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr); } else if (CC_UNLIKELY(Properties::debugOverdraw)) { // render transparent to increment overdraw for repaint area renderRectForLayer(renderer, op, state, SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr); } } } void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op, const BakedOpState& state) { Loading
libs/hwui/BakedOpRenderer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const } mRenderTarget.offscreenBuffer = offscreenBuffer; mRenderTarget.offscreenBuffer->hasRenderedSinceRepaint = false; // create and bind framebuffer mRenderTarget.frameBufferId = mRenderState.createFramebuffer(); Loading
libs/hwui/FrameBuilder.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // only schedule repaint if node still on layer - possible it may have been // removed during a dropped frame, but layers may still remain scheduled so // as not to lose info on what portion is damaged if (CC_LIKELY(layerNode->getLayer() != nullptr)) { OffscreenBuffer* layer = layerNode->getLayer(); if (CC_LIKELY(layer)) { ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u", layerNode->getName(), layerNode->getWidth(), layerNode->getHeight()); Loading @@ -90,7 +91,7 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) { // map current light center into RenderNode's coordinate space Vector3 lightCenter = mCanvasState.currentSnapshot()->getRelativeLightCenter(); layerNode->getLayer()->inverseTransformInWindow.mapPoint3d(lightCenter); layer->inverseTransformInWindow.mapPoint3d(lightCenter); saveForLayer(layerNode->getWidth(), layerNode->getHeight(), 0, 0, layerDamage, lightCenter, nullptr, layerNode); Loading
libs/hwui/renderstate/OffscreenBufferPool.h +2 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,8 @@ public: // vbo / size of mesh GLsizei elementCount = 0; GLuint vbo = 0; bool hasRenderedSinceRepaint; }; /** Loading