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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 } | 245 } |
246 | 246 |
247 return true; | 247 return true; |
248 } | 248 } |
249 | 249 |
250 ////////////////////////////////////////////////////////////////////////////// | 250 ////////////////////////////////////////////////////////////////////////////// |
251 | 251 |
252 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, | 252 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
253 GrGLUniformManager* uniformManager, | 253 GrGLUniformManager* uniformManager, |
254 const GrGLProgramDesc& desc) | 254 const GrGLProgramDesc& desc) |
255 : fDesc(desc) | 255 : fFSInputs(kVarsPerBlock) |
| 256 , fUniformManager(SkRef(uniformManager)) |
| 257 , fDesc(desc) |
256 , fGpu(gpu) | 258 , fGpu(gpu) |
257 , fUniformManager(SkRef(uniformManager)) | |
258 , fFSFeaturesAddedMask(0) | 259 , fFSFeaturesAddedMask(0) |
259 , fFSInputs(kVarsPerBlock) | |
260 , fFSOutputs(kMaxFSOutputs) | 260 , fFSOutputs(kMaxFSOutputs) |
261 , fUniforms(kVarsPerBlock) | 261 , fUniforms(kVarsPerBlock) |
262 , fSetupFragPosition(false) | 262 , fSetupFragPosition(false) |
263 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) | 263 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) |
264 , fHasCustomColorOutput(false) | 264 , fHasCustomColorOutput(false) |
265 , fHasSecondaryOutput(false) { | 265 , fHasSecondaryOutput(false) { |
266 } | 266 } |
267 | 267 |
268 bool GrGLShaderBuilder::enableFeature(GLSLFeature feature) { | 268 bool GrGLShaderBuilder::enableFeature(GLSLFeature feature) { |
269 switch (feature) { | 269 switch (feature) { |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 fSetupFragPosition = true; | 501 fSetupFragPosition = true; |
502 return "gl_FragCoord"; | 502 return "gl_FragCoord"; |
503 } else if (fGpu->glCaps().fragCoordConventionsSupport()) { | 503 } else if (fGpu->glCaps().fragCoordConventionsSupport()) { |
504 if (!fSetupFragPosition) { | 504 if (!fSetupFragPosition) { |
505 SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSL
PrivateFeature)); | 505 SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSL
PrivateFeature)); |
506 fFSInputs.push_back().set(kVec4f_GrSLType, | 506 fFSInputs.push_back().set(kVec4f_GrSLType, |
507 GrGLShaderVar::kIn_TypeModifier, | 507 GrGLShaderVar::kIn_TypeModifier, |
508 "gl_FragCoord", | 508 "gl_FragCoord", |
509 GrGLShaderVar::kDefault_Precision, | 509 GrGLShaderVar::kDefault_Precision, |
510 GrGLShaderVar::kUpperLeft_Origin); | 510 GrGLShaderVar::kUpperLeft_Origin); |
| 511 fUniformManager->appendFragmentInput(); |
511 fSetupFragPosition = true; | 512 fSetupFragPosition = true; |
512 } | 513 } |
513 return "gl_FragCoord"; | 514 return "gl_FragCoord"; |
514 } else { | 515 } else { |
515 static const char* kCoordName = "fragCoordYDown"; | 516 static const char* kCoordName = "fragCoordYDown"; |
516 if (!fSetupFragPosition) { | 517 if (!fSetupFragPosition) { |
517 // temporarily change the stage index because we're inserting non-st
age code. | 518 // temporarily change the stage index because we're inserting non-st
age code. |
518 CodeStage::AutoStageRestore csar(&fCodeStage, NULL); | 519 CodeStage::AutoStageRestore csar(&fCodeStage, NULL); |
519 | 520 |
520 SkASSERT(!fOutput.fUniformHandles.fRTHeightUni.isValid()); | 521 SkASSERT(!fOutput.fUniformHandles.fRTHeightUni.isValid()); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 } | 669 } |
669 | 670 |
670 SkTDArray<GrGLuint> shadersToDelete; | 671 SkTDArray<GrGLuint> shadersToDelete; |
671 | 672 |
672 if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) { | 673 if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) { |
673 GL_CALL(DeleteProgram(fOutput.fProgramID)); | 674 GL_CALL(DeleteProgram(fOutput.fProgramID)); |
674 return false; | 675 return false; |
675 } | 676 } |
676 | 677 |
677 this->bindProgramLocations(fOutput.fProgramID); | 678 this->bindProgramLocations(fOutput.fProgramID); |
678 if (fUniformManager->isUsingBindUniform()) { | 679 fUniformManager->bindProgramResourceLocations(fOutput.fProgramID, fUniforms)
; |
679 fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); | |
680 } | |
681 | 680 |
682 GL_CALL(LinkProgram(fOutput.fProgramID)); | 681 GL_CALL(LinkProgram(fOutput.fProgramID)); |
683 | 682 |
684 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. | 683 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. |
685 bool checkLinked = !fGpu->ctxInfo().isChromium(); | 684 bool checkLinked = !fGpu->ctxInfo().isChromium(); |
686 #ifdef SK_DEBUG | 685 #ifdef SK_DEBUG |
687 checkLinked = true; | 686 checkLinked = true; |
688 #endif | 687 #endif |
689 if (checkLinked) { | 688 if (checkLinked) { |
690 GrGLint linked = GR_GL_INIT_ZERO; | 689 GrGLint linked = GR_GL_INIT_ZERO; |
(...skipping 12 matching lines...) Expand all Loading... |
703 (char*)log.get())); | 702 (char*)log.get())); |
704 GrPrintf((char*)log.get()); | 703 GrPrintf((char*)log.get()); |
705 } | 704 } |
706 SkDEBUGFAIL("Error linking program"); | 705 SkDEBUGFAIL("Error linking program"); |
707 GL_CALL(DeleteProgram(fOutput.fProgramID)); | 706 GL_CALL(DeleteProgram(fOutput.fProgramID)); |
708 fOutput.fProgramID = 0; | 707 fOutput.fProgramID = 0; |
709 return false; | 708 return false; |
710 } | 709 } |
711 } | 710 } |
712 | 711 |
713 if (!fUniformManager->isUsingBindUniform()) { | 712 fUniformManager->resolveProgramResourceLocations(fOutput.fProgramID, fUnifor
ms, fFSInputs); |
714 fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); | |
715 } | |
716 | 713 |
717 for (int i = 0; i < shadersToDelete.count(); ++i) { | 714 for (int i = 0; i < shadersToDelete.count(); ++i) { |
718 GL_CALL(DeleteShader(shadersToDelete[i])); | 715 GL_CALL(DeleteShader(shadersToDelete[i])); |
719 } | 716 } |
720 | 717 |
721 return true; | 718 return true; |
722 } | 719 } |
723 | 720 |
724 // Compiles a GL shader and attaches it to a program. Returns the shader ID if | 721 // Compiles a GL shader and attaches it to a program. Returns the shader ID if |
725 // successful, or 0 if not. | 722 // successful, or 0 if not. |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 GrSLType type, | 911 GrSLType type, |
915 const SkString& name) { | 912 const SkString& name) { |
916 if (!this->addAttribute(type, name.c_str())) { | 913 if (!this->addAttribute(type, name.c_str())) { |
917 return false; | 914 return false; |
918 } | 915 } |
919 | 916 |
920 fEffectAttributes.push_back().set(attributeIndex, name); | 917 fEffectAttributes.push_back().set(attributeIndex, name); |
921 return true; | 918 return true; |
922 } | 919 } |
923 | 920 |
924 void GrGLFullShaderBuilder::addVarying(GrSLType type, | 921 GrGLUniformManager::FragmentInputHandle GrGLFullShaderBuilder::addVarying(GrSLTy
pe type, |
925 const char* name, | 922 const
char* name, |
926 const char** vsOutName, | 923 const
char** vsOutName, |
927 const char** fsInName) { | 924 const
char** fsInName) { |
928 fVSOutputs.push_back(); | 925 fVSOutputs.push_back(); |
929 fVSOutputs.back().setType(type); | 926 fVSOutputs.back().setType(type); |
930 fVSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier); | 927 fVSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier); |
931 this->nameVariable(fVSOutputs.back().accessName(), 'v', name); | 928 this->nameVariable(fVSOutputs.back().accessName(), 'v', name); |
932 | 929 |
933 if (vsOutName) { | 930 if (vsOutName) { |
934 *vsOutName = fVSOutputs.back().getName().c_str(); | 931 *vsOutName = fVSOutputs.back().getName().c_str(); |
935 } | 932 } |
936 // input to FS comes either from VS or GS | 933 // input to FS comes either from VS or GS |
937 const SkString* fsName; | 934 const SkString* fsName; |
938 #if GR_GL_EXPERIMENTAL_GS | 935 #if GR_GL_EXPERIMENTAL_GS |
939 if (this->desc().getHeader().fExperimentalGS) { | 936 if (this->desc().getHeader().fExperimentalGS) { |
940 // if we have a GS take each varying in as an array | 937 // if we have a GS take each varying in as an array |
941 // and output as non-array. | 938 // and output as non-array. |
942 fGSInputs.push_back(); | 939 fGSInputs.push_back(); |
943 fGSInputs.back().setType(type); | 940 fGSInputs.back().setType(type); |
944 fGSInputs.back().setTypeModifier(GrGLShaderVar::kVaryingIn_TypeModifier)
; | 941 fGSInputs.back().setTypeModifier(GrGLShaderVar::kVaryingIn_TypeModifier)
; |
945 fGSInputs.back().setUnsizedArray(); | 942 fGSInputs.back().setUnsizedArray(); |
946 *fGSInputs.back().accessName() = fVSOutputs.back().getName(); | 943 *fGSInputs.back().accessName() = fVSOutputs.back().getName(); |
947 fGSOutputs.push_back(); | 944 fGSOutputs.push_back(); |
948 fGSOutputs.back().setType(type); | 945 fGSOutputs.back().setType(type); |
949 fGSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifie
r); | 946 fGSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifie
r); |
950 this->nameVariable(fGSOutputs.back().accessName(), 'g', name); | 947 this->nameVariable(fGSOutputs.back().accessName(), 'g', name); |
951 fsName = fGSOutputs.back().accessName(); | 948 fsName = fGSOutputs.back().accessName(); |
952 } else | 949 } else |
953 #endif | 950 #endif |
954 { | 951 { |
955 fsName = fVSOutputs.back().accessName(); | 952 fsName = fVSOutputs.back().accessName(); |
956 } | 953 } |
957 this->fsInputAppend().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, *fsN
ame); | 954 this->fFSInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier
, *fsName); |
| 955 GrGLUniformManager::FragmentInputHandle h = |
| 956 GrGLUniformManager::FragmentInputHandle::CreateFromFragmentInputIndex(fF
SInputs.count() - 1); |
| 957 |
| 958 SkDEBUGCODE(GrGLUniformManager::FragmentInputHandle h2 =) |
| 959 fUniformManager->appendFragmentInput(); |
| 960 SkASSERT(h == h2); |
| 961 |
958 if (fsInName) { | 962 if (fsInName) { |
959 *fsInName = fsName->c_str(); | 963 *fsInName = fsName->c_str(); |
960 } | 964 } |
| 965 return h; |
961 } | 966 } |
962 | 967 |
963 const SkString* GrGLFullShaderBuilder::getEffectAttributeName(int attributeIndex
) const { | 968 const SkString* GrGLFullShaderBuilder::getEffectAttributeName(int attributeIndex
) const { |
964 const AttributePair* attribEnd = fEffectAttributes.end(); | 969 const AttributePair* attribEnd = fEffectAttributes.end(); |
965 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { | 970 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { |
966 if (attrib->fIndex == attributeIndex) { | 971 if (attrib->fIndex == attributeIndex) { |
967 return &attrib->fName; | 972 return &attrib->fName; |
968 } | 973 } |
969 } | 974 } |
970 | 975 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 | 1101 |
1097 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, | 1102 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |
1098 effectCnt); | 1103 effectCnt); |
1099 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, | 1104 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |
1100 effectStages, | 1105 effectStages, |
1101 effectKeys, | 1106 effectKeys, |
1102 effectCnt, | 1107 effectCnt, |
1103 inOutFSColor); | 1108 inOutFSColor); |
1104 return pathTexGenEffectsBuilder.finish(); | 1109 return pathTexGenEffectsBuilder.finish(); |
1105 } | 1110 } |
OLD | NEW |