32 const SkIRect& paddingOutsets) {
35 fPaddingOutsets = paddingOutsets;
42 SkASSERT(caps->isFormatTexturable(fPlaybackChar.backendFormat(),
43 fPlaybackChar.backendFormat().textureType()));
54 auto recordingChar = fPlaybackChar.createResized(fClip.width(), fClip.height());
65 recordingCanvas->
translate(-fClip.fLeft, -fClip.fTop);
71 fDisplayList = recorder.
detach();
101 fComposeDDL = recorder.
detach();
106 if (!this->initialized()) {
119 SkASSERT(fCallbackContext && fCallbackContext->promiseImageTexture());
121 auto promiseImageTexture = fCallbackContext->promiseImageTexture();
122 if (!promiseImageTexture->backendTexture().isValid()) {
130 promiseImageTexture->backendTexture(),
131 fPlaybackChar.origin(),
132 fPlaybackChar.sampleCount(),
133 fPlaybackChar.colorType(),
134 fPlaybackChar.refColorSpace(),
135 &fPlaybackChar.surfaceProps());
142 fTileSurface = this->makeWrappedTileDest(dContext);
144 SkCanvas* tileCanvas = fTileSurface->getCanvas();
146 SkASSERT(this->padOffset().isZero() && this->paddedRectSize() == fClip.size());
148 tileCanvas->
translate(-fClip.fLeft, -fClip.fTop);
158 SkASSERT(fDisplayList && !fTileSurface);
160 fTileSurface = this->makeWrappedTileDest(direct);
171 fDisplayList =
nullptr;
173 fTileSurface =
nullptr;
183 fCallbackContext->backendFormat(),
184 this->paddedRectSize(),
187 fPlaybackChar.colorType(),
189 fPlaybackChar.refColorSpace(),
192 (
void*)this->refCallbackContext().release());
193 fCallbackContext->wasAddedToImage();
209 "DDLTile_TileData_CreateBackendTexture");
225 tile->fTileSurface =
nullptr;
228 tile->fCallbackContext.
reset();
236 int numXDivisions,
int numYDivisions,
237 bool addRandomPaddingToDst)
238 : fNumXDivisions(numXDivisions)
239 , fNumYDivisions(numYDivisions)
240 , fTiles(numXDivisions * numYDivisions)
241 , fDstCharacterization(dstChar) {
242 SkASSERT(fNumXDivisions > 0 && fNumYDivisions > 0);
244 int xTileSize = viewport.
width()/fNumXDivisions;
245 int yTileSize = viewport.
height()/fNumYDivisions;
250 for (
int y = 0, yOff = 0;
y < fNumYDivisions; ++
y, yOff += yTileSize) {
251 int ySize = (
y < fNumYDivisions-1) ? yTileSize : viewport.
height()-yOff;
253 for (
int x = 0, xOff = 0;
x < fNumXDivisions; ++
x, xOff += xTileSize) {
254 int xSize = (
x < fNumXDivisions-1) ? xTileSize : viewport.
width()-xOff;
260 static const uint32_t kMaxPad = 64;
261 int32_t lPad = addRandomPaddingToDst ? rand.
nextRangeU(0, kMaxPad) : 0;
262 int32_t tPad = addRandomPaddingToDst ? rand.
nextRangeU(0, kMaxPad) : 0;
263 int32_t rPad = addRandomPaddingToDst ? rand.
nextRangeU(0, kMaxPad) : 0;
264 int32_t bPad = addRandomPaddingToDst ? rand.
nextRangeU(0, kMaxPad) : 0;
266 fTiles[
y*fNumXDivisions+
x].init(
y*fNumXDivisions+
x, direct, dstChar,
clip,
267 {lPad, tPad, rPad, bPad});
307 SkASSERT(recordingTaskGroup && gpuTaskGroup && dContext);
320 recordingTaskGroup->
add([tile, gpuTaskGroup, dContext,
picture]() {
323 gpuTaskGroup->
add([dContext, tile]() {
336 fTiles[
i].draw(dContext);
343 fTiles[
i].drawSKPDirectly(dContext,
picture);
349 fTiles[
i].dropCallbackContext();
static void do_gpu_stuff(GrDirectContext *direct, DDLTileHelper::TileData *tile)
@ kBottomLeft_GrSurfaceOrigin
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
SkDEBUGCODE(SK_SPI) SkThreadID SkGetThreadID()
static void DeleteBackendTexture(GrDirectContext *, TileData *)
void createDDL(const SkPicture *)
void drawSKPDirectly(GrDirectContext *, const SkPicture *)
void init(int id, GrDirectContext *, const GrSurfaceCharacterization &dstChar, const SkIRect &clip, const SkIRect &paddingOutsets)
static void CreateBackendTexture(GrDirectContext *, TileData *)
sk_sp< SkImage > makePromiseImageForDst(sk_sp< GrContextThreadSafeProxy >)
void draw(GrDirectContext *)
SkISize paddedRectSize() const
void precompile(GrDirectContext *)
SkIVector padOffset() const
void createBackendTextures(SkTaskGroup *, GrDirectContext *)
void deleteBackendTextures(SkTaskGroup *, GrDirectContext *)
void drawAllTilesDirectly(GrDirectContext *, SkPicture *)
void dropCallbackContexts()
DDLTileHelper(GrDirectContext *, const GrSurfaceCharacterization &dstChar, const SkIRect &viewport, int numXDivisions, int numYDivisions, bool addRandomPaddingToDst)
void interleaveDDLCreationAndDraw(GrDirectContext *, SkPicture *)
void kickOffThreadedWork(SkTaskGroup *recordingTaskGroup, SkTaskGroup *gpuTaskGroup, GrDirectContext *, SkPicture *)
void createDDLsInParallel(SkPicture *)
const GrCaps * caps() const
sk_sp< GrContextThreadSafeProxy > threadSafeProxy()
sk_sp< GrDeferredDisplayList > detach()
bool abandoned() override
GrBackendTexture createBackendTexture(int width, int height, const GrBackendFormat &, skgpu::Mipmapped, GrRenderable, GrProtected=GrProtected::kNo, std::string_view label={})
GrDirectContextPriv priv()
GrBackendTexture backendTexture() const
GrSurfaceCharacterization createResized(int width, int height) const
SkColorType colorType() const
static sk_sp< GrPromiseImageTexture > PromiseImageFulfillProc(void *textureContext)
void setBackendTexture(const GrBackendTexture &backendTexture)
static void PromiseImageReleaseProc(void *textureContext)
const GrPromiseImageTexture * promiseImageTexture() const
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
void translate(SkScalar dx, SkScalar dy)
virtual GrRecordingContext * recordingContext() const
@ kStrict_SrcRectConstraint
sample only inside bounds; slower
void drawImageRect(const SkImage *, const SkRect &src, const SkRect &dst, const SkSamplingOptions &, const SkPaint *, SrcRectConstraint)
void drawPicture(const SkPicture *picture)
uint32_t nextRangeU(uint32_t min, uint32_t max)
void batch(int N, std::function< void(int)> fn)
void add(std::function< void(void)> fn)
void reset(T *ptr=nullptr)
SK_API sk_sp< SkImage > PromiseTextureFrom(skgpu::graphite::Recorder *, SkISize dimensions, const skgpu::graphite::TextureInfo &, const SkColorInfo &, skgpu::Origin origin, skgpu::graphite::Volatile, GraphitePromiseTextureFulfillProc, GraphitePromiseImageReleaseProc, GraphitePromiseTextureReleaseProc, GraphitePromiseImageContext, std::string_view label={})
sk_sp< const SkPicture > picture
SK_API sk_sp< SkSurface > WrapBackendTexture(GrRecordingContext *context, const GrBackendTexture &backendTexture, GrSurfaceOrigin origin, int sampleCnt, SkColorType colorType, sk_sp< SkColorSpace > colorSpace, const SkSurfaceProps *surfaceProps, TextureReleaseProc textureReleaseProc=nullptr, ReleaseContext releaseContext=nullptr)
SK_API bool DrawDDL(SkSurface *, sk_sp< const GrDeferredDisplayList > ddl)
constexpr int32_t y() const
constexpr int32_t x() const
void offsetTo(int32_t newX, int32_t newY)
constexpr int32_t height() const
constexpr int32_t width() const
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
bool contains(int32_t x, int32_t y) const
static SkRect Make(const SkISize &size)
static constexpr SkRect MakeWH(float w, float h)