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 
14 struct 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 
22 typedef uint64_t GrBatchToken;
23 
24 class GrBatchUploader : public SkRefCnt {
25 public:
26     class TextureUploader;
27 
GrBatchUploader(GrBatchToken lastUploadToken)28     GrBatchUploader(GrBatchToken lastUploadToken) : fLastUploadToken(lastUploadToken) {}
lastUploadToken()29     GrBatchToken lastUploadToken() const { return fLastUploadToken; }
30     virtual void upload(TextureUploader*)=0;
31 
32 private:
33     GrBatchToken fLastUploadToken;
34 };
35 
36 /**
37  * Base class for GrBatches that draw. These batches have a GrPipeline installed by GrDrawTarget.
38  */
39 class GrDrawBatch : public GrBatch {
40 public:
41     class Target;
42 
43     GrDrawBatch(uint32_t classID);
44     ~GrDrawBatch() override;
45 
46     /**
47      * Fills in a structure informing the XP of overrides to its normal behavior.
48      */
49     void getPipelineOptimizations(GrPipelineOptimizations* override) const;
50 
pipeline()51     const GrPipeline* pipeline() const {
52         SkASSERT(fPipelineInstalled);
53         return reinterpret_cast<const GrPipeline*>(fPipelineStorage.get());
54     }
55 
56     bool installPipeline(const GrPipeline::CreateArgs&);
57 
58     // TODO no GrPrimitiveProcessors yet read fragment position
willReadFragmentPosition()59     bool willReadFragmentPosition() const { return false; }
60 
renderTargetUniqueID()61     uint32_t renderTargetUniqueID() const final {
62         SkASSERT(fPipelineInstalled);
63         return this->pipeline()->getRenderTarget()->getUniqueID();
64     }
65 
renderTarget()66     GrRenderTarget* renderTarget() const final {
67         SkASSERT(fPipelineInstalled);
68         return this->pipeline()->getRenderTarget();
69     }
70 
dumpInfo()71     SkString dumpInfo() const override {
72         SkString string;
73         string.appendf("RT: %d\n", this->renderTargetUniqueID());
74         string.append("ColorStages:\n");
75         for (int i = 0; i < this->pipeline()->numColorFragmentProcessors(); i++) {
76             string.appendf("\t\t%s\n\t\t%s\n",
77                            this->pipeline()->getColorFragmentProcessor(i).name(),
78                            this->pipeline()->getColorFragmentProcessor(i).dumpInfo().c_str());
79         }
80         string.append("CoverageStages:\n");
81         for (int i = 0; i < this->pipeline()->numCoverageFragmentProcessors(); i++) {
82             string.appendf("\t\t%s\n\t\t%s\n",
83                            this->pipeline()->getCoverageFragmentProcessor(i).name(),
84                            this->pipeline()->getCoverageFragmentProcessor(i).dumpInfo().c_str());
85         }
86         string.appendf("XP: %s\n", this->pipeline()->getXferProcessor().name());
87         return string;
88     }
89 
90 protected:
91     virtual void computePipelineOptimizations(GrInitInvariantOutput* color,
92                                               GrInitInvariantOutput* coverage,
93                                               GrBatchToXPOverrides* overrides) const = 0;
94 
95 private:
96     /**
97      * initBatchTracker is a hook for the some additional overrides / optimization possibilities
98      * from the GrXferProcessor.
99      */
100     virtual void initBatchTracker(const GrXPOverridesForBatch&) = 0;
101 
102 protected:
103     SkTArray<SkAutoTUnref<GrBatchUploader>, true>   fInlineUploads;
104 
105 private:
106     SkAlignedSTStorage<1, GrPipeline>               fPipelineStorage;
107     bool                                            fPipelineInstalled;
108     typedef GrBatch INHERITED;
109 };
110 
111 #endif
112