void GrCCTriangleShader::onEmitVaryings(GrGLSLVaryingHandler* varyingHandler,
                                        GrGLSLVarying::Scope scope, SkString* code,
                                        const char* /*position*/, const char* inputCoverage,
                                        const char* wind) {
    fCoverageTimesWind.reset(kHalf_GrSLType, scope);
    if (!inputCoverage) {
        varyingHandler->addVarying("wind", &fCoverageTimesWind,
                                   GrGLSLVaryingHandler::Interpolation::kCanBeFlat);
        code->appendf("%s = %s;", OutName(fCoverageTimesWind), wind);
    } else {
        varyingHandler->addVarying("coverage_times_wind", &fCoverageTimesWind);
        code->appendf("%s = %s * %s;", OutName(fCoverageTimesWind), inputCoverage, wind);
    }
}
Ejemplo n.º 2
0
void GrCCCubicShader::onEmitVaryings(
        GrGLSLVaryingHandler* varyingHandler, GrGLSLVarying::Scope scope, SkString* code,
        const char* position, const char* coverage, const char* cornerCoverage, const char* wind) {
    code->appendf("float3 klm = float3(%s, 1) * %s;", position, fKLMMatrix.c_str());
    fKLM_fEdge.reset(kFloat4_GrSLType, scope);
    varyingHandler->addVarying("klm_and_edge", &fKLM_fEdge);
    // Give L&M both the same sign as wind, in order to pass this value to the fragment shader.
    // (Cubics are pre-chopped such that L&M do not change sign within any individual segment.)
    code->appendf("%s.xyz = klm * float3(1, %s, %s);", OutName(fKLM_fEdge), wind, wind);
    // Flat edge opposite the curve.
    code->appendf("%s.w = %s;", OutName(fKLM_fEdge), coverage);

    fGradMatrix.reset(kFloat4_GrSLType, scope);
    varyingHandler->addVarying("grad_matrix", &fGradMatrix);
    code->appendf("%s.xy = 2*bloat * 3 * klm[0] * %s[0].xy;",
                  OutName(fGradMatrix), fKLMMatrix.c_str());
    code->appendf("%s.zw = -2*bloat * (klm[1] * %s[2].xy + klm[2] * %s[1].xy);",
                    OutName(fGradMatrix), fKLMMatrix.c_str(), fKLMMatrix.c_str());

    if (cornerCoverage) {
        SkASSERT(coverage);
        code->appendf("half hull_coverage; {");
        this->calcHullCoverage(code, OutName(fKLM_fEdge), OutName(fGradMatrix), "hull_coverage");
        code->appendf("}");
        fCornerCoverage.reset(kHalf2_GrSLType, scope);
        varyingHandler->addVarying("corner_coverage", &fCornerCoverage);
        code->appendf("%s = half2(hull_coverage, 1) * %s;",
                      OutName(fCornerCoverage), cornerCoverage);
    }
}
Ejemplo n.º 3
0
void GrCCConicShader::onEmitVaryings(
        GrGLSLVaryingHandler* varyingHandler, GrGLSLVarying::Scope scope, SkString* code,
        const char* position, const char* coverage, const char* cornerCoverage, const char* wind) {
    code->appendf("float3 klm = float3(%s - %s, 1) * %s;",
                  position, fControlPoint.c_str(), fKLMMatrix.c_str());
    fKLM_fWind.reset(kFloat4_GrSLType, scope);
    varyingHandler->addVarying("klm_and_wind", &fKLM_fWind);
    code->appendf("%s.xyz = klm;", OutName(fKLM_fWind));
    code->appendf("%s.w = %s;", OutName(fKLM_fWind), wind);

    fGrad_fCorner.reset(cornerCoverage ? kFloat4_GrSLType : kFloat2_GrSLType, scope);
    varyingHandler->addVarying(cornerCoverage ? "grad_and_corner" : "grad", &fGrad_fCorner);
    code->appendf("%s.xy = 2*bloat * (float3x2(%s) * float3(2*klm[0], -klm[2], -klm[1]));",
                  OutName(fGrad_fCorner), fKLMMatrix.c_str());

    if (cornerCoverage) {
        SkASSERT(coverage);
        code->appendf("half hull_coverage;");
        this->calcHullCoverage(code, "klm", OutName(fGrad_fCorner), "hull_coverage");
        code->appendf("%s.zw = half2(hull_coverage, 1) * %s;",
                      OutName(fGrad_fCorner), cornerCoverage);
    }
}
void GrCCTriangleCornerShader::onEmitVaryings(GrGLSLVaryingHandler* varyingHandler,
                                              GrGLSLVarying::Scope scope, SkString* code,
                                              const char* position, const char* inputCoverage,
                                              const char* wind) {
    using Interpolation = GrGLSLVaryingHandler::Interpolation;
    SkASSERT(!inputCoverage);

    fCornerLocationInAABoxes.reset(kFloat2x2_GrSLType, scope);
    varyingHandler->addVarying("corner_location_in_aa_boxes", &fCornerLocationInAABoxes);

    fBisectInAABoxes.reset(kFloat2x2_GrSLType, scope);
    varyingHandler->addVarying("bisect_in_aa_boxes", &fBisectInAABoxes, Interpolation::kCanBeFlat);

    code->appendf("for (int i = 0; i < 2; ++i) {");
    code->appendf(    "%s[i] = %s * %s[i] + %s[i];",
                      OutName(fCornerLocationInAABoxes), position, fAABoxMatrices.c_str(),
                      fAABoxTranslates.c_str());
    code->appendf(    "%s[i] = %s[i];", OutName(fBisectInAABoxes), fGeoShaderBisects.c_str());
    code->appendf("}");

    fWindTimesHalf.reset(kHalf_GrSLType, scope);
    varyingHandler->addVarying("wind_times_half", &fWindTimesHalf, Interpolation::kCanBeFlat);
    code->appendf("%s = %s * .5;", OutName(fWindTimesHalf), wind);
}
Ejemplo n.º 5
0
void GrCCQuadraticShader::onEmitVaryings(
        GrGLSLVaryingHandler* varyingHandler, GrGLSLVarying::Scope scope, SkString* code,
        const char* position, const char* coverage, const char* cornerCoverage, const char* wind) {
    fCoord_fGrad.reset(kFloat4_GrSLType, scope);
    varyingHandler->addVarying("coord_and_grad", &fCoord_fGrad);
    code->appendf("%s.xy = %s * (%s - %s);",  // Quadratic coords.
                  OutName(fCoord_fGrad), fQCoordMatrix.c_str(), position, fQCoord0.c_str());
    code->appendf("%s.zw = 2*bloat * float2(2 * %s.x, -1) * %s;",  // Gradient.
                  OutName(fCoord_fGrad), OutName(fCoord_fGrad), fQCoordMatrix.c_str());

    // Coverages need full precision since distance to the opposite edge can be large.
    fEdge_fWind_fCorner.reset(cornerCoverage ? kFloat4_GrSLType : kFloat2_GrSLType, scope);
    varyingHandler->addVarying("edge_and_wind_and_corner", &fEdge_fWind_fCorner);
    code->appendf("%s.x = %s;", OutName(fEdge_fWind_fCorner), coverage);
    code->appendf("%s.y = %s;", OutName(fEdge_fWind_fCorner), wind);

    if (cornerCoverage) {
        SkASSERT(coverage);
        code->appendf("half hull_coverage;");
        this->calcHullCoverage(code, OutName(fCoord_fGrad), coverage, "hull_coverage");
        code->appendf("%s.zw = half2(hull_coverage, 1) * %s;",
                      OutName(fEdge_fWind_fCorner), cornerCoverage);
    }
}