Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Side by Side Diff: src/gpu/glsl/GrGLSLFragmentShaderBuilder.h

Issue 1717393002: Add "sample locations" feature to GrProcessor (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_getmultisamp
Patch Set: move into GrProcessor Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrGLSLFragmentShaderBuilder_DEFINED 8 #ifndef GrGLSLFragmentShaderBuilder_DEFINED
9 #define GrGLSLFragmentShaderBuilder_DEFINED 9 #define GrGLSLFragmentShaderBuilder_DEFINED
10 10
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 }; 60 };
61 61
62 /* 62 /*
63 * This class is used by fragment processors to build their fragment code. 63 * This class is used by fragment processors to build their fragment code.
64 */ 64 */
65 class GrGLSLFPFragmentBuilder : virtual public GrGLSLFragmentBuilder { 65 class GrGLSLFPFragmentBuilder : virtual public GrGLSLFragmentBuilder {
66 public: 66 public:
67 /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilde r. */ 67 /** Appease the compiler; the derived class initializes GrGLSLFragmentBuilde r. */
68 GrGLSLFPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} 68 GrGLSLFPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {}
69 69
70 enum Coordinates {
bsalomon 2016/03/01 14:28:55 Why do we need both of these?
Chris Dalton 2016/03/01 20:37:47 The short answer is that it makes life easier for
71 kSkiaDevice_Coordinates,
72 kGLSLWindow_Coordinates,
73
74 kLast_Coordinates = kGLSLWindow_Coordinates
75 };
76
77 /**
78 * Appends the offset from the center of the pixel to a specified sample.
79 *
80 * @param sampleIdx GLSL expression of the sample index.
81 * @param Coordinates Coordinate space in which to emit the offset.
82 *
83 * A processor must call setWillUseSampleLocations in its constructor before using this method.
84 */
85 virtual void appendOffsetToSample(const char* sampleIdx, Coordinates) = 0;
86
70 /** 87 /**
71 * Subtracts sample coverage from the fragment. Any sample whose correspondi ng bit is not found 88 * Subtracts sample coverage from the fragment. Any sample whose correspondi ng bit is not found
72 * in the mask will not be written out to the framebuffer. 89 * in the mask will not be written out to the framebuffer.
73 * 90 *
74 * @param mask int that contains the sample mask. Bit N corresponds to the Nth sample. 91 * @param mask int that contains the sample mask. Bit N corresponds to the Nth sample.
75 * @param invert perform a bit-wise NOT on the provided mask before apply ing it? 92 * @param invert perform a bit-wise NOT on the provided mask before apply ing it?
76 * 93 *
77 * Requires GLSL support for sample variables. 94 * Requires GLSL support for sample variables.
78 */ 95 */
79 virtual void maskSampleCoverage(const char* mask, bool invert = false) = 0; 96 virtual void maskSampleCoverage(const char* mask, bool invert = false) = 0;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 163
147 GrGLSLFragmentShaderBuilder(GrGLSLProgramBuilder* program, uint8_t fragPosKe y); 164 GrGLSLFragmentShaderBuilder(GrGLSLProgramBuilder* program, uint8_t fragPosKe y);
148 165
149 // Shared GrGLSLFragmentBuilder interface. 166 // Shared GrGLSLFragmentBuilder interface.
150 bool enableFeature(GLSLFeature) override; 167 bool enableFeature(GLSLFeature) override;
151 virtual SkString ensureFSCoords2D(const GrGLSLTransformedCoordsArray& coords , 168 virtual SkString ensureFSCoords2D(const GrGLSLTransformedCoordsArray& coords ,
152 int index) override; 169 int index) override;
153 const char* fragmentPosition() override; 170 const char* fragmentPosition() override;
154 171
155 // GrGLSLFPFragmentBuilder interface. 172 // GrGLSLFPFragmentBuilder interface.
173 void appendOffsetToSample(const char* sampleIdx, Coordinates) override;
156 void maskSampleCoverage(const char* mask, bool invert = false) override; 174 void maskSampleCoverage(const char* mask, bool invert = false) override;
157 void overrideSampleCoverage(const char* mask) override; 175 void overrideSampleCoverage(const char* mask) override;
158 const SkString& getMangleString() const override { return fMangleString; } 176 const SkString& getMangleString() const override { return fMangleString; }
159 void onBeforeChildProcEmitCode() override; 177 void onBeforeChildProcEmitCode() override;
160 void onAfterChildProcEmitCode() override; 178 void onAfterChildProcEmitCode() override;
161 179
162 // GrGLSLXPFragmentBuilder interface. 180 // GrGLSLXPFragmentBuilder interface.
163 bool hasCustomColorOutput() const override { return fHasCustomColorOutput; } 181 bool hasCustomColorOutput() const override { return fHasCustomColorOutput; }
164 bool hasSecondaryOutput() const override { return fHasSecondaryOutput; } 182 bool hasSecondaryOutput() const override { return fHasSecondaryOutput; }
165 const char* dstColor() override; 183 const char* dstColor() override;
166 void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) override; 184 void enableAdvancedBlendEquationIfNeeded(GrBlendEquation) override;
167 185
168 private: 186 private:
169 bool hasFragmentPosition() const;
170
171 // Private public interface, used by GrGLProgramBuilder to build a fragment shader 187 // Private public interface, used by GrGLProgramBuilder to build a fragment shader
172 void enableCustomOutput(); 188 void enableCustomOutput();
173 void enableSecondaryOutput(); 189 void enableSecondaryOutput();
174 const char* getPrimaryColorOutputName() const; 190 const char* getPrimaryColorOutputName() const;
175 const char* getSecondaryColorOutputName() const; 191 const char* getSecondaryColorOutputName() const;
192 void defineSampleOffsetArray(const char* name, const SkMatrix&);
176 193
177 #ifdef SK_DEBUG 194 #ifdef SK_DEBUG
178 // As GLSLProcessors emit code, there are some conditions we need to verify. We use the below 195 // As GLSLProcessors emit code, there are some conditions we need to verify. We use the below
179 // state to track this. The reset call is called per processor emitted. 196 // state to track this. The reset call is called per processor emitted.
180 GrProcessor::RequiredFeatures usedProcessorFeatures() const { return fUsedPr ocessorFeatures; } 197 GrProcessor::RequiredFeatures usedProcessorFeatures() const { return fUsedPr ocessorFeatures; }
181 bool hasReadDstColor() const { return fHasReadDstColor; } 198 bool hasReadDstColor() const { return fHasReadDstColor; }
182 void resetVerification() { 199 void resetVerification() {
183 fUsedProcessorFeatures = GrProcessor::kNone_RequiredFeatures; 200 fUsedProcessorFeatures = GrProcessor::kNone_RequiredFeatures;
184 fHasReadDstColor = false; 201 fHasReadDstColor = false;
185 } 202 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 /* 234 /*
218 * The mangle string is used to mangle the names of uniforms/functions emitt ed by the child 235 * The mangle string is used to mangle the names of uniforms/functions emitt ed by the child
219 * procs so no duplicate uniforms/functions appear in the generated shader p rogram. The mangle 236 * procs so no duplicate uniforms/functions appear in the generated shader p rogram. The mangle
220 * string is simply based on fSubstageIndices. For example, if fSubstageIndi ces = [3, 1, 2, 0], 237 * string is simply based on fSubstageIndices. For example, if fSubstageIndi ces = [3, 1, 2, 0],
221 * then the manglestring will be "_c3_c1_c2", and any uniform/function emitt ed by that proc will 238 * then the manglestring will be "_c3_c1_c2", and any uniform/function emitt ed by that proc will
222 * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's 239 * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's
223 * 1st child's 2nd child". 240 * 1st child's 2nd child".
224 */ 241 */
225 SkString fMangleString; 242 SkString fMangleString;
226 243
227 bool fSetupFragPosition; 244 bool fSetupFragPosition;
228 bool fTopLeftFragPosRead; 245 bool fTopLeftFragPosRead;
229 bool fHasCustomColorOutput; 246 bool fHasCustomColorOutput;
230 int fCustomColorOutputIndex; 247 int fCustomColorOutputIndex;
231 bool fHasSecondaryOutput; 248 bool fHasSecondaryOutput;
232 bool fHasInitializedSampleMask; 249 uint8_t fUsedSampleOffsetArrays;
250 bool fHasInitializedSampleMask;
233 251
234 #ifdef SK_DEBUG 252 #ifdef SK_DEBUG
235 // some state to verify shaders and effects are consistent, this is reset be tween effects by 253 // some state to verify shaders and effects are consistent, this is reset be tween effects by
236 // the program creator 254 // the program creator
237 GrProcessor::RequiredFeatures fUsedProcessorFeatures; 255 GrProcessor::RequiredFeatures fUsedProcessorFeatures;
238 bool fHasReadDstColor; 256 bool fHasReadDstColor;
239 #endif 257 #endif
240 258
241 friend class GrGLSLProgramBuilder; 259 friend class GrGLSLProgramBuilder;
242 friend class GrGLProgramBuilder; 260 friend class GrGLProgramBuilder;
243 }; 261 };
244 262
245 #endif 263 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698