Index: src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
index 4dab6f2a09bd2582fc30576c8331f27c0569b062..b9816af71a2a014ea8eb1388443078993c8fa4a5 100644 |
--- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
+++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h |
@@ -67,6 +67,17 @@ public: |
GrGLSLFPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} |
/** |
+ * Subtracts sample coverage from the fragment. Any sample whose corresponding bit is not found |
+ * in the mask will not be written out to the framebuffer. |
+ * |
+ * @param mask int that contains the sample mask. Bit N corresponds to the Nth sample. |
+ * @param invert perform a bit-wise NOT on the provided mask before applying it? |
+ * |
+ * Requires GLSL support for sample variables. |
+ */ |
+ virtual void maskSampleCoverage(const char* mask, bool invert = false) = 0; |
+ |
+ /** |
* Fragment procs with child procs should call these functions before/after calling emitCode |
* on a child proc. |
*/ |
@@ -83,6 +94,20 @@ class GrGLSLPPFragmentBuilder : public GrGLSLFPFragmentBuilder { |
public: |
/** Appease the compiler; the derived class initializes GrGLSLFragmentBuilder. */ |
GrGLSLPPFragmentBuilder() : GrGLSLFragmentBuilder(nullptr) {} |
+ |
+ /** |
+ * Overrides the fragment's sample coverage. The provided mask determines which samples will now |
+ * be written out to the framebuffer. Note that this mask can be reduced by a future call to |
+ * maskSampleCoverage. |
+ * |
+ * If a primitive processor uses this method, it must guarantee that every codepath through the |
+ * shader overrides the sample mask at some point. |
+ * |
+ * @param mask int that contains the new coverage mask. Bit N corresponds to the Nth sample. |
+ * |
+ * Requires NV_sample_mask_override_coverage. |
+ */ |
+ virtual void overrideSampleCoverage(const char* mask) = 0; |
}; |
/* |
@@ -127,6 +152,8 @@ public: |
const char* fragmentPosition() override; |
// GrGLSLFPFragmentBuilder interface. |
+ void maskSampleCoverage(const char* mask, bool invert = false) override; |
+ void overrideSampleCoverage(const char* mask) override; |
const SkString& getMangleString() const override { return fMangleString; } |
void onBeforeChildProcEmitCode() override; |
void onAfterChildProcEmitCode() override; |
@@ -197,6 +224,7 @@ private: |
bool fHasCustomColorOutput; |
int fCustomColorOutputIndex; |
bool fHasSecondaryOutput; |
+ bool fHasInitializedSampleMask; |
// some state to verify shaders and effects are consistent, this is reset between effects by |
// the program creator |