| 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 GrGLFragmentShaderBuilder::FragPosKey | 62 GrGLFragmentShaderBuilder::FragPosKey |
| 63 GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst, con
st GrGLCaps&) { | 63 GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst, con
st GrGLCaps&) { |
| 64 if (kTopLeft_GrSurfaceOrigin == dst->origin()) { | 64 if (kTopLeft_GrSurfaceOrigin == dst->origin()) { |
| 65 return kTopLeftFragPosRead_FragPosKey; | 65 return kTopLeftFragPosRead_FragPosKey; |
| 66 } else { | 66 } else { |
| 67 return kBottomLeftFragPosRead_FragPosKey; | 67 return kBottomLeftFragPosRead_FragPosKey; |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program
, | 71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program
, |
| 72 const GrGLProgramDesc& desc
) | 72 uint8_t fragPosKey) |
| 73 : INHERITED(program) | 73 : INHERITED(program) |
| 74 , fHasCustomColorOutput(false) | 74 , fHasCustomColorOutput(false) |
| 75 , fHasSecondaryOutput(false) | 75 , fHasSecondaryOutput(false) |
| 76 , fSetupFragPosition(false) | 76 , fSetupFragPosition(false) |
| 77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) | 77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == fragPosKey) |
| 78 , fCustomColorOutputIndex(-1) | 78 , fCustomColorOutputIndex(-1) |
| 79 , fHasReadDstColor(false) | 79 , fHasReadDstColor(false) |
| 80 , fHasReadFragmentPosition(false) { | 80 , fHasReadFragmentPosition(false) { |
| 81 } | 81 } |
| 82 | 82 |
| 83 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { | 83 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { |
| 84 switch (feature) { | 84 switch (feature) { |
| 85 case kStandardDerivatives_GLSLFeature: { | 85 case kStandardDerivatives_GLSLFeature: { |
| 86 GrGpuGL* gpu = fProgramBuilder->gpu(); | 86 GrGpuGL* gpu = fProgramBuilder->gpu(); |
| 87 if (!gpu->glCaps().shaderDerivativeSupport()) { | 87 if (!gpu->glCaps().shaderDerivativeSupport()) { |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, | 259 void GrGLFragmentShaderBuilder::enableSecondaryOutput(const GrGLSLExpr4& inputCo
lor, |
| 260 const GrGLSLExpr4& inputCo
verage) { | 260 const GrGLSLExpr4& inputCo
verage) { |
| 261 this->enableSecondaryOutput(); | 261 this->enableSecondaryOutput(); |
| 262 const char* secondaryOutputName = this->getSecondaryColorOutputName(); | 262 const char* secondaryOutputName = this->getSecondaryColorOutputName(); |
| 263 GrGLSLExpr4 coeff(1); | 263 GrGLSLExpr4 coeff(1); |
| 264 switch (fProgramBuilder->header().fSecondaryOutputType) { | 264 switch (fProgramBuilder->header().fSecondaryOutputType) { |
| 265 case GrOptDrawState::kCoverage_SecondaryOutputType: | 265 case GrProgramDesc::kCoverage_SecondaryOutputType: |
| 266 break; | 266 break; |
| 267 case GrOptDrawState::kCoverageISA_SecondaryOutputType: | 267 case GrProgramDesc::kCoverageISA_SecondaryOutputType: |
| 268 // Get (1-A) into coeff | 268 // Get (1-A) into coeff |
| 269 coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inputColor.a()); | 269 coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inputColor.a()); |
| 270 break; | 270 break; |
| 271 case GrOptDrawState::kCoverageISC_SecondaryOutputType: | 271 case GrProgramDesc::kCoverageISC_SecondaryOutputType: |
| 272 // Get (1-RGBA) into coeff | 272 // Get (1-RGBA) into coeff |
| 273 coeff = GrGLSLExpr4(1) - inputColor; | 273 coeff = GrGLSLExpr4(1) - inputColor; |
| 274 break; | 274 break; |
| 275 default: | 275 default: |
| 276 SkFAIL("Unexpected Secondary Output"); | 276 SkFAIL("Unexpected Secondary Output"); |
| 277 } | 277 } |
| 278 // Get coeff * coverage into modulate and then write that to the dual source
output. | 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()); | 279 this->codeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inputCoverag
e).c_str()); |
| 280 } | 280 } |
| 281 | 281 |
| 282 void GrGLFragmentShaderBuilder::combineColorAndCoverage(const GrGLSLExpr4& input
Color, | 282 void GrGLFragmentShaderBuilder::combineColorAndCoverage(const GrGLSLExpr4& input
Color, |
| 283 const GrGLSLExpr4& input
Coverage) { | 283 const GrGLSLExpr4& input
Coverage) { |
| 284 GrGLSLExpr4 fragColor = inputColor * inputCoverage; | 284 GrGLSLExpr4 fragColor = inputColor * inputCoverage; |
| 285 switch (fProgramBuilder->header().fPrimaryOutputType) { | 285 switch (fProgramBuilder->header().fPrimaryOutputType) { |
| 286 case GrOptDrawState::kModulate_PrimaryOutputType: | 286 case GrProgramDesc::kModulate_PrimaryOutputType: |
| 287 break; | 287 break; |
| 288 case GrOptDrawState::kCombineWithDst_PrimaryOutputType: | 288 case GrProgramDesc::kCombineWithDst_PrimaryOutputType: |
| 289 { | 289 { |
| 290 // Tack on "+(1-coverage)dst onto the frag color. | 290 // Tack on "+(1-coverage)dst onto the frag color. |
| 291 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inputCoverage; | 291 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inputCoverage; |
| 292 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstCo
lor()); | 292 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstCo
lor()); |
| 293 fragColor = fragColor + dstContribution; | 293 fragColor = fragColor + dstContribution; |
| 294 } | 294 } |
| 295 break; | 295 break; |
| 296 default: | 296 default: |
| 297 SkFAIL("Unknown Primary Output"); | 297 SkFAIL("Unknown Primary Output"); |
| 298 } | 298 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 } | 346 } |
| 347 } | 347 } |
| 348 | 348 |
| 349 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrGLShaderVar::Precis
ion fsPrec) { | 349 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrGLShaderVar::Precis
ion fsPrec) { |
| 350 v->fFsIn = v->fVsOut; | 350 v->fFsIn = v->fVsOut; |
| 351 if (v->fGsOut) { | 351 if (v->fGsOut) { |
| 352 v->fFsIn = v->fGsOut; | 352 v->fFsIn = v->fGsOut; |
| 353 } | 353 } |
| 354 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); | 354 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); |
| 355 } | 355 } |
| OLD | NEW |