GrDrawBatch.h revision 7539856c1b9cbb1886a6a498cc534b77fc83ddb2
1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrDrawBatch_DEFINED
9#define GrDrawBatch_DEFINED
10
11#include "GrBatch.h"
12#include "GrPipeline.h"
13
14struct GrInitInvariantOutput;
15
16/**
17 * GrDrawBatches are flushed in two phases (preDraw, and draw). In preDraw uploads to GrGpuResources
18 * and draws are determined and scheduled. They are issued in the draw phase. GrBatchToken is used
19 * to sequence the uploads relative to each other and to draws.
20 **/
21
22typedef uint64_t GrBatchToken;
23
24class GrBatchUploader : public SkRefCnt {
25public:
26    class TextureUploader;
27
28    GrBatchUploader(GrBatchToken lastUploadToken) : fLastUploadToken(lastUploadToken) {}
29    GrBatchToken lastUploadToken() const { return fLastUploadToken; }
30    virtual void upload(TextureUploader*)=0;
31
32private:
33    GrBatchToken fLastUploadToken;
34};
35
36/**
37 * Base class for GrBatches that draw. These batches have a GrPipeline installed by GrDrawTarget.
38 */
39class GrDrawBatch : public GrBatch {
40public:
41    class Target;
42
43    GrDrawBatch();
44    ~GrDrawBatch() override;
45
46    virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0;
47    virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0;
48
49    const GrPipeline* pipeline() const {
50        SkASSERT(fPipelineInstalled);
51        return reinterpret_cast<const GrPipeline*>(fPipelineStorage.get());
52    }
53
54    bool installPipeline(const GrPipeline::CreateArgs&);
55
56    // TODO no GrPrimitiveProcessors yet read fragment position
57    bool willReadFragmentPosition() const { return false; }
58
59private:
60    /**
61     * initBatchTracker is a hook for the some additional overrides / optimization possibilities
62     * from the GrXferProcessor.
63     */
64    virtual void initBatchTracker(const GrPipelineOptimizations&) = 0;
65
66protected:
67    SkTArray<SkAutoTUnref<GrBatchUploader>, true>   fInlineUploads;
68
69private:
70    SkAlignedSTStorage<1, GrPipeline>               fPipelineStorage;
71    bool                                            fPipelineInstalled;
72    typedef GrBatch INHERITED;
73};
74
75#endif
76