Remove DisplayList.h dependency from Canvas.h
Canvas is included in a lot of places, reduce include dependencies Test: make Change-Id: Iab513de8d4bc3eb18220307acc124859dbf44030
This commit is contained in:
@@ -53,9 +53,8 @@ public:
|
||||
LOG_ALWAYS_FATAL("SkiaCanvas cannot be reset as a recording canvas");
|
||||
}
|
||||
|
||||
virtual uirenderer::DisplayList finishRecording() override {
|
||||
virtual void finishRecording(uirenderer::RenderNode*) override {
|
||||
LOG_ALWAYS_FATAL("SkiaCanvas does not produce a DisplayList");
|
||||
return uirenderer::DisplayList();
|
||||
}
|
||||
virtual void enableZ(bool enableZ) override {
|
||||
LOG_ALWAYS_FATAL("SkiaCanvas does not support enableZ");
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <SaveFlags.h>
|
||||
|
||||
#include <androidfw/ResourceTypes.h>
|
||||
#include "DisplayList.h"
|
||||
#include "Properties.h"
|
||||
#include "utils/Macros.h"
|
||||
|
||||
@@ -118,7 +117,7 @@ public:
|
||||
|
||||
virtual void resetRecording(int width, int height,
|
||||
uirenderer::RenderNode* renderNode = nullptr) = 0;
|
||||
[[nodiscard]] virtual uirenderer::DisplayList finishRecording() = 0;
|
||||
virtual void finishRecording(uirenderer::RenderNode* destination) = 0;
|
||||
virtual void enableZ(bool enableZ) = 0;
|
||||
|
||||
bool isHighContrastText() const { return uirenderer::Properties::enableHighContrastText; }
|
||||
|
||||
@@ -102,7 +102,7 @@ static void android_view_DisplayListCanvas_finishRecording(
|
||||
CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
|
||||
Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
|
||||
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
|
||||
renderNode->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(renderNode);
|
||||
}
|
||||
|
||||
static void android_view_DisplayListCanvas_drawRenderNode(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
|
||||
|
||||
@@ -55,11 +55,15 @@ void SkiaRecordingCanvas::initDisplayList(uirenderer::RenderNode* renderNode, in
|
||||
SkiaCanvas::reset(&mRecorder);
|
||||
}
|
||||
|
||||
uirenderer::DisplayList SkiaRecordingCanvas::finishRecording() {
|
||||
std::unique_ptr<SkiaDisplayList> SkiaRecordingCanvas::finishRecording() {
|
||||
// close any existing chunks if necessary
|
||||
enableZ(false);
|
||||
mRecorder.restoreToCount(1);
|
||||
return uirenderer::DisplayList(std::move(mDisplayList));
|
||||
return std::move(mDisplayList);
|
||||
}
|
||||
|
||||
void SkiaRecordingCanvas::finishRecording(uirenderer::RenderNode* destination) {
|
||||
destination->setStagingDisplayList(uirenderer::DisplayList(finishRecording()));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -39,11 +39,12 @@ public:
|
||||
}
|
||||
|
||||
virtual void resetRecording(int width, int height,
|
||||
uirenderer::RenderNode* renderNode) override {
|
||||
uirenderer::RenderNode* renderNode = nullptr) override {
|
||||
initDisplayList(renderNode, width, height);
|
||||
}
|
||||
|
||||
virtual uirenderer::DisplayList finishRecording() override;
|
||||
virtual void finishRecording(uirenderer::RenderNode* destination) override;
|
||||
std::unique_ptr<SkiaDisplayList> finishRecording();
|
||||
|
||||
virtual void drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) override;
|
||||
virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* paint) override;
|
||||
|
||||
@@ -70,7 +70,7 @@ void TestListViewSceneBase::doFrame(int frameNr) {
|
||||
// draw it to parent DisplayList
|
||||
canvas->drawRenderNode(mListItems[ci].get());
|
||||
}
|
||||
mListView->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(mListView.get());
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
|
||||
@@ -159,14 +159,6 @@ public:
|
||||
renderthread::RenderThread& renderThread, uint32_t width, uint32_t height,
|
||||
const SkMatrix& transform);
|
||||
|
||||
template <class CanvasType>
|
||||
static std::unique_ptr<DisplayList> createDisplayList(
|
||||
int width, int height, std::function<void(CanvasType& canvas)> canvasCallback) {
|
||||
CanvasType canvas(width, height);
|
||||
canvasCallback(canvas);
|
||||
return std::unique_ptr<DisplayList>(canvas.finishRecording());
|
||||
}
|
||||
|
||||
static sp<RenderNode> createNode(
|
||||
int left, int top, int right, int bottom,
|
||||
std::function<void(RenderProperties& props, Canvas& canvas)> setup) {
|
||||
@@ -177,7 +169,7 @@ public:
|
||||
std::unique_ptr<Canvas> canvas(
|
||||
Canvas::create_recording_canvas(props.getWidth(), props.getHeight()));
|
||||
setup(props, *canvas.get());
|
||||
node->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(node.get());
|
||||
}
|
||||
node->setPropertyFieldsDirty(0xFFFFFFFF);
|
||||
return node;
|
||||
@@ -203,7 +195,7 @@ public:
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(
|
||||
node.stagingProperties().getWidth(), node.stagingProperties().getHeight(), &node));
|
||||
contentCallback(*canvas.get());
|
||||
node.setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(&node);
|
||||
}
|
||||
|
||||
static sp<RenderNode> createSkiaNode(
|
||||
@@ -226,7 +218,7 @@ public:
|
||||
new skiapipeline::SkiaRecordingCanvas(nullptr, props.getWidth(),
|
||||
props.getHeight()));
|
||||
setup(props, *canvas.get());
|
||||
node->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(node.get());
|
||||
}
|
||||
node->setPropertyFieldsDirty(0xFFFFFFFF);
|
||||
TestUtils::syncHierarchyPropertiesAndDisplayList(node);
|
||||
|
||||
@@ -55,6 +55,6 @@ public:
|
||||
TestUtils::drawUtf8ToCanvas(canvas.get(), text, paint, 0, 100 * (i + 2));
|
||||
}
|
||||
|
||||
container->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(container.get());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -210,7 +210,7 @@ private:
|
||||
overlay->stagingProperties().getHeight(),
|
||||
overlay.get()));
|
||||
canvas->drawColor((curFrame % 150) << 24, SkBlendMode::kSrcOver);
|
||||
overlay->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(overlay.get());
|
||||
cardcanvas->drawRenderNode(overlay.get());
|
||||
} else {
|
||||
// re-recording image node's canvas, animating ColorFilter
|
||||
@@ -223,11 +223,11 @@ private:
|
||||
paint.setColorFilter(filter);
|
||||
sk_sp<Bitmap> bitmap = mCachedBitmaps[ci];
|
||||
canvas->drawBitmap(*bitmap, 0, 0, &paint);
|
||||
image->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(image.get());
|
||||
cardcanvas->drawRenderNode(image.get());
|
||||
}
|
||||
|
||||
card->setStagingDisplayList(cardcanvas->finishRecording());
|
||||
cardcanvas->finishRecording(card.get());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -24,27 +24,28 @@
|
||||
|
||||
using namespace android;
|
||||
using namespace android::uirenderer;
|
||||
using namespace android::uirenderer::skiapipeline;
|
||||
|
||||
void BM_DisplayList_alloc(benchmark::State& benchState) {
|
||||
void BM_SkiaDisplayList_alloc(benchmark::State& benchState) {
|
||||
while (benchState.KeepRunning()) {
|
||||
auto displayList = new skiapipeline::SkiaDisplayList();
|
||||
benchmark::DoNotOptimize(displayList);
|
||||
delete displayList;
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayList_alloc);
|
||||
BENCHMARK(BM_SkiaDisplayList_alloc);
|
||||
|
||||
void BM_DisplayList_alloc_theoretical(benchmark::State& benchState) {
|
||||
void BM_SkiaDisplayList_alloc_theoretical(benchmark::State& benchState) {
|
||||
while (benchState.KeepRunning()) {
|
||||
auto displayList = new char[sizeof(skiapipeline::SkiaDisplayList)];
|
||||
benchmark::DoNotOptimize(displayList);
|
||||
delete[] displayList;
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayList_alloc_theoretical);
|
||||
BENCHMARK(BM_SkiaDisplayList_alloc_theoretical);
|
||||
|
||||
void BM_DisplayListCanvas_record_empty(benchmark::State& benchState) {
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
void BM_SkiaDisplayListCanvas_record_empty(benchmark::State& benchState) {
|
||||
auto canvas = std::make_unique<SkiaRecordingCanvas>(nullptr, 100, 100);
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
while (benchState.KeepRunning()) {
|
||||
@@ -53,10 +54,10 @@ void BM_DisplayListCanvas_record_empty(benchmark::State& benchState) {
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayListCanvas_record_empty);
|
||||
BENCHMARK(BM_SkiaDisplayListCanvas_record_empty);
|
||||
|
||||
void BM_DisplayListCanvas_record_saverestore(benchmark::State& benchState) {
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
void BM_SkiaDisplayListCanvas_record_saverestore(benchmark::State& benchState) {
|
||||
auto canvas = std::make_unique<SkiaRecordingCanvas>(nullptr, 100, 100);
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
while (benchState.KeepRunning()) {
|
||||
@@ -69,10 +70,10 @@ void BM_DisplayListCanvas_record_saverestore(benchmark::State& benchState) {
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayListCanvas_record_saverestore);
|
||||
BENCHMARK(BM_SkiaDisplayListCanvas_record_saverestore);
|
||||
|
||||
void BM_DisplayListCanvas_record_translate(benchmark::State& benchState) {
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
void BM_SkiaDisplayListCanvas_record_translate(benchmark::State& benchState) {
|
||||
auto canvas = std::make_unique<SkiaRecordingCanvas>(nullptr, 100, 100);
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
while (benchState.KeepRunning()) {
|
||||
@@ -82,7 +83,7 @@ void BM_DisplayListCanvas_record_translate(benchmark::State& benchState) {
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayListCanvas_record_translate);
|
||||
BENCHMARK(BM_SkiaDisplayListCanvas_record_translate);
|
||||
|
||||
/**
|
||||
* Simulate a simple view drawing a background, overlapped by an image.
|
||||
@@ -90,8 +91,8 @@ BENCHMARK(BM_DisplayListCanvas_record_translate);
|
||||
* Note that the recording commands are intentionally not perfectly efficient, as the
|
||||
* View system frequently produces unneeded save/restores.
|
||||
*/
|
||||
void BM_DisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState) {
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
void BM_SkiaDisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState) {
|
||||
auto canvas = std::make_unique<SkiaRecordingCanvas>(nullptr, 100, 100);
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
Paint rectPaint;
|
||||
@@ -114,14 +115,14 @@ void BM_DisplayListCanvas_record_simpleBitmapView(benchmark::State& benchState)
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayListCanvas_record_simpleBitmapView);
|
||||
BENCHMARK(BM_SkiaDisplayListCanvas_record_simpleBitmapView);
|
||||
|
||||
void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
|
||||
void BM_SkiaDisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
|
||||
sp<RenderNode> child = TestUtils::createNode(50, 50, 100, 100, [](auto& props, auto& canvas) {
|
||||
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
|
||||
});
|
||||
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
auto canvas = std::make_unique<SkiaRecordingCanvas>(nullptr, 100, 100);
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
while (benchState.KeepRunning()) {
|
||||
@@ -146,4 +147,4 @@ void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_DisplayListCanvas_basicViewGroupDraw)->Arg(1)->Arg(5)->Arg(10);
|
||||
BENCHMARK(BM_SkiaDisplayListCanvas_basicViewGroupDraw)->Arg(1)->Arg(5)->Arg(10);
|
||||
|
||||
@@ -35,25 +35,12 @@ BENCHMARK(BM_RenderNode_create);
|
||||
void BM_RenderNode_recordSimple(benchmark::State& state) {
|
||||
sp<RenderNode> node = new RenderNode();
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
canvas->finishRecording(node.get());
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
canvas->resetRecording(100, 100, node.get());
|
||||
canvas->drawColor(0x00000000, SkBlendMode::kSrcOver);
|
||||
node->setStagingDisplayList(canvas->finishRecording());
|
||||
canvas->finishRecording(node.get());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_RenderNode_recordSimple);
|
||||
|
||||
void BM_RenderNode_recordSimpleWithReuse(benchmark::State& state) {
|
||||
sp<RenderNode> node = new RenderNode();
|
||||
std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100));
|
||||
static_cast<void>(canvas->finishRecording());
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
canvas->resetRecording(100, 100, node.get());
|
||||
canvas->drawColor(0x00000000, SkBlendMode::kSrcOver);
|
||||
canvas->finishRecording().clear(node.get());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_RenderNode_recordSimpleWithReuse);
|
||||
@@ -38,13 +38,12 @@ TEST(SkiaDisplayList, create) {
|
||||
}
|
||||
|
||||
TEST(SkiaDisplayList, reset) {
|
||||
DisplayList displayList;
|
||||
std::unique_ptr<SkiaDisplayList> skiaDL;
|
||||
{
|
||||
SkiaRecordingCanvas canvas{nullptr, 1, 1};
|
||||
canvas.drawColor(0, SkBlendMode::kSrc);
|
||||
displayList = canvas.finishRecording();
|
||||
skiaDL = canvas.finishRecording();
|
||||
}
|
||||
SkiaDisplayList* skiaDL = displayList.asSkiaDl();
|
||||
|
||||
SkCanvas dummyCanvas;
|
||||
RenderNodeDrawable drawable(nullptr, &dummyCanvas);
|
||||
|
||||
Reference in New Issue
Block a user