| Index: src/gpu/batches/GrDrawBatch.h
|
| diff --git a/src/gpu/batches/GrDrawBatch.h b/src/gpu/batches/GrDrawBatch.h
|
| index d1083b30b6f44fe77d0badd16cc9dac7035cb003..bf93cf5a72115f2a2df4734e361d3cfdeacfcee8 100644
|
| --- a/src/gpu/batches/GrDrawBatch.h
|
| +++ b/src/gpu/batches/GrDrawBatch.h
|
| @@ -8,6 +8,7 @@
|
| #ifndef GrDrawBatch_DEFINED
|
| #define GrDrawBatch_DEFINED
|
|
|
| +#include <functional>
|
| #include "GrBatch.h"
|
| #include "GrPipeline.h"
|
|
|
| @@ -19,18 +20,25 @@ struct GrInitInvariantOutput;
|
| * to sequence the uploads relative to each other and to draws.
|
| **/
|
|
|
| -typedef uint64_t GrBatchToken;
|
| -
|
| -class GrBatchUploader : public SkRefCnt {
|
| +class GrBatchDrawToken {
|
| public:
|
| - class TextureUploader;
|
| + static GrBatchDrawToken AlreadyFlushedToken() { return GrBatchDrawToken(0); }
|
|
|
| - GrBatchUploader(GrBatchToken lastUploadToken) : fLastUploadToken(lastUploadToken) {}
|
| - GrBatchToken lastUploadToken() const { return fLastUploadToken; }
|
| - virtual void upload(TextureUploader*)=0;
|
| + GrBatchDrawToken(const GrBatchDrawToken& that) : fSequenceNumber(that.fSequenceNumber) {}
|
| + GrBatchDrawToken& operator =(const GrBatchDrawToken& that) {
|
| + fSequenceNumber = that.fSequenceNumber;
|
| + return *this;
|
| + }
|
| + bool operator==(const GrBatchDrawToken& that) const {
|
| + return fSequenceNumber == that.fSequenceNumber;
|
| + }
|
| + bool operator!=(const GrBatchDrawToken& that) const { return !(*this == that); }
|
|
|
| private:
|
| - GrBatchToken fLastUploadToken;
|
| + GrBatchDrawToken();
|
| + explicit GrBatchDrawToken(uint64_t sequenceNumber) : fSequenceNumber(sequenceNumber) {}
|
| + friend class GrBatchFlushState;
|
| + uint64_t fSequenceNumber;
|
| };
|
|
|
| /**
|
| @@ -38,6 +46,14 @@ private:
|
| */
|
| class GrDrawBatch : public GrBatch {
|
| public:
|
| + /** Method that performs an upload on behalf of a DeferredUploadFn. */
|
| + using WritePixelsFn = std::function<bool(GrSurface* texture,
|
| + int left, int top, int width, int height,
|
| + GrPixelConfig config, const void* buffer,
|
| + size_t rowBytes)>;
|
| + /** See comments before GrDrawBatch::Target definition on how deferred uploaders work. */
|
| + using DeferredUploadFn = std::function<void(WritePixelsFn&)>;
|
| +
|
| class Target;
|
|
|
| GrDrawBatch(uint32_t classID);
|
| @@ -100,7 +116,14 @@ private:
|
| virtual void initBatchTracker(const GrXPOverridesForBatch&) = 0;
|
|
|
| protected:
|
| - SkTArray<SkAutoTUnref<GrBatchUploader>, true> fInlineUploads;
|
| + struct QueuedUpload {
|
| + QueuedUpload(DeferredUploadFn&& upload, GrBatchDrawToken token)
|
| + : fUpload(std::move(upload))
|
| + , fUploadBeforeToken(token) {}
|
| + DeferredUploadFn fUpload;
|
| + GrBatchDrawToken fUploadBeforeToken;
|
| + };
|
| + SkTArray<QueuedUpload> fInlineUploads;
|
|
|
| private:
|
| SkAlignedSTStorage<1, GrPipeline> fPipelineStorage;
|
|
|