| Index: src/gpu/instanced/InstanceProcessor.cpp
|
| diff --git a/src/gpu/instanced/InstanceProcessor.cpp b/src/gpu/instanced/InstanceProcessor.cpp
|
| index b6a3bb9a0fac1eddd0ac9f5b37fd99e5593dfe88..50bc219087dfb26d8a8a39895c56152e02641787 100644
|
| --- a/src/gpu/instanced/InstanceProcessor.cpp
|
| +++ b/src/gpu/instanced/InstanceProcessor.cpp
|
| @@ -18,29 +18,26 @@
|
|
|
| namespace gr_instanced {
|
|
|
| -bool InstanceProcessor::IsSupported(const GrGLSLCaps& glslCaps, const GrCaps& caps,
|
| - AntialiasMode* lastSupportedAAMode) {
|
| +GrCaps::InstancedSupport InstanceProcessor::CheckSupport(const GrGLSLCaps& glslCaps,
|
| + const GrCaps& caps) {
|
| if (!glslCaps.canUseAnyFunctionInShader() ||
|
| !glslCaps.flatInterpolationSupport() ||
|
| !glslCaps.integerSupport() ||
|
| 0 == glslCaps.maxVertexSamplers() ||
|
| !caps.shaderCaps()->texelBufferSupport() ||
|
| caps.maxVertexAttributes() < kNumAttribs) {
|
| - return false;
|
| - }
|
| - if (caps.sampleLocationsSupport() &&
|
| - glslCaps.sampleVariablesSupport() &&
|
| - glslCaps.shaderDerivativeSupport()) {
|
| - if (0 != caps.maxRasterSamples() &&
|
| - glslCaps.sampleMaskOverrideCoverageSupport()) {
|
| - *lastSupportedAAMode = AntialiasMode::kMixedSamples;
|
| - } else {
|
| - *lastSupportedAAMode = AntialiasMode::kMSAA;
|
| - }
|
| - } else {
|
| - *lastSupportedAAMode = AntialiasMode::kCoverage;
|
| + return GrCaps::InstancedSupport::kNone;
|
| + }
|
| + if (!caps.sampleLocationsSupport() ||
|
| + !glslCaps.sampleVariablesSupport() ||
|
| + !glslCaps.shaderDerivativeSupport()) {
|
| + return GrCaps::InstancedSupport::kBasic;
|
| }
|
| - return true;
|
| + if (0 == caps.maxRasterSamples() ||
|
| + !glslCaps.sampleMaskOverrideCoverageSupport()) {
|
| + return GrCaps::InstancedSupport::kMultisampled;
|
| + }
|
| + return GrCaps::InstancedSupport::kMixedSampled;
|
| }
|
|
|
| InstanceProcessor::InstanceProcessor(BatchInfo batchInfo, GrBuffer* paramsBuffer)
|
| @@ -767,8 +764,8 @@ void GLSLInstanceProcessor::BackendCoverage::onInit(GrGLSLVaryingHandler* varyin
|
| varyingHandler->addVarying("ellipseCoords", &fEllipseCoords, kMedium_GrSLPrecision);
|
| varyingHandler->addFlatVarying("ellipseName", &fEllipseName, kHigh_GrSLPrecision);
|
| } else {
|
| - varyingHandler->addVarying("circleCoords", &fEllipseCoords, kMedium_GrSLPrecision);
|
| - varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kMedium_GrSLPrecision);
|
| + varyingHandler->addVarying("circleCoords", &fEllipseCoords, kHigh_GrSLPrecision);
|
| + varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kHigh_GrSLPrecision);
|
| }
|
| }
|
| }
|
| @@ -1016,7 +1013,7 @@ void GLSLInstanceProcessor::BackendCoverage::emitCircle(GrGLSLPPFragmentBuilder*
|
| const char* outCoverage) {
|
| // TODO: circleCoords = max(circleCoords, 0) if we decide to do this optimization on rrects.
|
| SkASSERT(!(kRRect_ShapesMask & fBatchInfo.fShapeTypes));
|
| - f->appendPrecisionModifier(kLow_GrSLPrecision);
|
| + f->appendPrecisionModifier(kMedium_GrSLPrecision);
|
| f->codeAppendf("float distanceToEdge = %s - length(%s);",
|
| fBloatedRadius.fsIn(), fEllipseCoords.fsIn());
|
| f->codeAppendf("%s = clamp(distanceToEdge, 0.0, 1.0);", outCoverage);
|
| @@ -1407,9 +1404,8 @@ void GLSLInstanceProcessor::BackendMultisample::onEmitCode(GrGLSLVertexBuilder*,
|
| }
|
| } else {
|
| const char* arcTest = fArcTest.fsIn();
|
| - SkASSERT(arcTest);
|
| - if (fBatchInfo.fHasPerspective) {
|
| - // The non-perspective version accounts for fwith() in the vertex shader.
|
| + if (arcTest && fBatchInfo.fHasPerspective) {
|
| + // The non-perspective version accounts for fwidth() in the vertex shader.
|
| // We make sure to take the derivative here, before a neighbor pixel may early accept.
|
| f->enableFeature(GrGLSLPPFragmentBuilder::kStandardDerivatives_GLSLFeature);
|
| f->appendPrecisionModifier(kHigh_GrSLPrecision);
|
|
|