| 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 |