blob: d1083b30b6f44fe77d0badd16cc9dac7035cb003 [file] [log] [blame]
bsalomon16b99132015-08-13 14:55:50 -07001/*
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/**
bsalomon75398562015-08-17 12:55:38 -070017 * 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/**
bsalomon16b99132015-08-13 14:55:50 -070037 * Base class for GrBatches that draw. These batches have a GrPipeline installed by GrDrawTarget.
38 */
39class GrDrawBatch : public GrBatch {
40public:
bsalomon75398562015-08-17 12:55:38 -070041 class Target;
42
reed1b55a962015-09-17 20:16:13 -070043 GrDrawBatch(uint32_t classID);
bsalomon16b99132015-08-13 14:55:50 -070044 ~GrDrawBatch() override;
45
ethannicholasff210322015-11-24 12:10:10 -080046 /**
47 * Fills in a structure informing the XP of overrides to its normal behavior.
48 */
49 void getPipelineOptimizations(GrPipelineOptimizations* override) const;
bsalomon16b99132015-08-13 14:55:50 -070050
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
59 bool willReadFragmentPosition() const { return false; }
60
bsalomon53469832015-08-18 09:20:09 -070061 uint32_t renderTargetUniqueID() const final {
62 SkASSERT(fPipelineInstalled);
63 return this->pipeline()->getRenderTarget()->getUniqueID();
64 }
65
bsalomon6dea83f2015-12-03 12:58:06 -080066 GrRenderTarget* renderTarget() const final {
67 SkASSERT(fPipelineInstalled);
68 return this->pipeline()->getRenderTarget();
69 }
70
bsalomon53469832015-08-18 09:20:09 -070071 SkString dumpInfo() const override {
72 SkString string;
robertphillipse004bfc2015-11-16 09:06:59 -080073 string.appendf("RT: %d\n", this->renderTargetUniqueID());
bsalomon53469832015-08-18 09:20:09 -070074 string.append("ColorStages:\n");
bsalomonac856c92015-08-27 06:30:17 -070075 for (int i = 0; i < this->pipeline()->numColorFragmentProcessors(); i++) {
robertphillipse004bfc2015-11-16 09:06:59 -080076 string.appendf("\t\t%s\n\t\t%s\n",
77 this->pipeline()->getColorFragmentProcessor(i).name(),
78 this->pipeline()->getColorFragmentProcessor(i).dumpInfo().c_str());
bsalomon53469832015-08-18 09:20:09 -070079 }
80 string.append("CoverageStages:\n");
bsalomonac856c92015-08-27 06:30:17 -070081 for (int i = 0; i < this->pipeline()->numCoverageFragmentProcessors(); i++) {
robertphillipse004bfc2015-11-16 09:06:59 -080082 string.appendf("\t\t%s\n\t\t%s\n",
83 this->pipeline()->getCoverageFragmentProcessor(i).name(),
84 this->pipeline()->getCoverageFragmentProcessor(i).dumpInfo().c_str());
bsalomon53469832015-08-18 09:20:09 -070085 }
bsalomon2047b782015-12-21 13:12:54 -080086 string.appendf("XP: %s\n", this->pipeline()->getXferProcessor().name());
bsalomon53469832015-08-18 09:20:09 -070087 return string;
88 }
89
ethannicholasff210322015-11-24 12:10:10 -080090protected:
halcanary9d524f22016-03-29 09:03:52 -070091 virtual void computePipelineOptimizations(GrInitInvariantOutput* color,
ethannicholasff210322015-11-24 12:10:10 -080092 GrInitInvariantOutput* coverage,
93 GrBatchToXPOverrides* overrides) const = 0;
94
bsalomon16b99132015-08-13 14:55:50 -070095private:
96 /**
97 * initBatchTracker is a hook for the some additional overrides / optimization possibilities
98 * from the GrXferProcessor.
99 */
ethannicholasff210322015-11-24 12:10:10 -0800100 virtual void initBatchTracker(const GrXPOverridesForBatch&) = 0;
bsalomon16b99132015-08-13 14:55:50 -0700101
bsalomon75398562015-08-17 12:55:38 -0700102protected:
103 SkTArray<SkAutoTUnref<GrBatchUploader>, true> fInlineUploads;
104
105private:
106 SkAlignedSTStorage<1, GrPipeline> fPipelineStorage;
107 bool fPipelineInstalled;
bsalomon16b99132015-08-13 14:55:50 -0700108 typedef GrBatch INHERITED;
109};
110
111#endif