summaryrefslogtreecommitdiff
path: root/chromium/third_party/skia/dm/DMSrcSink.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/dm/DMSrcSink.cpp')
-rw-r--r--chromium/third_party/skia/dm/DMSrcSink.cpp248
1 files changed, 175 insertions, 73 deletions
diff --git a/chromium/third_party/skia/dm/DMSrcSink.cpp b/chromium/third_party/skia/dm/DMSrcSink.cpp
index 5b2e161468c..8453871818a 100644
--- a/chromium/third_party/skia/dm/DMSrcSink.cpp
+++ b/chromium/third_party/skia/dm/DMSrcSink.cpp
@@ -68,6 +68,10 @@
#include "include/svg/SkSVGCanvas.h"
#include "src/xml/SkXMLWriter.h"
#endif
+
+#if defined(SK_ENABLE_ANDROID_UTILS)
+ #include "client_utils/android/BitmapRegionDecoder.h"
+#endif
#include "tests/TestUtils.h"
#include <cmath>
@@ -86,9 +90,18 @@ namespace DM {
GMSrc::GMSrc(skiagm::GMFactory factory) : fFactory(factory) {}
-Result GMSrc::draw(SkCanvas* canvas) const {
+Result GMSrc::draw(GrContext* context, SkCanvas* canvas) const {
std::unique_ptr<skiagm::GM> gm(fFactory());
SkString msg;
+
+ skiagm::DrawResult gpuSetupResult = gm->gpuSetup(context, &msg);
+ switch (gpuSetupResult) {
+ case skiagm::DrawResult::kOk : break;
+ case skiagm::DrawResult::kFail: return Result(Result::Status::Fatal, msg);
+ case skiagm::DrawResult::kSkip: return Result(Result::Status::Skip, msg);
+ default: SK_ABORT("");
+ }
+
skiagm::DrawResult drawResult = gm->draw(canvas, &msg);
switch (drawResult) {
case skiagm::DrawResult::kOk : return Result(Result::Status::Ok, msg);
@@ -120,6 +133,11 @@ std::unique_ptr<skiagm::verifiers::VerifierList> GMSrc::getVerifiers() const {
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+static SkString get_scaled_name(const Path& path, float scale) {
+ return SkStringPrintf("%s_%.3f", SkOSPath::Basename(path.c_str()).c_str(), scale);
+}
+
+#ifdef SK_ENABLE_ANDROID_UTILS
BRDSrc::BRDSrc(Path path, Mode mode, CodecSrc::DstColorType dstColorType, uint32_t sampleSize)
: fPath(path)
, fMode(mode)
@@ -133,12 +151,9 @@ bool BRDSrc::veto(SinkFlags flags) const {
|| flags.approach != SinkFlags::kDirect;
}
-static SkBitmapRegionDecoder* create_brd(Path path) {
+static std::unique_ptr<android::skia::BitmapRegionDecoder> create_brd(Path path) {
sk_sp<SkData> encoded(SkData::MakeFromFileName(path.c_str()));
- if (!encoded) {
- return nullptr;
- }
- return SkBitmapRegionDecoder::Create(encoded, SkBitmapRegionDecoder::kAndroidCodec_Strategy);
+ return android::skia::BitmapRegionDecoder::Make(encoded);
}
static inline void alpha8_to_gray8(SkBitmap* bitmap) {
@@ -151,7 +166,7 @@ static inline void alpha8_to_gray8(SkBitmap* bitmap) {
}
}
-Result BRDSrc::draw(SkCanvas* canvas) const {
+Result BRDSrc::draw(GrContext*, SkCanvas* canvas) const {
SkColorType colorType = canvas->imageInfo().colorType();
if (kRGB_565_SkColorType == colorType &&
CodecSrc::kGetFromCanvas_DstColorType != fDstColorType)
@@ -169,7 +184,7 @@ Result BRDSrc::draw(SkCanvas* canvas) const {
break;
}
- std::unique_ptr<SkBitmapRegionDecoder> brd(create_brd(fPath));
+ auto brd = create_brd(fPath);
if (nullptr == brd.get()) {
return Result::Skip("Could not create brd for %s.", fPath.c_str());
}
@@ -273,7 +288,7 @@ Result BRDSrc::draw(SkCanvas* canvas) const {
}
SkISize BRDSrc::size() const {
- std::unique_ptr<SkBitmapRegionDecoder> brd(create_brd(fPath));
+ auto brd = create_brd(fPath);
if (brd) {
return {std::max(1, brd->width() / (int)fSampleSize),
std::max(1, brd->height() / (int)fSampleSize)};
@@ -281,10 +296,6 @@ SkISize BRDSrc::size() const {
return {0, 0};
}
-static SkString get_scaled_name(const Path& path, float scale) {
- return SkStringPrintf("%s_%.3f", SkOSPath::Basename(path.c_str()).c_str(), scale);
-}
-
Name BRDSrc::name() const {
// We will replicate the names used by CodecSrc so that images can
// be compared in Gold.
@@ -294,6 +305,8 @@ Name BRDSrc::name() const {
return get_scaled_name(fPath, 1.0f / (float) fSampleSize);
}
+#endif // SK_ENABLE_ANDROID_UTILS
+
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
static bool serial_from_path_name(const SkString& path) {
@@ -394,7 +407,7 @@ static void set_bitmap_color_space(SkImageInfo* info) {
*info = info->makeColorSpace(SkColorSpace::MakeSRGB());
}
-Result CodecSrc::draw(SkCanvas* canvas) const {
+Result CodecSrc::draw(GrContext*, SkCanvas* canvas) const {
sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
if (!encoded) {
return Result::Fatal("Couldn't read %s.", fPath.c_str());
@@ -508,7 +521,7 @@ Result CodecSrc::draw(SkCanvas* canvas) const {
return Result::Skip(
"Cannot decode frame %i to 565 (%s).", i, fPath.c_str());
}
- // Fall through.
+ [[fallthrough]];
default:
return Result::Fatal(
"Couldn't getPixels for frame %i in %s.", i, fPath.c_str());
@@ -779,7 +792,7 @@ bool AndroidCodecSrc::veto(SinkFlags flags) const {
|| flags.approach != SinkFlags::kDirect;
}
-Result AndroidCodecSrc::draw(SkCanvas* canvas) const {
+Result AndroidCodecSrc::draw(GrContext*, SkCanvas* canvas) const {
sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
if (!encoded) {
return Result::Fatal("Couldn't read %s.", fPath.c_str());
@@ -871,7 +884,7 @@ bool ImageGenSrc::veto(SinkFlags flags) const {
return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDirect;
}
-Result ImageGenSrc::draw(SkCanvas* canvas) const {
+Result ImageGenSrc::draw(GrContext*, SkCanvas* canvas) const {
if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) {
return Result::Skip("Uninteresting to test image generator to 565.");
}
@@ -969,7 +982,7 @@ bool ColorCodecSrc::veto(SinkFlags flags) const {
return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDirect;
}
-Result ColorCodecSrc::draw(SkCanvas* canvas) const {
+Result ColorCodecSrc::draw(GrContext*, SkCanvas* canvas) const {
sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str()));
if (!encoded) {
return Result::Fatal("Couldn't read %s.", fPath.c_str());
@@ -1034,7 +1047,7 @@ static DEFINE_int(skpViewportSize, 1000,
SKPSrc::SKPSrc(Path path) : fPath(path) { }
-Result SKPSrc::draw(SkCanvas* canvas) const {
+Result SKPSrc::draw(GrContext*, SkCanvas* canvas) const {
std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(fPath.c_str());
if (!stream) {
return Result::Fatal("Couldn't read %s.", fPath.c_str());
@@ -1076,7 +1089,7 @@ Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
BisectSrc::BisectSrc(Path path, const char* trail) : INHERITED(path), fTrail(trail) {}
-Result BisectSrc::draw(SkCanvas* canvas) const {
+Result BisectSrc::draw(GrContext* context, SkCanvas* canvas) const {
struct FoundPath {
SkPath fPath;
SkPaint fPaint;
@@ -1099,7 +1112,7 @@ Result BisectSrc::draw(SkCanvas* canvas) const {
PathFindingCanvas pathFinder(canvas->getBaseLayerSize().width(),
canvas->getBaseLayerSize().height());
- Result result = this->INHERITED::draw(&pathFinder);
+ Result result = this->INHERITED::draw(context, &pathFinder);
if (!result.isOk()) {
return result;
}
@@ -1127,9 +1140,12 @@ Result BisectSrc::draw(SkCanvas* canvas) const {
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#if defined(SK_ENABLE_SKOTTIE)
+static DEFINE_bool(useLottieGlyphPaths, false,
+ "Prioritize embedded glyph paths over native fonts.");
+
SkottieSrc::SkottieSrc(Path path) : fPath(std::move(path)) {}
-Result SkottieSrc::draw(SkCanvas* canvas) const {
+Result SkottieSrc::draw(GrContext*, SkCanvas* canvas) const {
auto resource_provider =
skresources::DataURIResourceProviderProxy::Make(
skresources::FileResourceProvider::Make(SkOSPath::Dirname(fPath.c_str()),
@@ -1140,7 +1156,12 @@ Result SkottieSrc::draw(SkCanvas* canvas) const {
auto precomp_interceptor =
sk_make_sp<skottie_utils::ExternalAnimationPrecompInterceptor>(resource_provider,
kInterceptPrefix);
- auto animation = skottie::Animation::Builder()
+ uint32_t flags = 0;
+ if (FLAGS_useLottieGlyphPaths) {
+ flags |= skottie::Animation::Builder::kPreferEmbeddedFonts;
+ }
+
+ auto animation = skottie::Animation::Builder(flags)
.setResourceProvider(std::move(resource_provider))
.setPrecompInterceptor(std::move(precomp_interceptor))
.makeFromFile(fPath.c_str());
@@ -1230,7 +1251,7 @@ SVGSrc::SVGSrc(Path path)
}
}
-Result SVGSrc::draw(SkCanvas* canvas) const {
+Result SVGSrc::draw(GrContext*, SkCanvas* canvas) const {
if (!fDom) {
return Result::Fatal("Unable to parse file: %s", fName.c_str());
}
@@ -1281,8 +1302,10 @@ SkISize MSKPSrc::size(int i) const {
return i >= 0 && i < fPages.count() ? fPages[i].fSize.toCeil() : SkISize{0, 0};
}
-Result MSKPSrc::draw(SkCanvas* c) const { return this->draw(0, c); }
-Result MSKPSrc::draw(int i, SkCanvas* canvas) const {
+Result MSKPSrc::draw(GrContext* context, SkCanvas* c) const {
+ return this->draw(0, context, c);
+}
+Result MSKPSrc::draw(int i, GrContext*, SkCanvas* canvas) const {
if (this->pageCount() == 0) {
return Result::Fatal("Unable to parse MultiPictureDocument file: %s", fPath.c_str());
}
@@ -1310,7 +1333,7 @@ Name MSKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
Result NullSink::draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const {
- return src.draw(SkMakeNullCanvas().get());
+ return src.draw(nullptr, SkMakeNullCanvas().get());
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@@ -1419,12 +1442,6 @@ bool GPUSink::readBack(SkSurface* surface, SkBitmap* dst) const {
SkISize size = surface->imageInfo().dimensions();
SkImageInfo info = SkImageInfo::Make(size, fColorType, fAlphaType, fColorSpace);
- if (info.colorType() == kRGB_565_SkColorType || info.colorType() == kARGB_4444_SkColorType ||
- info.colorType() == kRGB_888x_SkColorType) {
- // We don't currently support readbacks into these formats on the GPU backend. Convert to
- // 32 bit.
- info = SkImageInfo::Make(size, kRGBA_8888_SkColorType, kPremul_SkAlphaType, fColorSpace);
- }
dst->allocPixels(info);
return canvas->readPixels(*dst, 0, 0);
}
@@ -1463,15 +1480,15 @@ Result GPUSink::onDraw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log,
factory.abandonContexts();
}
SkCanvas* canvas = surface->getCanvas();
- Result result = src.draw(canvas);
+ Result result = src.draw(context, canvas);
if (!result.isOk()) {
return result;
}
- surface->flush();
+ surface->flushAndSubmit();
if (FLAGS_gpuStats) {
- canvas->getGrContext()->priv().dumpCacheStats(log);
- canvas->getGrContext()->priv().dumpGpuStats(log);
- canvas->getGrContext()->priv().dumpContextStats(log);
+ context->priv().dumpCacheStats(log);
+ context->priv().dumpGpuStats(log);
+ context->priv().dumpContextStats(log);
}
this->readBack(surface.get(), dst);
@@ -1557,12 +1574,13 @@ Result GPUPersistentCacheTestingSink::draw(const Src& src, SkBitmap* dst, SkWStr
SkBitmap reference;
SkString refLog;
SkDynamicMemoryWStream refStream;
- memoryCache.resetNumCacheMisses();
+ memoryCache.resetCacheStats();
Result refResult = this->onDraw(src, &reference, &refStream, &refLog, contextOptions);
if (!refResult.isOk()) {
return refResult;
}
SkASSERT(!memoryCache.numCacheMisses());
+ SkASSERT(!memoryCache.numCacheStores());
return compare_bitmaps(reference, *dst);
}
@@ -1616,10 +1634,95 @@ Result GPUPrecompileTestingSink::draw(const Src& src, SkBitmap* dst, SkWStream*
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-GPUDDLSink::GPUDDLSink(const SkCommandLineConfigGpu* config, const GrContextOptions& grCtxOptions)
- : INHERITED(config, grCtxOptions)
- , fRecordingThreadPool(SkExecutor::MakeLIFOThreadPool(1)) // TODO: this should be at least 2
- , fGPUThread(SkExecutor::MakeFIFOThreadPool(1, false)) {
+GPUOOPRSink::GPUOOPRSink(const SkCommandLineConfigGpu* config, const GrContextOptions& ctxOptions)
+ : INHERITED(config, ctxOptions) {
+}
+
+Result GPUOOPRSink::ooprDraw(const Src& src,
+ sk_sp<SkSurface> dstSurface,
+ GrContext* context) const {
+ SkSurfaceCharacterization dstCharacterization;
+ SkAssertResult(dstSurface->characterize(&dstCharacterization));
+
+ SkDeferredDisplayListRecorder recorder(dstCharacterization);
+
+ Result result = src.draw(context, recorder.getCanvas());
+ if (!result.isOk()) {
+ return result;
+ }
+
+ std::unique_ptr<SkDeferredDisplayList> ddl = recorder.detach();
+
+ SkDeferredDisplayList::ProgramIterator iter(context, ddl.get());
+ for (; !iter.done(); iter.next()) {
+ iter.compile();
+ }
+
+ SkAssertResult(dstSurface->draw(ddl.get()));
+
+ // TODO: remove this flush once DDLs are reffed by the drawing manager
+ context->flushAndSubmit();
+
+ ddl.reset();
+
+ return Result::Ok();
+}
+
+Result GPUOOPRSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) const {
+ GrContextOptions contextOptions = this->baseContextOptions();
+ src.modifyGrContextOptions(&contextOptions);
+ contextOptions.fPersistentCache = nullptr;
+ contextOptions.fExecutor = nullptr;
+
+ GrContextFactory factory(contextOptions);
+
+ ContextInfo ctxInfo = factory.getContextInfo(this->contextType(), this->contextOverrides());
+ GrContext* context = ctxInfo.grContext();
+ if (!context) {
+ return Result::Fatal("Could not create context.");
+ }
+
+ SkASSERT(context->priv().getGpu());
+
+ GrBackendTexture backendTexture;
+ GrBackendRenderTarget backendRT;
+ sk_sp<SkSurface> surface = this->createDstSurface(context, src.size(),
+ &backendTexture, &backendRT);
+ if (!surface) {
+ return Result::Fatal("Could not create a surface.");
+ }
+
+ Result result = this->ooprDraw(src, surface, context);
+ if (!result.isOk()) {
+ return result;
+ }
+
+ if (FLAGS_gpuStats) {
+ context->priv().dumpCacheStats(log);
+ context->priv().dumpGpuStats(log);
+ context->priv().dumpContextStats(log);
+ }
+
+ if (!this->readBack(surface.get(), dst)) {
+ return Result::Fatal("Could not readback from surface.");
+ }
+
+ surface.reset();
+ if (backendTexture.isValid()) {
+ context->deleteBackendTexture(backendTexture);
+ }
+ if (backendRT.isValid()) {
+ context->priv().getGpu()->deleteTestingOnlyBackendRenderTarget(backendRT);
+ }
+
+ return Result::Ok();
+}
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+GPUDDLSink::GPUDDLSink(const SkCommandLineConfigGpu* config, const GrContextOptions& ctxOptions)
+ : INHERITED(config, ctxOptions)
+ , fRecordingExecutor(SkExecutor::MakeLIFOThreadPool(1))
+ , fGPUExecutor(SkExecutor::MakeFIFOThreadPool(1, false)) {
}
Result GPUDDLSink::ddlDraw(const Src& src,
@@ -1635,20 +1738,11 @@ Result GPUDDLSink::ddlDraw(const Src& src,
SkSurfaceCharacterization dstCharacterization;
SkAssertResult(dstSurface->characterize(&dstCharacterization));
- // 'gpuTestCtx/gpuThreadCtx' is being shifted to the gpuThread. Leave the main (this)
- // thread w/o a context.
- gpuTestCtx->makeNotCurrent();
-
- // Job one for the GPU thread is to make 'gpuTestCtx' current!
- gpuTaskGroup->add([gpuTestCtx] { gpuTestCtx->makeCurrent(); });
-
auto size = src.size();
SkPictureRecorder recorder;
- Result result = src.draw(recorder.beginRecording(SkIntToScalar(size.width()),
- SkIntToScalar(size.height())));
+ Result result = src.draw(gpuThreadCtx, recorder.beginRecording(SkIntToScalar(size.width()),
+ SkIntToScalar(size.height())));
if (!result.isOk()) {
- gpuTaskGroup->add([gpuTestCtx] { gpuTestCtx->makeNotCurrent(); });
- gpuTaskGroup->wait();
return result;
}
sk_sp<SkPicture> inputPicture(recorder.finishRecordingAsPicture());
@@ -1659,13 +1753,18 @@ Result GPUDDLSink::ddlDraw(const Src& src,
DDLPromiseImageHelper promiseImageHelper;
sk_sp<SkData> compressedPictureData = promiseImageHelper.deflateSKP(inputPicture.get());
if (!compressedPictureData) {
- gpuTaskGroup->add([gpuTestCtx] { gpuTestCtx->makeNotCurrent(); });
- gpuTaskGroup->wait();
return Result::Fatal("GPUDDLSink: Couldn't deflate SkPicture");
}
promiseImageHelper.createCallbackContexts(gpuThreadCtx);
+ // 'gpuTestCtx/gpuThreadCtx' is being shifted to the gpuThread. Leave the main (this)
+ // thread w/o a context.
+ gpuTestCtx->makeNotCurrent();
+
+ // Job one for the GPU thread is to make 'gpuTestCtx' current!
+ gpuTaskGroup->add([gpuTestCtx] { gpuTestCtx->makeCurrent(); });
+
// TODO: move the image upload to the utility thread
promiseImageHelper.uploadAllToGPU(gpuTaskGroup, gpuThreadCtx);
@@ -1697,7 +1796,8 @@ Result GPUDDLSink::ddlDraw(const Src& src,
dstSurface->draw(ddl);
});
- // This should be the only explicit flush for the entire DDL draw
+ // This should be the only explicit flush for the entire DDL draw.
+ // TODO: remove the flushes in do_gpu_stuff
gpuTaskGroup->add([gpuThreadCtx]() {
// We need to ensure all the GPU work is finished so
// the following 'deleteAllFromGPU' call will work
@@ -1708,6 +1808,7 @@ Result GPUDDLSink::ddlDraw(const Src& src,
GrFlushInfo flushInfoSyncCpu;
flushInfoSyncCpu.fFlags = kSyncCpu_GrFlushFlag;
gpuThreadCtx->flush(flushInfoSyncCpu);
+ gpuThreadCtx->submit(true);
});
// The backend textures are created on the gpuThread by the 'uploadAllToGPU' call.
@@ -1726,7 +1827,7 @@ Result GPUDDLSink::ddlDraw(const Src& src,
return Result::Ok();
}
-Result GPUDDLSink::draw(const Src& src, SkBitmap* dst, SkWStream* stream, SkString* log) const {
+Result GPUDDLSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) const {
GrContextOptions contextOptions = this->baseContextOptions();
src.modifyGrContextOptions(&contextOptions);
contextOptions.fPersistentCache = nullptr;
@@ -1758,8 +1859,8 @@ Result GPUDDLSink::draw(const Src& src, SkBitmap* dst, SkWStream* stream, SkStri
SkASSERT(otherCtx->priv().getGpu());
#endif
- SkTaskGroup recordingTaskGroup(*fRecordingThreadPool);
- SkTaskGroup gpuTaskGroup(*fGPUThread);
+ SkTaskGroup recordingTaskGroup(*fRecordingExecutor);
+ SkTaskGroup gpuTaskGroup(*fGPUExecutor);
// Make sure 'mainCtx' is current
mainTestCtx->makeCurrent();
@@ -1822,7 +1923,7 @@ static Result draw_skdocument(const Src& src, SkDocument* doc, SkWStream* dst) {
if (!canvas) {
return Result::Fatal("SkDocument::beginPage(w,h) returned nullptr");
}
- Result result = src.draw(i, canvas);
+ Result result = src.draw(i, nullptr, canvas);
if (!result.isOk()) {
return result;
}
@@ -1893,7 +1994,7 @@ SKPSink::SKPSink() {}
Result SKPSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
auto size = SkSize::Make(src.size());
SkPictureRecorder recorder;
- Result result = src.draw(recorder.beginRecording(size.width(), size.height()));
+ Result result = src.draw(nullptr, recorder.beginRecording(size.width(), size.height()));
if (!result.isOk()) {
return result;
}
@@ -1905,7 +2006,7 @@ Result SKPSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
Result DebugSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
DebugCanvas debugCanvas(src.size().width(), src.size().height());
- Result result = src.draw(&debugCanvas);
+ Result result = src.draw(nullptr, &debugCanvas);
if (!result.isOk()) {
return result;
}
@@ -1932,7 +2033,7 @@ Result SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
fPageIndex, pageCount);
}
}
- return src.draw(fPageIndex,
+ return src.draw(fPageIndex, nullptr,
SkSVGCanvas::Make(SkRect::MakeWH(SkIntToScalar(src.size().width()),
SkIntToScalar(src.size().height())),
dst)
@@ -1959,7 +2060,7 @@ Result RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) co
SkBitmap::kZeroPixels_AllocFlag);
SkCanvas canvas(*dst);
- return src.draw(&canvas);
+ return src.draw(nullptr, &canvas);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@@ -1974,7 +2075,7 @@ static Result draw_to_canvas(Sink* sink, SkBitmap* bitmap, SkWStream* stream, Sk
class ProxySrc : public Src {
public:
ProxySrc(SkISize size, const Fn& draw) : fSize(size), fDraw(draw) {}
- Result draw(SkCanvas* canvas) const override { return fDraw(canvas); }
+ Result draw(GrContext*, SkCanvas* canvas) const override { return fDraw(canvas); }
Name name() const override { return "ProxySrc"; }
SkISize size() const override { return fSize; }
private:
@@ -2023,7 +2124,7 @@ Result ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size().height());
return draw_to_canvas(fSink.get(), bitmap, stream, log, size, [&](SkCanvas* canvas) {
canvas->concat(matrix);
- return src.draw(canvas);
+ return src.draw(nullptr, canvas);
});
}
@@ -2068,8 +2169,8 @@ Result ViaSerialization::draw(
// Record our Src into a picture.
auto size = src.size();
SkPictureRecorder recorder;
- Result result = src.draw(recorder.beginRecording(SkIntToScalar(size.width()),
- SkIntToScalar(size.height())));
+ Result result = src.draw(nullptr, recorder.beginRecording(SkIntToScalar(size.width()),
+ SkIntToScalar(size.height())));
if (!result.isOk()) {
return result;
}
@@ -2097,8 +2198,8 @@ ViaDDL::ViaDDL(int numReplays, int numDivisions, Sink* sink)
Result ViaDDL::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const {
auto size = src.size();
SkPictureRecorder recorder;
- Result result = src.draw(recorder.beginRecording(SkIntToScalar(size.width()),
- SkIntToScalar(size.height())));
+ Result result = src.draw(nullptr, recorder.beginRecording(SkIntToScalar(size.width()),
+ SkIntToScalar(size.height())));
if (!result.isOk()) {
return result;
}
@@ -2178,6 +2279,7 @@ Result ViaDDL::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
GrFlushInfo flushInfoSyncCpu;
flushInfoSyncCpu.fFlags = kSyncCpu_GrFlushFlag;
context->flush(flushInfoSyncCpu);
+ context->submit(true);
}
return Result::Ok();
};
@@ -2191,8 +2293,8 @@ Result ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
Result result = draw_to_canvas(fSink.get(), bitmap, stream, log, size, [&](SkCanvas* canvas) {
SkPictureRecorder recorder;
sk_sp<SkPicture> pic;
- Result result = src.draw(recorder.beginRecording(SkIntToScalar(size.width()),
- SkIntToScalar(size.height())));
+ Result result = src.draw(nullptr, recorder.beginRecording(SkIntToScalar(size.width()),
+ SkIntToScalar(size.height())));
if (!result.isOk()) {
return result;
}