void emitOutputsForBlendState(const EmitArgs& args) override { // This emit code should be empty. However, on the nexus 6 there is a driver bug where if // you do not give gl_FragColor a value, the gl context is lost and we end up drawing // nothing. So this fix just sets the gl_FragColor arbitrarily to 0. GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; fragBuilder->codeAppendf("%s = vec4(0);", args.fOutputPrimary); }
void GrGLSLXferProcessor::emitCode(const EmitArgs& args) { if (!args.fXP.willReadDstColor()) { this->emitOutputsForBlendState(args); return; } GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; const char* dstColor = fragBuilder->dstColor(); if (args.fXP.getDstTexture()) { bool topDown = kTopLeft_GrSurfaceOrigin == args.fXP.getDstTexture()->origin(); if (args.fInputCoverage) { // We don't think any shaders actually output negative coverage, but just as a safety // check for floating point precision errors we compare with <= here fragBuilder->codeAppendf("if (all(lessThanEqual(%s, vec4(0)))) {" " discard;" "}", args.fInputCoverage); } const char* dstTopLeftName; const char* dstCoordScaleName; fDstTopLeftUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kVec2f_GrSLType, kDefault_GrSLPrecision, "DstTextureUpperLeft", &dstTopLeftName); fDstScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kVec2f_GrSLType, kDefault_GrSLPrecision, "DstTextureCoordScale", &dstCoordScaleName); const char* fragPos = fragBuilder->fragmentPosition(); fragBuilder->codeAppend("// Read color from copy of the destination.\n"); fragBuilder->codeAppendf("vec2 _dstTexCoord = (%s.xy - %s) * %s;", fragPos, dstTopLeftName, dstCoordScaleName); if (!topDown) { fragBuilder->codeAppend("_dstTexCoord.y = 1.0 - _dstTexCoord.y;"); } fragBuilder->codeAppendf("vec4 %s = ", dstColor); fragBuilder->appendTextureLookup(args.fTexSamplers[0], "_dstTexCoord", kVec2f_GrSLType); fragBuilder->codeAppend(";"); } this->emitBlendCodeForDstRead(fragBuilder, uniformHandler, args.fInputColor, args.fInputCoverage, dstColor, args.fOutputPrimary, args.fOutputSecondary, args.fXP); }
void emitOutputsForBlendState(const EmitArgs& args) override { const CoverageSetOpXP& xp = args.fXP.cast<CoverageSetOpXP>(); GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; if (xp.invertCoverage()) { fragBuilder->codeAppendf("%s = 1.0 - %s;", args.fOutputPrimary, args.fInputCoverage); } else { fragBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputCoverage); } }
void emitOutputsForBlendState(const EmitArgs& args) override { if (args.fShaderCaps->mustWriteToFragColor()) { // This emit code should be empty. However, on the nexus 6 there is a driver bug where // if you do not give gl_FragColor a value, the gl context is lost and we end up drawing // nothing. So this fix just sets the gl_FragColor arbitrarily to 0. // https://bugs.chromium.org/p/chromium/issues/detail?id=445377 GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; fragBuilder->codeAppendf("%s = half4(0);", args.fOutputPrimary); } }
void emitOutputsForBlendState(const EmitArgs& args) override { const CustomXP& xp = args.fXP.cast<CustomXP>(); SkASSERT(xp.hasHWBlendEquation()); GrGLSLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->enableAdvancedBlendEquationIfNeeded(xp.hwBlendEquation()); // Apply coverage by multiplying it into the src color before blending. Mixed samples will // "just work" automatically. (See onGetOptimizations()) if (xp.readsCoverage()) { fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputCoverage, args.fInputColor); } else { fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputColor); } }
void emitOutputsForBlendState(const EmitArgs& args) override { GrGLSLXPFragmentBuilder* fragBuilder = args.fXPFragBuilder; SkASSERT(args.fInputCoverage); fragBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor, args.fInputCoverage); }
void emitOutputsForBlendState(const EmitArgs& args) override { GrGLSLXPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor, args.fInputCoverage); }