Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: src/gpu/gl/GrGLShaderBuilder.cpp

Issue 367643004: Implement NVPR on GLES (Closed) Base URL: https://skia.googlesource.com/skia.git@02-path-program-fragment
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698