| 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() {
|
|
|