| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLFragmentShaderBuilder.h" | 8 #include "GrGLFragmentShaderBuilder.h" |
| 9 #include "GrGLShaderStringBuilder.h" | 9 #include "GrGLShaderStringBuilder.h" |
| 10 #include "GrGLProgramBuilder.h" | 10 #include "GrGLProgramBuilder.h" |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 } | 249 } |
| 250 | 250 |
| 251 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { | 251 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { |
| 252 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; | 252 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; |
| 253 } | 253 } |
| 254 | 254 |
| 255 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { | 255 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { |
| 256 return dual_source_output_name(); | 256 return dual_source_output_name(); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void GrGLFragmentShaderBuilder::enableSecondaryOutput(const GrGLSLExpr4& inputCo
lor, | |
| 260 const GrGLSLExpr4& inputCo
verage) { | |
| 261 this->enableSecondaryOutput(); | |
| 262 const char* secondaryOutputName = this->getSecondaryColorOutputName(); | |
| 263 GrGLSLExpr4 coeff(1); | |
| 264 switch (fProgramBuilder->header().fSecondaryOutputType) { | |
| 265 case GrProgramDesc::kCoverage_SecondaryOutputType: | |
| 266 break; | |
| 267 case GrProgramDesc::kCoverageISA_SecondaryOutputType: | |
| 268 // Get (1-A) into coeff | |
| 269 coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inputColor.a()); | |
| 270 break; | |
| 271 case GrProgramDesc::kCoverageISC_SecondaryOutputType: | |
| 272 // Get (1-RGBA) into coeff | |
| 273 coeff = GrGLSLExpr4(1) - inputColor; | |
| 274 break; | |
| 275 default: | |
| 276 SkFAIL("Unexpected Secondary Output"); | |
| 277 } | |
| 278 // Get coeff * coverage into modulate and then write that to the dual source
output. | |
| 279 this->codeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inputCoverag
e).c_str()); | |
| 280 } | |
| 281 | |
| 282 void GrGLFragmentShaderBuilder::combineColorAndCoverage(const GrGLSLExpr4& input
Color, | |
| 283 const GrGLSLExpr4& input
Coverage) { | |
| 284 GrGLSLExpr4 fragColor = inputColor * inputCoverage; | |
| 285 switch (fProgramBuilder->header().fPrimaryOutputType) { | |
| 286 case GrProgramDesc::kModulate_PrimaryOutputType: | |
| 287 break; | |
| 288 case GrProgramDesc::kCombineWithDst_PrimaryOutputType: | |
| 289 { | |
| 290 // Tack on "+(1-coverage)dst onto the frag color. | |
| 291 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inputCoverage; | |
| 292 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstCo
lor()); | |
| 293 fragColor = fragColor + dstContribution; | |
| 294 } | |
| 295 break; | |
| 296 default: | |
| 297 SkFAIL("Unknown Primary Output"); | |
| 298 } | |
| 299 | |
| 300 // On any post 1.10 GLSL supporting GPU, we declare custom output | |
| 301 if (k110_GrGLSLGeneration != fProgramBuilder->gpu()->glslGeneration()) { | |
| 302 this->enableCustomOutput(); | |
| 303 } | |
| 304 | |
| 305 this->codeAppendf("\t%s = %s;\n", this->getPrimaryColorOutputName(), fragCol
or.c_str()); | |
| 306 } | |
| 307 | |
| 308 bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId, | 259 bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId, |
| 309 SkTDArray<GrGLuint>* sha
derIds) const { | 260 SkTDArray<GrGLuint>* sha
derIds) const { |
| 310 GrGpuGL* gpu = fProgramBuilder->gpu(); | 261 GrGpuGL* gpu = fProgramBuilder->gpu(); |
| 311 SkString fragShaderSrc(GrGetGLSLVersionDecl(gpu->ctxInfo())); | 262 SkString fragShaderSrc(GrGetGLSLVersionDecl(gpu->ctxInfo())); |
| 312 fragShaderSrc.append(fExtensions); | 263 fragShaderSrc.append(fExtensions); |
| 313 append_default_precision_qualifier(kDefault_GrSLPrecision, | 264 append_default_precision_qualifier(kDefault_GrSLPrecision, |
| 314 gpu->glStandard(), | 265 gpu->glStandard(), |
| 315 &fragShaderSrc); | 266 &fragShaderSrc); |
| 316 fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility
, &fragShaderSrc); | 267 fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility
, &fragShaderSrc); |
| 317 this->appendDecls(fInputs, &fragShaderSrc); | 268 this->appendDecls(fInputs, &fragShaderSrc); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 346 } | 297 } |
| 347 } | 298 } |
| 348 | 299 |
| 349 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrSLPrecision fsPrec)
{ | 300 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrSLPrecision fsPrec)
{ |
| 350 v->fFsIn = v->fVsOut; | 301 v->fFsIn = v->fVsOut; |
| 351 if (v->fGsOut) { | 302 if (v->fGsOut) { |
| 352 v->fFsIn = v->fGsOut; | 303 v->fFsIn = v->fGsOut; |
| 353 } | 304 } |
| 354 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); | 305 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); |
| 355 } | 306 } |
| OLD | NEW |