blob: ab806ea914de00ed8d8f12f5bc3e74c28b618564 [file] [log] [blame]
joshualitt30ba4362014-08-21 20:18:45 -07001/*
2 * Copyright 2014 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
egdaniel2d721d32015-11-11 13:06:05 -08008#ifndef GrGLSLFragmentShaderBuilder_DEFINED
9#define GrGLSLFragmentShaderBuilder_DEFINED
joshualitt47bb3822014-10-07 16:43:25 -070010
Brian Salomon99938a82016-11-21 13:41:08 -050011#include "GrBlend.h"
egdaniel2d721d32015-11-11 13:06:05 -080012#include "GrGLSLShaderBuilder.h"
cdalton87332102016-02-26 12:22:02 -080013#include "GrProcessor.h"
egdaniel7dc4bd02015-10-29 07:57:01 -070014
egdaniel574a4c12015-11-02 06:22:44 -080015class GrRenderTarget;
egdaniel8dcdedc2015-11-11 06:27:20 -080016class GrGLSLVarying;
joshualitt74077b92014-10-24 11:26:03 -070017
joshualittb0a8a372014-09-23 09:50:21 -070018/*
cdalton85285412016-02-18 12:37:07 -080019 * This base class encapsulates the common functionality which all processors use to build fragment
20 * shaders.
joshualittb0a8a372014-09-23 09:50:21 -070021 */
egdaniel2d721d32015-11-11 13:06:05 -080022class GrGLSLFragmentBuilder : public GrGLSLShaderBuilder {
joshualittb0a8a372014-09-23 09:50:21 -070023public:
cdalton85285412016-02-18 12:37:07 -080024 GrGLSLFragmentBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {}
egdaniel2d721d32015-11-11 13:06:05 -080025 virtual ~GrGLSLFragmentBuilder() {}
cdalton85285412016-02-18 12:37:07 -080026
joshualittb0a8a372014-09-23 09:50:21 -070027 /**
28 * Use of these features may require a GLSL extension to be enabled. Shaders may not compile
29 * if code is added that uses one of these features without calling enableFeature()
30 */
31 enum GLSLFeature {
ethannicholasddb37d62016-10-20 09:54:00 -070032 kPixelLocalStorage_GLSLFeature = kLastGLSLPrivateFeature + 1,
cdalton4a98cdb2016-03-01 12:12:20 -080033 kMultisampleInterpolation_GLSLFeature
joshualittb0a8a372014-09-23 09:50:21 -070034 };
35
36 /**
37 * If the feature is supported then true is returned and any necessary #extension declarations
38 * are added to the shaders. If the feature is not supported then false will be returned.
39 */
40 virtual bool enableFeature(GLSLFeature) = 0;
41
42 /**
43 * This returns a variable name to access the 2D, perspective correct version of the coords in
bsalomon1a1aa932016-09-12 09:30:36 -070044 * the fragment shader. The passed in coordinates must either be of type kVec2f or kVec3f. If
45 * the coordinates are 3-dimensional, it a perspective divide into is emitted into the
46 * fragment shader (xy / z) to convert them to 2D.
joshualittb0a8a372014-09-23 09:50:21 -070047 */
bsalomon1a1aa932016-09-12 09:30:36 -070048 virtual SkString ensureCoords2D(const GrShaderVar&) = 0;
joshualittb0a8a372014-09-23 09:50:21 -070049
cdalton85285412016-02-18 12:37:07 -080050 // TODO: remove this method.
ethannicholas22793252016-01-30 09:59:10 -080051 void declAppendf(const char* fmt, ...);
52
joshualittb0a8a372014-09-23 09:50:21 -070053private:
egdaniel2d721d32015-11-11 13:06:05 -080054 typedef GrGLSLShaderBuilder INHERITED;
joshualittb0a8a372014-09-23 09:50:21 -070055};
56
57/*
cdalton85285412016-02-18 12:37:07 -080058 * This class is used by fragment processors to build their fragment code.
joshualittb0a8a372014-09-23 09:50:21 -070059 */
cdalton85285412016-02-18 12:37:07 -080060class GrGLSLFPFragmentBuilder : virtual public GrGLSLFragmentBuilder {
joshualittb0a8a372014-09-23 09:50:21 -070061public:
cdalton85285412016-02-18 12:37:07 -080062 /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */
63 GrGLSLFPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {}
joshualitt47bb3822014-10-07 16:43:25 -070064
cdalton28f45b92016-03-07 13:58:26 -080065 enum Coordinates {
66 kSkiaDevice_Coordinates,
67 kGLSLWindow_Coordinates,
68
69 kLast_Coordinates = kGLSLWindow_Coordinates
70 };
71
72 /**
73 * Appends the offset from the center of the pixel to a specified sample.
74 *
75 * @param sampleIdx GLSL expression of the sample index.
76 * @param Coordinates Coordinate space in which to emit the offset.
77 *
78 * A processor must call setWillUseSampleLocations in its constructor before using this method.
79 */
80 virtual void appendOffsetToSample(const char* sampleIdx, Coordinates) = 0;
81
cdalton85285412016-02-18 12:37:07 -080082 /**
cdalton33ad7012016-02-22 07:55:44 -080083 * Subtracts sample coverage from the fragment. Any sample whose corresponding bit is not found
84 * in the mask will not be written out to the framebuffer.
85 *
86 * @param mask int that contains the sample mask. Bit N corresponds to the Nth sample.
87 * @param invert perform a bit-wise NOT on the provided mask before applying it?
88 *
89 * Requires GLSL support for sample variables.
90 */
91 virtual void maskSampleCoverage(const char* mask, bool invert = false) = 0;
92
dvonbeck9b03e7b2016-08-01 11:01:56 -070093 /** Returns a variable name that represents a vector to the nearest edge of the shape, in source
94 space coordinates. */
95 virtual const char* distanceVectorName() const = 0;
96
cdalton33ad7012016-02-22 07:55:44 -080097 /**
cdalton85285412016-02-18 12:37:07 -080098 * Fragment procs with child procs should call these functions before/after calling emitCode
99 * on a child proc.
100 */
101 virtual void onBeforeChildProcEmitCode() = 0;
102 virtual void onAfterChildProcEmitCode() = 0;
103
104 virtual const SkString& getMangleString() const = 0;
105};
106
107/*
108 * This class is used by primitive processors to build their fragment code.
109 */
110class GrGLSLPPFragmentBuilder : public GrGLSLFPFragmentBuilder {
111public:
112 /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */
113 GrGLSLPPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {}
cdalton33ad7012016-02-22 07:55:44 -0800114
115 /**
116 * Overrides the fragment's sample coverage. The provided mask determines which samples will now
117 * be written out to the framebuffer. Note that this mask can be reduced by a future call to
118 * maskSampleCoverage.
119 *
120 * If a primitive processor uses this method, it must guarantee that every codepath through the
121 * shader overrides the sample mask at some point.
122 *
123 * @param mask int that contains the new coverage mask. Bit N corresponds to the Nth sample.
124 *
125 * Requires NV_sample_mask_override_coverage.
126 */
127 virtual void overrideSampleCoverage(const char* mask) = 0;
cdalton85285412016-02-18 12:37:07 -0800128};
129
130/*
131 * This class is used by Xfer processors to build their fragment code.
132 */
133class GrGLSLXPFragmentBuilder : virtual public GrGLSLFragmentBuilder {
134public:
135 /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */
136 GrGLSLXPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {}
137
138 virtual bool hasCustomColorOutput() const = 0;
139 virtual bool hasSecondaryOutput() const = 0;
140
141 /** Returns the variable name that holds the color of the destination pixel. This may be nullptr
142 * if no effect advertised that it will read the destination. */
joshualittb0a8a372014-09-23 09:50:21 -0700143 virtual const char* dstColor() = 0;
144
cdalton8917d622015-05-06 13:40:21 -0700145 /** Adds any necessary layout qualifiers in order to legalize the supplied blend equation with
146 this shader. It is only legal to call this method with an advanced blend equation, and only
147 if these equations are supported. */
148 virtual void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) = 0;
joshualittb0a8a372014-09-23 09:50:21 -0700149};
150
cdalton85285412016-02-18 12:37:07 -0800151/*
152 * This class implements the various fragment builder interfaces.
153 */
154class GrGLSLFragmentShaderBuilder : public GrGLSLPPFragmentBuilder, public GrGLSLXPFragmentBuilder {
joshualitt30ba4362014-08-21 20:18:45 -0700155public:
cdalton28f45b92016-03-07 13:58:26 -0800156 /** Returns a nonzero key for a surface's origin. This should only be called if a processor will
157 use the fragment position and/or sample locations. */
158 static uint8_t KeyForSurfaceOrigin(GrSurfaceOrigin);
joshualitt30ba4362014-08-21 20:18:45 -0700159
cdalton28f45b92016-03-07 13:58:26 -0800160 GrGLSLFragmentShaderBuilder(GrGLSLProgramBuilder* program);
joshualitt30ba4362014-08-21 20:18:45 -0700161
cdalton85285412016-02-18 12:37:07 -0800162 // Shared GrGLSLFragmentBuilder interface.
mtklein36352bf2015-03-25 18:17:31 -0700163 bool enableFeature(GLSLFeature) override;
bsalomon1a1aa932016-09-12 09:30:36 -0700164 virtual SkString ensureCoords2D(const GrShaderVar&) override;
dvonbeck9b03e7b2016-08-01 11:01:56 -0700165 const char* distanceVectorName() const override;
joshualittdb0d3ca2014-10-07 12:42:26 -0700166
cdalton85285412016-02-18 12:37:07 -0800167 // GrGLSLFPFragmentBuilder interface.
cdalton28f45b92016-03-07 13:58:26 -0800168 void appendOffsetToSample(const char* sampleIdx, Coordinates) override;
cdalton33ad7012016-02-22 07:55:44 -0800169 void maskSampleCoverage(const char* mask, bool invert = false) override;
170 void overrideSampleCoverage(const char* mask) override;
cdalton85285412016-02-18 12:37:07 -0800171 const SkString& getMangleString() const override { return fMangleString; }
172 void onBeforeChildProcEmitCode() override;
173 void onAfterChildProcEmitCode() override;
174
175 // GrGLSLXPFragmentBuilder interface.
176 bool hasCustomColorOutput() const override { return fHasCustomColorOutput; }
177 bool hasSecondaryOutput() const override { return fHasSecondaryOutput; }
178 const char* dstColor() override;
cdalton8917d622015-05-06 13:40:21 -0700179 void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) override;
180
joshualitt74077b92014-10-24 11:26:03 -0700181private:
joshualitt47bb3822014-10-07 16:43:25 -0700182 // Private public interface, used by GrGLProgramBuilder to build a fragment shader
joshualitt47bb3822014-10-07 16:43:25 -0700183 void enableCustomOutput();
184 void enableSecondaryOutput();
185 const char* getPrimaryColorOutputName() const;
186 const char* getSecondaryColorOutputName() const;
joshualitt47bb3822014-10-07 16:43:25 -0700187
cdalton87332102016-02-26 12:22:02 -0800188#ifdef SK_DEBUG
egdaniel57d3b032015-11-13 11:57:27 -0800189 // As GLSLProcessors emit code, there are some conditions we need to verify. We use the below
joshualitt47bb3822014-10-07 16:43:25 -0700190 // state to track this. The reset call is called per processor emitted.
cdalton87332102016-02-26 12:22:02 -0800191 GrProcessor::RequiredFeatures usedProcessorFeatures() const { return fUsedProcessorFeatures; }
joshualitt47bb3822014-10-07 16:43:25 -0700192 bool hasReadDstColor() const { return fHasReadDstColor; }
cdalton87332102016-02-26 12:22:02 -0800193 void resetVerification() {
194 fUsedProcessorFeatures = GrProcessor::kNone_RequiredFeatures;
joshualitt47bb3822014-10-07 16:43:25 -0700195 fHasReadDstColor = false;
joshualitt47bb3822014-10-07 16:43:25 -0700196 }
cdalton87332102016-02-26 12:22:02 -0800197#endif
joshualitt30ba4362014-08-21 20:18:45 -0700198
ethannicholas5961bc92016-10-12 06:39:56 -0700199 static const char* DeclaredColorOutputName() { return "sk_FragColor"; }
egdaniel8dcdedc2015-11-11 06:27:20 -0800200 static const char* DeclaredSecondaryColorOutputName() { return "fsSecondaryColorOut"; }
201
cdalton28f45b92016-03-07 13:58:26 -0800202 GrSurfaceOrigin getSurfaceOrigin() const;
joshualitt74077b92014-10-24 11:26:03 -0700203
egdaniel574a4c12015-11-02 06:22:44 -0800204 void onFinalize() override;
cdalton28f45b92016-03-07 13:58:26 -0800205 void defineSampleOffsetArray(const char* name, const SkMatrix&);
joshualitt30ba4362014-08-21 20:18:45 -0700206
egdaniel138c2632016-08-17 10:59:00 -0700207 static const char* kDstColorName;
joshualitt47bb3822014-10-07 16:43:25 -0700208
cdalton85285412016-02-18 12:37:07 -0800209 /*
210 * State that tracks which child proc in the proc tree is currently emitting code. This is
211 * used to update the fMangleString, which is used to mangle the names of uniforms and functions
212 * emitted by the proc. fSubstageIndices is a stack: its count indicates how many levels deep
213 * we are in the tree, and its second-to-last value is the index of the child proc at that
214 * level which is currently emitting code. For example, if fSubstageIndices = [3, 1, 2, 0], that
215 * means we're currently emitting code for the base proc's 3rd child's 1st child's 2nd child.
216 */
217 SkTArray<int> fSubstageIndices;
218
219 /*
220 * The mangle string is used to mangle the names of uniforms/functions emitted by the child
221 * procs so no duplicate uniforms/functions appear in the generated shader program. The mangle
222 * string is simply based on fSubstageIndices. For example, if fSubstageIndices = [3, 1, 2, 0],
223 * then the manglestring will be "_c3_c1_c2", and any uniform/function emitted by that proc will
224 * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's
225 * 1st child's 2nd child".
226 */
227 SkString fMangleString;
228
cdalton28f45b92016-03-07 13:58:26 -0800229 bool fSetupFragPosition;
230 bool fHasCustomColorOutput;
231 int fCustomColorOutputIndex;
232 bool fHasSecondaryOutput;
233 uint8_t fUsedSampleOffsetArrays;
234 bool fHasInitializedSampleMask;
dvonbeck9b03e7b2016-08-01 11:01:56 -0700235 SkString fDistanceVectorOutput;
joshualitt30ba4362014-08-21 20:18:45 -0700236
cdalton87332102016-02-26 12:22:02 -0800237#ifdef SK_DEBUG
joshualitt47bb3822014-10-07 16:43:25 -0700238 // some state to verify shaders and effects are consistent, this is reset between effects by
239 // the program creator
cdalton87332102016-02-26 12:22:02 -0800240 GrProcessor::RequiredFeatures fUsedProcessorFeatures;
joshualitt47bb3822014-10-07 16:43:25 -0700241 bool fHasReadDstColor;
cdalton87332102016-02-26 12:22:02 -0800242#endif
joshualittfe1233c2014-10-07 12:16:35 -0700243
egdanielfa896322016-01-13 12:19:30 -0800244 friend class GrGLSLProgramBuilder;
joshualitt47bb3822014-10-07 16:43:25 -0700245 friend class GrGLProgramBuilder;
joshualitt30ba4362014-08-21 20:18:45 -0700246};
247
248#endif