Index: src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp |
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp |
index 44db57e68d840067e7cd6da474b026bb60e84366..3fecff7b269be461e716acf28a619245cb308ce6 100644 |
--- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp |
+++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp |
@@ -170,6 +170,11 @@ const char* GrGLSLFragmentShaderBuilder::fragmentPosition() { |
} |
} |
+void GrGLSLFragmentShaderBuilder::appendSampleLocation(const char* sampleIdx) { |
+ SkASSERT(fProgramBuilder->pipeline().hasSampleLocations()); |
+ this->codeAppendf("sampleLocations[%s]", sampleIdx); |
+} |
+ |
void GrGLSLFragmentShaderBuilder::maskSampleCoverage(const char* mask, bool invert) { |
const GrGLSLCaps& glslCaps = *fProgramBuilder->glslCaps(); |
if (!glslCaps.sampleVariablesSupport()) { |
@@ -306,6 +311,22 @@ void GrGLSLFragmentShaderBuilder::onFinalize() { |
GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, |
*fProgramBuilder->glslCaps(), |
&this->precisionQualifier()); |
+ if (fProgramBuilder->pipeline().hasSampleLocations()) { |
+ const GrPipeline& pipeline = fProgramBuilder->pipeline(); |
+ int effectiveSampleCnt = pipeline.effectiveSampleCount(); |
+ const SkPoint* sampleLocations = pipeline.getSampleLocations(); |
+ this->definitions().append("const "); |
+ if (fProgramBuilder->glslCaps()->usesPrecisionModifiers()) { |
+ this->definitions().append("highp "); |
+ } |
+ this->definitions().appendf("vec2 sampleLocations[] = vec2[]("); |
+ for (int i = 0; i < effectiveSampleCnt; ++i) { |
+ this->definitions().appendf("vec2(%f, %f)%s", |
+ sampleLocations[i].x(), sampleLocations[i].y(), |
+ i + 1 != effectiveSampleCnt ? ", " : ");\n"); |
+ } |
+ SkASSERT(fProgramBuilder->header().fSamplePatternKey == pipeline.getSamplePatternID()); |
+ } |
} |
void GrGLSLFragmentShaderBuilder::onBeforeChildProcEmitCode() { |