Skip to content

Commit 0c08849

Browse files
rphilliSkia Commit-Bot
authored andcommitted
Update DDL testing harness to support drawing DDL w/ integer offsets
This isn't hooked up anywhere but breaks up the omnibus CL. Change-Id: I15c200e57450e7cc8ee95a3f7969926d0eb8487f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/333129 Commit-Queue: Robert Phillips <robertphillips@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
1 parent e96c19e commit 0c08849

File tree

9 files changed

+70
-29
lines changed

9 files changed

+70
-29
lines changed

dm/DMSrcSink.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,7 +1814,8 @@ Result GPUDDLSink::ddlDraw(const Src& src,
18141814
// one. About all it can be consistently used for is GrCaps access and 'defaultBackendFormat'
18151815
// calls.
18161816
constexpr int kNumDivisions = 3;
1817-
DDLTileHelper tiles(gpuThreadCtx, dstCharacterization, viewport, kNumDivisions);
1817+
DDLTileHelper tiles(gpuThreadCtx, dstCharacterization, viewport, kNumDivisions,
1818+
/* addRandomPaddingToDst */ false);
18181819

18191820
tiles.createBackendTextures(gpuTaskGroup, gpuThreadCtx);
18201821

@@ -2268,7 +2269,8 @@ Result ViaDDL::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
22682269
canvas->clear(SK_ColorTRANSPARENT);
22692270
}
22702271
// First, create all the tiles (including their individual dest surfaces)
2271-
DDLTileHelper tiles(direct, dstCharacterization, viewport, fNumDivisions);
2272+
DDLTileHelper tiles(direct, dstCharacterization, viewport, fNumDivisions,
2273+
/* addRandomPaddingToDst */ false);
22722274

22732275
tiles.createBackendTextures(nullptr, direct);
22742276

include/core/SkSurface.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,18 +1007,25 @@ class SK_API SkSurface : public SkRefCnt {
10071007
*/
10081008
bool characterize(SkSurfaceCharacterization* characterization) const;
10091009

1010-
/** Draws deferred display list created using SkDeferredDisplayListRecorder.
1011-
Has no effect and returns false if SkSurfaceCharacterization stored in
1012-
deferredDisplayList is not compatible with SkSurface.
1010+
/** Draws the deferred display list created via a SkDeferredDisplayListRecorder.
1011+
If the deferred display list is not compatible with this SkSurface, the draw is skipped
1012+
and false is return.
10131013
1014-
raster surface returns false.
1014+
The xOffset and yOffset parameters are experimental and, if not both zero, will cause
1015+
the draw to be ignored.
1016+
When implemented, if xOffset or yOffset are non-zero, the DDL will be drawn offset by that
1017+
amount into the surface.
10151018
10161019
@param deferredDisplayList drawing commands
1020+
@param xOffset x-offset at which to draw the DDL
1021+
@param yOffset y-offset at which to draw the DDL
10171022
@return false if deferredDisplayList is not compatible
10181023
10191024
example: https://fiddle.skia.org/c/@Surface_draw_2
10201025
*/
1021-
bool draw(sk_sp<const SkDeferredDisplayList> deferredDisplayList);
1026+
bool draw(sk_sp<const SkDeferredDisplayList> deferredDisplayList,
1027+
int xOffset = 0,
1028+
int yOffset = 0);
10221029

10231030
protected:
10241031
SkSurface(int width, int height, const SkSurfaceProps* surfaceProps);

src/image/SkSurface.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,12 @@ bool SkSurface::isCompatible(const SkSurfaceCharacterization& characterization)
338338
return asConstSB(this)->onIsCompatible(characterization);
339339
}
340340

341-
bool SkSurface::draw(sk_sp<const SkDeferredDisplayList> ddl) {
342-
return asSB(this)->onDraw(std::move(ddl));
341+
bool SkSurface::draw(sk_sp<const SkDeferredDisplayList> ddl, int xOffset, int yOffset) {
342+
if (xOffset != 0 || yOffset != 0) {
343+
return false; // the offsets currently aren't supported
344+
}
345+
346+
return asSB(this)->onDraw(std::move(ddl), xOffset, yOffset);
343347
}
344348

345349
//////////////////////////////////////////////////////////////////////////////////////

src/image/SkSurface_Base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ class SkSurface_Base : public SkSurface {
125125

126126
virtual bool onCharacterize(SkSurfaceCharacterization*) const { return false; }
127127
virtual bool onIsCompatible(const SkSurfaceCharacterization&) const { return false; }
128-
virtual bool onDraw(sk_sp<const SkDeferredDisplayList>) { return false; }
128+
virtual bool onDraw(sk_sp<const SkDeferredDisplayList>, int xOffset, int yOffset) {
129+
return false;
130+
}
129131

130132
inline SkCanvas* getCachedCanvas();
131133
inline sk_sp<SkImage> refCachedImage();

src/image/SkSurface_Gpu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ bool SkSurface_Gpu::onIsCompatible(const SkSurfaceCharacterization& characteriza
355355
characterization.surfaceProps() == rtc->surfaceProps();
356356
}
357357

358-
bool SkSurface_Gpu::onDraw(sk_sp<const SkDeferredDisplayList> ddl) {
358+
bool SkSurface_Gpu::onDraw(sk_sp<const SkDeferredDisplayList> ddl, int xOffset, int yOffset) {
359359
if (!ddl || !this->isCompatible(ddl->characterization())) {
360360
return false;
361361
}

src/image/SkSurface_Gpu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class SkSurface_Gpu : public SkSurface_Base {
5858
bool onCharacterize(SkSurfaceCharacterization*) const override;
5959
bool onIsCompatible(const SkSurfaceCharacterization&) const override;
6060
void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) override;
61-
bool onDraw(sk_sp<const SkDeferredDisplayList>) override;
61+
bool onDraw(sk_sp<const SkDeferredDisplayList>, int xOffset, int yOffset) override;
6262

6363
SkGpuDevice* getDevice() { return fDevice.get(); }
6464

tools/DDLTileHelper.cpp

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
void DDLTileHelper::TileData::init(int id,
2323
GrDirectContext* direct,
2424
const SkSurfaceCharacterization& dstSurfaceCharacterization,
25-
const SkIRect& clip) {
25+
const SkIRect& clip,
26+
const SkIRect& paddingOutsets) {
2627
fID = id;
2728
fClip = clip;
29+
fPaddingOutsets = paddingOutsets;
2830

29-
fCharacterization = dstSurfaceCharacterization.createResized(clip.width(), clip.height());
31+
fCharacterization = dstSurfaceCharacterization.createResized(this->paddedRectSize().width(),
32+
this->paddedRectSize().height());
3033
SkASSERT(fCharacterization.isValid());
3134

3235
GrBackendFormat backendFormat = direct->defaultBackendFormat(fCharacterization.colorType(),
@@ -78,6 +81,7 @@ void DDLTileHelper::TileData::createDDL() {
7881
}
7982
}
8083

84+
// We always record the DDL in the (0,0) .. (clipWidth, clipHeight) coordinates
8185
recordingCanvas->clipRect(SkRect::MakeWH(fClip.width(), fClip.height()));
8286
recordingCanvas->translate(-fClip.fLeft, -fClip.fTop);
8387

@@ -98,14 +102,15 @@ void DDLTileHelper::createComposeDDL() {
98102
for (int i = 0; i < this->numTiles(); ++i) {
99103
TileData* tile = &fTiles[i];
100104

101-
sk_sp<SkImage> promiseImage = tile->makePromiseImage(&recorder);
105+
sk_sp<SkImage> promiseImage = tile->makePromiseImageForDst(&recorder);
102106

103-
SkIRect clipRect = tile->clipRect();
107+
SkRect dstRect = SkRect::Make(tile->clipRect());
108+
SkIRect srcRect = tile->clipRect();
109+
srcRect.offsetTo(tile->padOffset().x(), tile->padOffset().y());
104110

105-
SkASSERT(clipRect.width() == promiseImage->width() &&
106-
clipRect.height() == promiseImage->height());
111+
SkASSERT(promiseImage->bounds().contains(srcRect));
107112

108-
recordingCanvas->drawImage(promiseImage, clipRect.fLeft, clipRect.fTop);
113+
recordingCanvas->drawImageRect(promiseImage.get(), srcRect, dstRect, nullptr);
109114
}
110115

111116
fComposeDDL = recorder.detach();
@@ -148,6 +153,7 @@ void DDLTileHelper::TileData::drawSKPDirectly(GrRecordingContext* context) {
148153
if (fTileSurface) {
149154
SkCanvas* tileCanvas = fTileSurface->getCanvas();
150155

156+
SkASSERT(this->padOffset().isZero() && this->paddedRectSize() == fClip.size());
151157
tileCanvas->clipRect(SkRect::MakeWH(fClip.width(), fClip.height()));
152158
tileCanvas->translate(-fClip.fLeft, -fClip.fTop);
153159

@@ -167,7 +173,7 @@ void DDLTileHelper::TileData::draw(GrDirectContext* direct) {
167173
// (maybe in GrDrawingManager::addDDLTarget).
168174
fTileSurface = this->makeWrappedTileDest(direct);
169175
if (fTileSurface) {
170-
fTileSurface->draw(fDisplayList);
176+
fTileSurface->draw(fDisplayList, this->padOffset().x(), this->padOffset().y());
171177

172178
// We can't snap an image here bc, since we're using wrapped backend textures for the
173179
// surfaces, that would incur a copy.
@@ -181,14 +187,15 @@ void DDLTileHelper::TileData::reset() {
181187
fTileSurface = nullptr;
182188
}
183189

184-
sk_sp<SkImage> DDLTileHelper::TileData::makePromiseImage(SkDeferredDisplayListRecorder* recorder) {
190+
sk_sp<SkImage> DDLTileHelper::TileData::makePromiseImageForDst(
191+
SkDeferredDisplayListRecorder* recorder) {
185192
SkASSERT(fCallbackContext);
186193

187194
// The promise image gets a ref on the promise callback context
188195
sk_sp<SkImage> promiseImage =
189196
recorder->makePromiseTexture(fCallbackContext->backendFormat(),
190-
fClip.width(),
191-
fClip.height(),
197+
this->paddedRectSize().width(),
198+
this->paddedRectSize().height(),
192199
GrMipmapped::kNo,
193200
GrSurfaceOrigin::kBottomLeft_GrSurfaceOrigin,
194201
fCharacterization.colorType(),
@@ -230,7 +237,8 @@ void DDLTileHelper::TileData::DeleteBackendTexture(GrDirectContext*, TileData* t
230237
DDLTileHelper::DDLTileHelper(GrDirectContext* direct,
231238
const SkSurfaceCharacterization& dstChar,
232239
const SkIRect& viewport,
233-
int numDivisions)
240+
int numDivisions,
241+
bool addRandomPaddingToDst)
234242
: fNumDivisions(numDivisions)
235243
, fTiles(numDivisions * numDivisions)
236244
, fDstCharacterization(dstChar) {
@@ -239,6 +247,8 @@ DDLTileHelper::DDLTileHelper(GrDirectContext* direct,
239247
int xTileSize = viewport.width()/fNumDivisions;
240248
int yTileSize = viewport.height()/fNumDivisions;
241249

250+
SkRandom rand;
251+
242252
// Create the destination tiles
243253
for (int y = 0, yOff = 0; y < fNumDivisions; ++y, yOff += yTileSize) {
244254
int ySize = (y < fNumDivisions-1) ? yTileSize : viewport.height()-yOff;
@@ -250,7 +260,14 @@ DDLTileHelper::DDLTileHelper(GrDirectContext* direct,
250260

251261
SkASSERT(viewport.contains(clip));
252262

253-
fTiles[y*fNumDivisions+x].init(y*fNumDivisions+x, direct, dstChar, clip);
263+
static const uint32_t kMaxPad = 64;
264+
int32_t lPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
265+
int32_t tPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
266+
int32_t rPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
267+
int32_t bPad = addRandomPaddingToDst ? rand.nextRangeU(0, kMaxPad) : 0;
268+
269+
fTiles[y*fNumDivisions+x].init(y*fNumDivisions+x, direct, dstChar, clip,
270+
{lPad, tPad, rPad, bPad});
254271
}
255272
}
256273
}

tools/DDLTileHelper.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class DDLTileHelper {
3535
void init(int id,
3636
GrDirectContext*,
3737
const SkSurfaceCharacterization& dstChar,
38-
const SkIRect& clip);
38+
const SkIRect& clip,
39+
const SkIRect& paddingOutsets);
3940

4041
// Convert the compressedPictureData into an SkPicture replacing each image-index
4142
// with a promise image.
@@ -62,10 +63,15 @@ class DDLTileHelper {
6263

6364
int id() const { return fID; }
6465
SkIRect clipRect() const { return fClip; }
66+
SkISize paddedRectSize() const {
67+
return { fClip.width() + fPaddingOutsets.fLeft + fPaddingOutsets.fRight,
68+
fClip.height() + fPaddingOutsets.fTop + fPaddingOutsets.fBottom };
69+
}
70+
SkIVector padOffset() const { return { fPaddingOutsets.fLeft, fPaddingOutsets.fTop }; }
6571

6672
SkDeferredDisplayList* ddl() { return fDisplayList.get(); }
6773

68-
sk_sp<SkImage> makePromiseImage(SkDeferredDisplayListRecorder*);
74+
sk_sp<SkImage> makePromiseImageForDst(SkDeferredDisplayListRecorder*);
6975
void dropCallbackContext() { fCallbackContext.reset(); }
7076

7177
static void CreateBackendTexture(GrDirectContext*, TileData*);
@@ -78,6 +84,7 @@ class DDLTileHelper {
7884

7985
int fID = -1;
8086
SkIRect fClip; // in the device space of the final SkSurface
87+
SkIRect fPaddingOutsets; // random padding for the output surface
8188
SkSurfaceCharacterization fCharacterization; // characterization for the tile's surface
8289

8390
// The callback context holds (via its SkPromiseImageTexture) the backend texture
@@ -99,7 +106,8 @@ class DDLTileHelper {
99106
DDLTileHelper(GrDirectContext*,
100107
const SkSurfaceCharacterization& dstChar,
101108
const SkIRect& viewport,
102-
int numDivisions);
109+
int numDivisions,
110+
bool addRandomPaddingToDst);
103111

104112
void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper&);
105113

tools/skpbench/skpbench.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ static void run_ddl_benchmark(sk_gpu_test::TestContext* testContext, GrDirectCon
269269

270270
promiseImageHelper.uploadAllToGPU(nullptr, context);
271271

272-
DDLTileHelper tiles(context, dstCharacterization, viewport, FLAGS_ddlTilingWidthHeight);
272+
DDLTileHelper tiles(context, dstCharacterization, viewport, FLAGS_ddlTilingWidthHeight,
273+
/* addRandomPaddingToDst */ false);
273274

274275
tiles.createBackendTextures(nullptr, context);
275276

0 commit comments

Comments
 (0)