aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
diff options
context:
space:
mode:
authorGravatar cdalton <cdalton@nvidia.com>2016-02-22 07:55:44 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-22 07:55:44 -0800
commit33ad701bc30387127c427fb1e38c781d5de33491 (patch)
tree09ab0b0a1c0ce1475f1c5a6c0ea6c35cb944e21f /src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
parent23e7af0e8ab8377b28e1399b4950def672284724 (diff)
Add gl_SampleMask functionality to fragment builders
Diffstat (limited to 'src/gpu/glsl/GrGLSLFragmentShaderBuilder.h')
-rw-r--r--src/gpu/glsl/GrGLSLFragmentShaderBuilder.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
index 4dab6f2a09..b9816af71a 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