| 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 "GrGLProgramBuilder.h" | 9 #include "GrGLProgramBuilder.h" |
| 10 #include "gl/GrGLGpu.h" | 10 #include "gl/GrGLGpu.h" |
| 11 #include "gl/GrGLGLSL.h" | 11 #include "gl/GrGLGLSL.h" |
| 12 #include "glsl/GrGLSLCaps.h" | 12 #include "glsl/GrGLSLCaps.h" |
| 13 | 13 |
| 14 #define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X) | 14 #define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X) |
| 15 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(),
R, X) | 15 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(),
R, X) |
| 16 | 16 |
| 17 const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; | 17 const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; |
| 18 static const char* declared_color_output_name() { return "fsColorOut"; } | 18 static const char* declared_color_output_name() { return "fsColorOut"; } |
| 19 static const char* dual_source_output_name() { return "dualSourceOut"; } | 19 static const char* declared_secondary_color_output_name() { return "fsSecondaryC
olorOut"; } |
| 20 | 20 |
| 21 static const char* specific_layout_qualifier_name(GrBlendEquation equation) { | 21 static const char* specific_layout_qualifier_name(GrBlendEquation equation) { |
| 22 SkASSERT(GrBlendEquationIsAdvanced(equation)); | 22 SkASSERT(GrBlendEquationIsAdvanced(equation)); |
| 23 | 23 |
| 24 static const char* kLayoutQualifierNames[] = { | 24 static const char* kLayoutQualifierNames[] = { |
| 25 "blend_support_screen", | 25 "blend_support_screen", |
| 26 "blend_support_overlay", | 26 "blend_support_overlay", |
| 27 "blend_support_darken", | 27 "blend_support_darken", |
| 28 "blend_support_lighten", | 28 "blend_support_lighten", |
| 29 "blend_support_colordodge", | 29 "blend_support_colordodge", |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 fCustomColorOutputIndex = fOutputs.count(); | 233 fCustomColorOutputIndex = fOutputs.count(); |
| 234 fOutputs.push_back().set(kVec4f_GrSLType, | 234 fOutputs.push_back().set(kVec4f_GrSLType, |
| 235 GrGLShaderVar::kOut_TypeModifier, | 235 GrGLShaderVar::kOut_TypeModifier, |
| 236 declared_color_output_name()); | 236 declared_color_output_name()); |
| 237 } | 237 } |
| 238 } | 238 } |
| 239 | 239 |
| 240 void GrGLFragmentShaderBuilder::enableSecondaryOutput() { | 240 void GrGLFragmentShaderBuilder::enableSecondaryOutput() { |
| 241 SkASSERT(!fHasSecondaryOutput); | 241 SkASSERT(!fHasSecondaryOutput); |
| 242 fHasSecondaryOutput = true; | 242 fHasSecondaryOutput = true; |
| 243 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifier, | 243 if (kGLES_GrGLStandard == fProgramBuilder->gpu()->ctxInfo().standard()) { |
| 244 dual_source_output_name()); | 244 this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, "GL_EXT_ble
nd_func_extended"); |
| 245 } |
| 246 |
| 247 // If the primary output is declared, we must declare also the secondary out
put |
| 248 // and vice versa, since it is not allowed to use a built-in gl_FragColor an
d a custom |
| 249 // output. The condition also co-incides with the condition in whici GLES SL
2.0 |
| 250 // requires the built-in gl_SecondaryFragColorEXT, where as 3.0 requires a c
ustom output. |
| 251 const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps(); |
| 252 if (caps.mustDeclareFragmentShaderOutput()) { |
| 253 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifi
er, |
| 254 declared_secondary_color_output_name()); |
| 255 } |
| 245 } | 256 } |
| 246 | 257 |
| 247 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { | 258 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { |
| 248 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; | 259 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"
; |
| 249 } | 260 } |
| 250 | 261 |
| 251 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { | 262 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { |
| 252 return dual_source_output_name(); | 263 const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps(); |
| 264 return caps.mustDeclareFragmentShaderOutput() ? declared_secondary_color_out
put_name() |
| 265 : "gl_SecondaryFragColorEXT"; |
| 253 } | 266 } |
| 254 | 267 |
| 255 bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId, | 268 bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId, |
| 256 SkTDArray<GrGLuint>* sha
derIds) { | 269 SkTDArray<GrGLuint>* sha
derIds) { |
| 257 GrGLGpu* gpu = fProgramBuilder->gpu(); | 270 GrGLGpu* gpu = fProgramBuilder->gpu(); |
| 258 this->versionDecl() = GrGLGetGLSLVersionDecl(gpu->ctxInfo()); | 271 this->versionDecl() = GrGLGetGLSLVersionDecl(gpu->ctxInfo()); |
| 259 GrGLAppendGLSLDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, | 272 GrGLAppendGLSLDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, |
| 260 gpu->glStandard(), | 273 gpu->glStandard(), |
| 261 &this->precisionQualifier()); | 274 &this->precisionQualifier()); |
| 262 this->compileAndAppendLayoutQualifiers(); | 275 this->compileAndAppendLayoutQualifiers(); |
| 263 fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility
, | 276 fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility
, |
| 264 &this->uniforms()); | 277 &this->uniforms()); |
| 265 this->appendDecls(fInputs, &this->inputs()); | 278 this->appendDecls(fInputs, &this->inputs()); |
| 266 // We shouldn't have declared outputs on 1.10 | 279 // We shouldn't have declared outputs on 1.10 |
| 267 SkASSERT(k110_GrGLSLGeneration != gpu->glslGeneration() || fOutputs.empty())
; | 280 SkASSERT(k110_GrGLSLGeneration != gpu->glslGeneration() || fOutputs.empty())
; |
| 268 this->appendDecls(fOutputs, &this->outputs()); | 281 this->appendDecls(fOutputs, &this->outputs()); |
| 269 return this->finalize(programId, GR_GL_FRAGMENT_SHADER, shaderIds); | 282 return this->finalize(programId, GR_GL_FRAGMENT_SHADER, shaderIds); |
| 270 } | 283 } |
| 271 | 284 |
| 272 void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID)
{ | 285 void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID)
{ |
| 273 if (fHasCustomColorOutput && fProgramBuilder->gpu()->glCaps().bindFragDataLo
cationSupport()) { | 286 const GrGLCaps& caps = fProgramBuilder->gpu()->glCaps(); |
| 287 if (fHasCustomColorOutput && caps.bindFragDataLocationSupport()) { |
| 274 GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name())
); | 288 GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name())
); |
| 275 } | 289 } |
| 276 if (fHasSecondaryOutput) { | 290 if (fHasSecondaryOutput && caps.glslCaps()->mustDeclareFragmentShaderOutput(
)) { |
| 277 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, dual_source_output_
name())); | 291 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, |
| 292 declared_secondary_color_output_name
())); |
| 278 } | 293 } |
| 279 } | 294 } |
| 280 | 295 |
| 281 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrSLPrecision fsPrec)
{ | 296 void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrSLPrecision fsPrec)
{ |
| 282 v->fFsIn = v->fVsOut; | 297 v->fFsIn = v->fVsOut; |
| 283 if (v->fGsOut) { | 298 if (v->fGsOut) { |
| 284 v->fFsIn = v->fGsOut; | 299 v->fFsIn = v->fGsOut; |
| 285 } | 300 } |
| 286 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); | 301 fInputs.push_back().set(v->fType, GrGLShaderVar::kVaryingIn_TypeModifier, v-
>fFsIn, fsPrec); |
| 287 } | 302 } |
| OLD | NEW |