skia2/tools/DDLTileHelper.h
Robert Phillips 06f69eb296 Fix bug in GM's DDL drawing mode
Due to how we were constructing the promise images we weren't hitting this before.

It is possible, when re-inflating the images of an SKP, that a draw occurs to create an image subset. When this occurs it is crucial that the generated opList be added to the appropriate drawing manager (so that it gets copied into the DDL).

This CL gets rid of the prior hack. It does have the (minor) downside that the SkDDLRecorders are now all created outside of their thread silos.

Change-Id: Ic6b23a8b68c0d4fe25dd8588c6e2ab65f9f238cf
Reviewed-on: https://skia-review.googlesource.com/157080
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
2018-09-26 17:57:36 +00:00

81 lines
2.7 KiB
C++

/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef DDLTileHelper_DEFINED
#define DDLTileHelper_DEFINED
#include "SkDeferredDisplayListRecorder.h"
#include "SkRect.h"
#include "SkRefCnt.h"
#include "SkSurfaceCharacterization.h"
class DDLPromiseImageHelper;
class SkCanvas;
class SkData;
class SkDeferredDisplayList;
class SkPicture;
class SkSurface;
class SkSurfaceCharacterization;
class DDLTileHelper {
public:
// TileData class encapsulates the information and behavior for a single tile/thread in
// a DDL rendering.
class TileData {
public:
TileData(sk_sp<SkSurface>, const SkIRect& clip);
// This method can be invoked in parallel
// In each thread we will reconvert the compressedPictureData into an SkPicture
// replacing each image-index with a promise image.
void createTileSpecificSKP(SkData* compressedPictureData,
const DDLPromiseImageHelper& helper);
// This method can be invoked in parallel
// Create the per-tile DDL from the per-tile SKP
void createDDL();
// This method operates serially and replays the recorded DDL into the tile surface.
void draw();
// This method also operates serially and composes the results of replaying the DDL into
// the final destination surface.
void compose(SkCanvas* dst);
void reset();
private:
sk_sp<SkSurface> fSurface;
SkSurfaceCharacterization fCharacterization;
SkIRect fClip; // in the device space of
// the destination canvas
sk_sp<SkPicture> fReconstitutedPicture;
std::unique_ptr<SkDeferredDisplayListRecorder> fDDLRecorder;
SkTArray<sk_sp<SkImage>> fPromiseImages; // All the promise images in
// the reconstituted picture
std::unique_ptr<SkDeferredDisplayList> fDisplayList;
};
DDLTileHelper(SkCanvas* canvas, const SkIRect& viewport, int numDivisions);
void createSKPPerTile(SkData* compressedPictureData, const DDLPromiseImageHelper& helper);
void createDDLsInParallel();
void drawAllTilesAndFlush(GrContext*, bool flush);
void composeAllTiles(SkCanvas* dstCanvas);
void resetAllTiles();
private:
int fNumDivisions; // number of tiles along a side
SkTArray<TileData> fTiles;
};
#endif