Loading libs/hwui/BakedOpDispatcher.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,10 @@ void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRe renderer.renderGlop(state, glop); } void BakedOpDispatcher::onFunctorOp(BakedOpRenderer& renderer, const FunctorOp& op, const BakedOpState& state) { renderer.renderFunctor(op, state); } void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op, const BakedOpState& state) { VertexBuffer buffer; PathTessellator::tessellateLines(op.points, op.floatCount, op.paint, Loading libs/hwui/BakedOpRenderer.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -128,7 +128,7 @@ Texture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) { return texture; } void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) { void BakedOpRenderer::prepareRender(const Rect* dirtyBounds, const Rect* clip) { mRenderState.scissor().setEnabled(clip != nullptr); if (clip) { mRenderState.scissor().set(clip->left, mRenderTarget.viewportHeight - clip->bottom, Loading @@ -140,10 +140,31 @@ void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, cons dirtyBounds->right, dirtyBounds->bottom); mRenderTarget.offscreenBuffer->region.orSelf(dirty); } } void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) { prepareRender(dirtyBounds, clip); mRenderState.render(glop, mRenderTarget.orthoMatrix); if (!mRenderTarget.frameBufferId) mHasDrawn = true; } void BakedOpRenderer::renderFunctor(const FunctorOp& op, const BakedOpState& state) { prepareRender(&state.computedState.clippedBounds, &state.computedState.clipRect); DrawGlInfo info; auto&& clip = state.computedState.clipRect; info.clipLeft = clip.left; info.clipTop = clip.top; info.clipRight = clip.right; info.clipBottom = clip.bottom; info.isLayer = offscreenRenderTarget(); info.width = mRenderTarget.viewportWidth; info.height = mRenderTarget.viewportHeight; state.computedState.transform.copyTo(&info.transform[0]); mRenderState.invokeFunctor(op.functor, DrawGlInfo::kModeDraw, &info); } void BakedOpRenderer::dirtyRenderTarget(const Rect& uiDirty) { if (mRenderTarget.offscreenBuffer) { android::Rect dirty(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom); Loading libs/hwui/BakedOpRenderer.h +4 −2 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ public: void endLayer(); Texture* getTexture(const SkBitmap* bitmap); const LightInfo& getLightInfo() { return mLightInfo; } const LightInfo& getLightInfo() const { return mLightInfo; } void renderGlop(const BakedOpState& state, const Glop& glop) { bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None; Loading @@ -73,14 +73,16 @@ public: useScissor ? &state.computedState.clipRect : nullptr, glop); } void renderFunctor(const FunctorOp& op, const BakedOpState& state); void renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop); bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; } void dirtyRenderTarget(const Rect& dirtyRect); bool didDraw() { return mHasDrawn; } bool didDraw() const { return mHasDrawn; } private: void setViewport(uint32_t width, uint32_t height); void clearColorBuffer(const Rect& clearRect); void prepareRender(const Rect* dirtyBounds, const Rect* clip); RenderState& mRenderState; Caches& mCaches; Loading libs/hwui/OpReorderer.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -784,6 +784,12 @@ void OpReorderer::deferCirclePropsOp(const CirclePropsOp& op) { deferOvalOp(*resolvedOp); } void OpReorderer::deferFunctorOp(const FunctorOp& op) { BakedOpState* bakedState = tryBakeOpState(op); if (!bakedState) return; // quick rejected currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::None); } void OpReorderer::deferLinesOp(const LinesOp& op) { batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices; deferStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced); Loading libs/hwui/RecordedOp.h +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct Vertex; U_OP_FN(BitmapMeshOp) \ U_OP_FN(BitmapRectOp) \ U_OP_FN(CirclePropsOp) \ U_OP_FN(FunctorOp) \ U_OP_FN(LinesOp) \ U_OP_FN(OvalOp) \ M_OP_FN(PatchOp) \ Loading Loading @@ -195,6 +196,13 @@ struct CirclePropsOp : RecordedOp { const float* radius; }; struct FunctorOp : RecordedOp { FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor) : SUPER_PAINTLESS(FunctorOp) , functor(functor) {} Functor* functor; }; struct LinesOp : RecordedOp { LinesOp(BASE_PARAMS, const float* points, const int floatCount) : SUPER(LinesOp) Loading Loading
libs/hwui/BakedOpDispatcher.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,10 @@ void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRe renderer.renderGlop(state, glop); } void BakedOpDispatcher::onFunctorOp(BakedOpRenderer& renderer, const FunctorOp& op, const BakedOpState& state) { renderer.renderFunctor(op, state); } void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op, const BakedOpState& state) { VertexBuffer buffer; PathTessellator::tessellateLines(op.points, op.floatCount, op.paint, Loading
libs/hwui/BakedOpRenderer.cpp +22 −1 Original line number Diff line number Diff line Loading @@ -128,7 +128,7 @@ Texture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) { return texture; } void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) { void BakedOpRenderer::prepareRender(const Rect* dirtyBounds, const Rect* clip) { mRenderState.scissor().setEnabled(clip != nullptr); if (clip) { mRenderState.scissor().set(clip->left, mRenderTarget.viewportHeight - clip->bottom, Loading @@ -140,10 +140,31 @@ void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, cons dirtyBounds->right, dirtyBounds->bottom); mRenderTarget.offscreenBuffer->region.orSelf(dirty); } } void BakedOpRenderer::renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop) { prepareRender(dirtyBounds, clip); mRenderState.render(glop, mRenderTarget.orthoMatrix); if (!mRenderTarget.frameBufferId) mHasDrawn = true; } void BakedOpRenderer::renderFunctor(const FunctorOp& op, const BakedOpState& state) { prepareRender(&state.computedState.clippedBounds, &state.computedState.clipRect); DrawGlInfo info; auto&& clip = state.computedState.clipRect; info.clipLeft = clip.left; info.clipTop = clip.top; info.clipRight = clip.right; info.clipBottom = clip.bottom; info.isLayer = offscreenRenderTarget(); info.width = mRenderTarget.viewportWidth; info.height = mRenderTarget.viewportHeight; state.computedState.transform.copyTo(&info.transform[0]); mRenderState.invokeFunctor(op.functor, DrawGlInfo::kModeDraw, &info); } void BakedOpRenderer::dirtyRenderTarget(const Rect& uiDirty) { if (mRenderTarget.offscreenBuffer) { android::Rect dirty(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom); Loading
libs/hwui/BakedOpRenderer.h +4 −2 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ public: void endLayer(); Texture* getTexture(const SkBitmap* bitmap); const LightInfo& getLightInfo() { return mLightInfo; } const LightInfo& getLightInfo() const { return mLightInfo; } void renderGlop(const BakedOpState& state, const Glop& glop) { bool useScissor = state.computedState.clipSideFlags != OpClipSideFlags::None; Loading @@ -73,14 +73,16 @@ public: useScissor ? &state.computedState.clipRect : nullptr, glop); } void renderFunctor(const FunctorOp& op, const BakedOpState& state); void renderGlop(const Rect* dirtyBounds, const Rect* clip, const Glop& glop); bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; } void dirtyRenderTarget(const Rect& dirtyRect); bool didDraw() { return mHasDrawn; } bool didDraw() const { return mHasDrawn; } private: void setViewport(uint32_t width, uint32_t height); void clearColorBuffer(const Rect& clearRect); void prepareRender(const Rect* dirtyBounds, const Rect* clip); RenderState& mRenderState; Caches& mCaches; Loading
libs/hwui/OpReorderer.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -784,6 +784,12 @@ void OpReorderer::deferCirclePropsOp(const CirclePropsOp& op) { deferOvalOp(*resolvedOp); } void OpReorderer::deferFunctorOp(const FunctorOp& op) { BakedOpState* bakedState = tryBakeOpState(op); if (!bakedState) return; // quick rejected currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::None); } void OpReorderer::deferLinesOp(const LinesOp& op) { batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices; deferStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced); Loading
libs/hwui/RecordedOp.h +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct Vertex; U_OP_FN(BitmapMeshOp) \ U_OP_FN(BitmapRectOp) \ U_OP_FN(CirclePropsOp) \ U_OP_FN(FunctorOp) \ U_OP_FN(LinesOp) \ U_OP_FN(OvalOp) \ M_OP_FN(PatchOp) \ Loading Loading @@ -195,6 +196,13 @@ struct CirclePropsOp : RecordedOp { const float* radius; }; struct FunctorOp : RecordedOp { FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor) : SUPER_PAINTLESS(FunctorOp) , functor(functor) {} Functor* functor; }; struct LinesOp : RecordedOp { LinesOp(BASE_PARAMS, const float* points, const int floatCount) : SUPER(LinesOp) Loading