OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "gl/GrGLShaderBuilder.h" | 8 #include "gl/GrGLShaderBuilder.h" |
9 #include "gl/GrGLProgram.h" | 9 #include "gl/GrGLProgram.h" |
10 #include "gl/GrGLUniformHandle.h" | 10 #include "gl/GrGLUniformHandle.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 , fVSAttrs(kVarsPerBlock) | 89 , fVSAttrs(kVarsPerBlock) |
90 , fVSOutputs(kVarsPerBlock) | 90 , fVSOutputs(kVarsPerBlock) |
91 , fGSInputs(kVarsPerBlock) | 91 , fGSInputs(kVarsPerBlock) |
92 , fGSOutputs(kVarsPerBlock) | 92 , fGSOutputs(kVarsPerBlock) |
93 , fFSInputs(kVarsPerBlock) | 93 , fFSInputs(kVarsPerBlock) |
94 , fFSOutputs(kMaxFSOutputs) | 94 , fFSOutputs(kMaxFSOutputs) |
95 , fUsesGS(false) | 95 , fUsesGS(false) |
96 , fCtxInfo(ctxInfo) | 96 , fCtxInfo(ctxInfo) |
97 , fUniformManager(uniformManager) | 97 , fUniformManager(uniformManager) |
98 , fCurrentStageIdx(kNonStageIdx) | 98 , fCurrentStageIdx(kNonStageIdx) |
99 , fFSFeaturesAddedMask(0) | |
99 , fSetupFragPosition(false) | 100 , fSetupFragPosition(false) |
100 , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle) { | 101 , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle) { |
101 | 102 |
102 fPositionVar = &fVSAttrs.push_back(); | 103 fPositionVar = &fVSAttrs.push_back(); |
103 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, " aPosition"); | 104 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, " aPosition"); |
104 if (explicitLocalCoords) { | 105 if (explicitLocalCoords) { |
105 fLocalCoordsVar = &fVSAttrs.push_back(); | 106 fLocalCoordsVar = &fVSAttrs.push_back(); |
106 fLocalCoordsVar->set(kVec2f_GrSLType, | 107 fLocalCoordsVar->set(kVec2f_GrSLType, |
107 GrGLShaderVar::kAttribute_TypeModifier, | 108 GrGLShaderVar::kAttribute_TypeModifier, |
108 "aLocalCoords"); | 109 "aLocalCoords"); |
109 } else { | 110 } else { |
110 fLocalCoordsVar = fPositionVar; | 111 fLocalCoordsVar = fPositionVar; |
111 } | 112 } |
112 } | 113 } |
113 | 114 |
115 bool GrGLShaderBuilder::enableFeature(GLSLFeature feature) { | |
116 switch (feature) { | |
117 case kStandardDerivatives_GLSLFeature: | |
118 if (!fCtxInfo.caps()->shaderDerivativeSupport()) { | |
119 return false; | |
120 } | |
121 if (kES2_GrGLBinding == fCtxInfo.binding()) { | |
122 this->addFSFeature(1 << kStandardDerivatives_GLSLFeature, | |
123 "GL_OES_standard_derivatives"); | |
124 } | |
125 return true; | |
126 default: | |
127 GrCrash("Unexpected GLSLFeature requested."); | |
128 return false; | |
129 } | |
130 } | |
131 | |
132 bool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) { | |
133 switch (feature) { | |
134 case kFragCoordConventions_GLSLPrivateFeature: | |
135 if (!fCtxInfo.caps()->fragCoordConventionsSupport()) { | |
136 return false; | |
137 } | |
138 if (fCtxInfo.glslGeneration() < k150_GrGLSLGeneration) { | |
139 this->addFSFeature(1 << kFragCoordConventions_GLSLPrivateFeature , | |
140 "GL_ARB_fragment_coord_conventions"); | |
141 } | |
142 return true; | |
143 default: | |
144 GrCrash("Unexpected GLSLPrivateFeature requested."); | |
145 return false; | |
146 } | |
147 } | |
148 | |
robertphillips
2013/03/26 17:26:05
"require" vs. "enable"
bsalomon
2013/04/01 17:49:31
require is more correct. We need the extension to
| |
149 void GrGLShaderBuilder::addFSFeature(uint32_t featureBit, const char* extensionN ame) { | |
150 if (!(featureBit & fFSFeaturesAddedMask)) { | |
151 fFSHeader.appendf("#extension %s: require\n", extensionName); | |
152 fFSFeaturesAddedMask |= featureBit; | |
153 } | |
154 } | |
155 | |
156 | |
114 void GrGLShaderBuilder::codeAppendf(ShaderType type, const char format[], va_lis t args) { | 157 void GrGLShaderBuilder::codeAppendf(ShaderType type, const char format[], va_lis t args) { |
115 SkString* string = NULL; | 158 SkString* string = NULL; |
116 switch (type) { | 159 switch (type) { |
117 case kVertex_ShaderType: | 160 case kVertex_ShaderType: |
118 string = &fVSCode; | 161 string = &fVSCode; |
119 break; | 162 break; |
120 case kGeometry_ShaderType: | 163 case kGeometry_ShaderType: |
121 string = &fGSCode; | 164 string = &fGSCode; |
122 break; | 165 break; |
123 case kFragment_ShaderType: | 166 case kFragment_ShaderType: |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
327 fFSInputs.back().setName(*fsName); | 370 fFSInputs.back().setName(*fsName); |
328 if (fsInName) { | 371 if (fsInName) { |
329 *fsInName = fsName->c_str(); | 372 *fsInName = fsName->c_str(); |
330 } | 373 } |
331 } | 374 } |
332 | 375 |
333 const char* GrGLShaderBuilder::fragmentPosition() { | 376 const char* GrGLShaderBuilder::fragmentPosition() { |
334 #if 1 | 377 #if 1 |
335 if (fCtxInfo.caps()->fragCoordConventionsSupport()) { | 378 if (fCtxInfo.caps()->fragCoordConventionsSupport()) { |
336 if (!fSetupFragPosition) { | 379 if (!fSetupFragPosition) { |
337 if (fCtxInfo.glslGeneration() < k150_GrGLSLGeneration) { | 380 SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSL PrivateFeature)); |
338 fFSHeader.append("#extension GL_ARB_fragment_coord_conventions: require\n"); | |
339 } | |
340 fFSInputs.push_back().set(kVec4f_GrSLType, | 381 fFSInputs.push_back().set(kVec4f_GrSLType, |
341 GrGLShaderVar::kIn_TypeModifier, | 382 GrGLShaderVar::kIn_TypeModifier, |
342 "gl_FragCoord", | 383 "gl_FragCoord", |
343 GrGLShaderVar::kDefault_Precision, | 384 GrGLShaderVar::kDefault_Precision, |
344 GrGLShaderVar::kUpperLeft_Origin); | 385 GrGLShaderVar::kUpperLeft_Origin); |
345 fSetupFragPosition = true; | 386 fSetupFragPosition = true; |
346 } | 387 } |
347 return "gl_FragCoord"; | 388 return "gl_FragCoord"; |
348 } else { | 389 } else { |
349 static const char* kCoordName = "fragCoordYDown"; | 390 static const char* kCoordName = "fragCoordYDown"; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
446 void GrGLShaderBuilder::appendUniformDecls(ShaderType stype, SkString* out) cons t { | 487 void GrGLShaderBuilder::appendUniformDecls(ShaderType stype, SkString* out) cons t { |
447 for (int i = 0; i < fUniforms.count(); ++i) { | 488 for (int i = 0; i < fUniforms.count(); ++i) { |
448 if (fUniforms[i].fVisibility & stype) { | 489 if (fUniforms[i].fVisibility & stype) { |
449 fUniforms[i].fVariable.appendDecl(fCtxInfo, out); | 490 fUniforms[i].fVariable.appendDecl(fCtxInfo, out); |
450 out->append(";\n"); | 491 out->append(";\n"); |
451 } | 492 } |
452 } | 493 } |
453 } | 494 } |
454 | 495 |
455 void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const { | 496 void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const { |
497 const char* version = GrGetGLSLVersionDecl(fCtxInfo.binding(), fCtxInfo.glsl Generation()); | |
498 | |
456 switch (type) { | 499 switch (type) { |
457 case kVertex_ShaderType: | 500 case kVertex_ShaderType: |
458 *shaderStr = fHeader; | 501 *shaderStr = version; |
459 this->appendUniformDecls(kVertex_ShaderType, shaderStr); | 502 this->appendUniformDecls(kVertex_ShaderType, shaderStr); |
460 this->appendDecls(fVSAttrs, shaderStr); | 503 this->appendDecls(fVSAttrs, shaderStr); |
461 this->appendDecls(fVSOutputs, shaderStr); | 504 this->appendDecls(fVSOutputs, shaderStr); |
462 shaderStr->append("void main() {\n"); | 505 shaderStr->append("void main() {\n"); |
463 shaderStr->append(fVSCode); | 506 shaderStr->append(fVSCode); |
464 shaderStr->append("}\n"); | 507 shaderStr->append("}\n"); |
465 break; | 508 break; |
466 case kGeometry_ShaderType: | 509 case kGeometry_ShaderType: |
467 if (fUsesGS) { | 510 if (fUsesGS) { |
468 *shaderStr = fHeader; | 511 *shaderStr = version; |
469 shaderStr->append(fGSHeader); | 512 shaderStr->append(fGSHeader); |
470 this->appendDecls(fGSInputs, shaderStr); | 513 this->appendDecls(fGSInputs, shaderStr); |
471 this->appendDecls(fGSOutputs, shaderStr); | 514 this->appendDecls(fGSOutputs, shaderStr); |
472 shaderStr->append("void main() {\n"); | 515 shaderStr->append("void main() {\n"); |
473 shaderStr->append(fGSCode); | 516 shaderStr->append(fGSCode); |
474 shaderStr->append("}\n"); | 517 shaderStr->append("}\n"); |
475 } else { | 518 } else { |
476 shaderStr->reset(); | 519 shaderStr->reset(); |
477 } | 520 } |
478 break; | 521 break; |
479 case kFragment_ShaderType: | 522 case kFragment_ShaderType: |
480 *shaderStr = fHeader; | 523 *shaderStr = version; |
481 append_default_precision_qualifier(kDefaultFragmentPrecision, | 524 append_default_precision_qualifier(kDefaultFragmentPrecision, |
482 fCtxInfo.binding(), | 525 fCtxInfo.binding(), |
483 shaderStr); | 526 shaderStr); |
484 shaderStr->append(fFSHeader); | 527 shaderStr->append(fFSHeader); |
485 this->appendUniformDecls(kFragment_ShaderType, shaderStr); | 528 this->appendUniformDecls(kFragment_ShaderType, shaderStr); |
486 this->appendDecls(fFSInputs, shaderStr); | 529 this->appendDecls(fFSInputs, shaderStr); |
487 // We shouldn't have declared outputs on 1.10 | 530 // We shouldn't have declared outputs on 1.10 |
488 GrAssert(k110_GrGLSLGeneration != fCtxInfo.glslGeneration() || fFSOu tputs.empty()); | 531 GrAssert(k110_GrGLSLGeneration != fCtxInfo.glslGeneration() || fFSOu tputs.empty()); |
489 this->appendDecls(fFSOutputs, shaderStr); | 532 this->appendDecls(fFSOutputs, shaderStr); |
490 shaderStr->append(fFSFunctions); | 533 shaderStr->append(fFSFunctions); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
552 for (const AttributePair* attrib = this->getEffectAttributes().begin(); | 595 for (const AttributePair* attrib = this->getEffectAttributes().begin(); |
553 attrib != attribEnd; | 596 attrib != attribEnd; |
554 ++attrib) { | 597 ++attrib) { |
555 if (attrib->fIndex == attributeIndex) { | 598 if (attrib->fIndex == attributeIndex) { |
556 return &attrib->fName; | 599 return &attrib->fName; |
557 } | 600 } |
558 } | 601 } |
559 | 602 |
560 return NULL; | 603 return NULL; |
561 } | 604 } |
OLD | NEW |