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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 } | 86 } |
87 | 87 |
88 static const char kDstCopyColorName[] = "_dstColor"; | 88 static const char kDstCopyColorName[] = "_dstColor"; |
89 | 89 |
90 /////////////////////////////////////////////////////////////////////////////// | 90 /////////////////////////////////////////////////////////////////////////////// |
91 | 91 |
92 bool GrGLShaderBuilder::GenProgram(GrGpuGL* gpu, | 92 bool GrGLShaderBuilder::GenProgram(GrGpuGL* gpu, |
93 GrGLUniformManager& uman, | 93 GrGLUniformManager* uman, |
94 const GrGLProgramDesc& desc, | 94 const GrGLProgramDesc& desc, |
95 const GrEffectStage* inColorStages[], | 95 const GrEffectStage* inColorStages[], |
96 const GrEffectStage* inCoverageStages[], | 96 const GrEffectStage* inCoverageStages[], |
97 GenProgramOutput* output) { | 97 GenProgramOutput* output) { |
98 if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing(
)) { | 98 if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing(
)) { |
99 GrGLFullShaderBuilder fullBuilder(gpu, uman, desc); | 99 GrGLFullShaderBuilder fullBuilder(gpu, uman, desc); |
100 if (fullBuilder.genProgram(inColorStages, inCoverageStages, output)) { | 100 if (fullBuilder.genProgram(inColorStages, inCoverageStages, output)) { |
101 output->fHasVS = true; | 101 output->fHasVS = true; |
102 output->fUniformHandles.fViewMatrixUni = fullBuilder.getViewMatrixUn
iform(); | 102 output->fUniformHandles.fViewMatrixUni = fullBuilder.getViewMatrixUn
iform(); |
103 output->fUniformHandles.fRTAdjustmentUni = fullBuilder.getRTAdjustme
ntVecUniform(); | 103 output->fUniformHandles.fRTAdjustmentUni = fullBuilder.getRTAdjustme
ntVecUniform(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstColor()); | 167 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstColor()); |
168 | 168 |
169 fragColor = fragColor + dstContribution; | 169 fragColor = fragColor + dstContribution; |
170 } | 170 } |
171 this->fsCodeAppendf("\t%s = %s;\n", this->getColorOutputName(), fragColor.c_
str()); | 171 this->fsCodeAppendf("\t%s = %s;\n", this->getColorOutputName(), fragColor.c_
str()); |
172 | 172 |
173 if (!this->finish(&output->fProgramID)) { | 173 if (!this->finish(&output->fProgramID)) { |
174 return false; | 174 return false; |
175 } | 175 } |
176 | 176 |
177 output->fUniformHandles.fRTHeightUni = this->getRTHeightUniform(); | 177 output->fUniformHandles.fRTHeightUni = fRTHeightUniform; |
178 output->fUniformHandles.fDstCopyTopLeftUni = this->getDstCopyTopLeftUniform(
); | 178 output->fUniformHandles.fColorUni = fColorUniform; |
179 output->fUniformHandles.fDstCopyScaleUni = this->getDstCopyScaleUniform(); | 179 output->fUniformHandles.fCoverageUni = fCoverageUniform; |
180 output->fUniformHandles.fColorUni = this->getColorUniform(); | 180 output->fUniformHandles.fDstCopyTopLeftUni = fDstCopyTopLeftUniform; |
181 output->fUniformHandles.fCoverageUni = this->getCoverageUniform(); | 181 output->fUniformHandles.fDstCopyScaleUni = fDstCopyScaleUniform; |
182 output->fUniformHandles.fDstCopySamplerUni = this->getDstCopySamplerUniform(
); | 182 output->fUniformHandles.fDstCopySamplerUni = fDstCopySamplerUniform; |
183 | 183 |
184 return true; | 184 return true; |
185 } | 185 } |
186 | 186 |
187 ////////////////////////////////////////////////////////////////////////////// | 187 ////////////////////////////////////////////////////////////////////////////// |
188 | 188 |
189 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, | 189 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
190 GrGLUniformManager& uniformManager, | 190 GrGLUniformManager* uniformManager, |
191 const GrGLProgramDesc& desc) | 191 const GrGLProgramDesc& desc) |
192 : fDesc(desc) | 192 : fDesc(desc) |
193 , fGpu(gpu) | 193 , fGpu(gpu) |
194 , fUniformManager(uniformManager) | 194 , fUniformManager(SkRef(uniformManager)) |
195 , fFSFeaturesAddedMask(0) | 195 , fFSFeaturesAddedMask(0) |
196 , fFSInputs(kVarsPerBlock) | 196 , fFSInputs(kVarsPerBlock) |
197 , fFSOutputs(kMaxFSOutputs) | 197 , fFSOutputs(kMaxFSOutputs) |
198 , fUniforms(kVarsPerBlock) | 198 , fUniforms(kVarsPerBlock) |
199 , fSetupFragPosition(false) | 199 , fSetupFragPosition(false) |
200 , fHasCustomColorOutput(false) | 200 , fHasCustomColorOutput(false) |
201 , fHasSecondaryOutput(false) | 201 , fHasSecondaryOutput(false) |
202 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) { | 202 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) { |
203 | 203 |
204 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); | 204 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 int count, | 446 int count, |
447 const char*
* outName) { | 447 const char*
* outName) { |
448 SkASSERT(name && strlen(name)); | 448 SkASSERT(name && strlen(name)); |
449 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFr
agment_Visibility); | 449 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFr
agment_Visibility); |
450 SkASSERT(0 == (~kVisibilityMask & visibility)); | 450 SkASSERT(0 == (~kVisibilityMask & visibility)); |
451 SkASSERT(0 != visibility); | 451 SkASSERT(0 != visibility); |
452 | 452 |
453 BuilderUniform& uni = fUniforms.push_back(); | 453 BuilderUniform& uni = fUniforms.push_back(); |
454 UniformHandle h = GrGLUniformManager::UniformHandle::CreateFromUniformIndex(
fUniforms.count() - 1); | 454 UniformHandle h = GrGLUniformManager::UniformHandle::CreateFromUniformIndex(
fUniforms.count() - 1); |
455 SkDEBUGCODE(UniformHandle h2 =) | 455 SkDEBUGCODE(UniformHandle h2 =) |
456 fUniformManager.appendUniform(type, count); | 456 fUniformManager->appendUniform(type, count); |
457 // We expect the uniform manager to initially have no uniforms and that all
uniforms are added | 457 // We expect the uniform manager to initially have no uniforms and that all
uniforms are added |
458 // by this function. Therefore, the handles should match. | 458 // by this function. Therefore, the handles should match. |
459 SkASSERT(h2 == h); | 459 SkASSERT(h2 == h); |
460 uni.fVariable.setType(type); | 460 uni.fVariable.setType(type); |
461 uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier); | 461 uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier); |
462 this->nameVariable(uni.fVariable.accessName(), 'u', name); | 462 this->nameVariable(uni.fVariable.accessName(), 'u', name); |
463 uni.fVariable.setArrayCount(count); | 463 uni.fVariable.setArrayCount(count); |
464 uni.fVisibility = visibility; | 464 uni.fVisibility = visibility; |
465 | 465 |
466 // If it is visible in both the VS and FS, the precision must match. | 466 // If it is visible in both the VS and FS, the precision must match. |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 } | 675 } |
676 | 676 |
677 SkTDArray<GrGLuint> shadersToDelete; | 677 SkTDArray<GrGLuint> shadersToDelete; |
678 | 678 |
679 if (!this->compileAndAttachShaders(programId, &shadersToDelete)) { | 679 if (!this->compileAndAttachShaders(programId, &shadersToDelete)) { |
680 GL_CALL(DeleteProgram(programId)); | 680 GL_CALL(DeleteProgram(programId)); |
681 return false; | 681 return false; |
682 } | 682 } |
683 | 683 |
684 this->bindProgramLocations(programId); | 684 this->bindProgramLocations(programId); |
685 if (fUniformManager.isUsingBindUniform()) { | 685 if (fUniformManager->isUsingBindUniform()) { |
686 fUniformManager.getUniformLocations(programId, fUniforms); | 686 fUniformManager->getUniformLocations(programId, fUniforms); |
687 } | 687 } |
688 | 688 |
689 GL_CALL(LinkProgram(programId)); | 689 GL_CALL(LinkProgram(programId)); |
690 | 690 |
691 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. | 691 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. |
692 bool checkLinked = !fGpu->ctxInfo().isChromium(); | 692 bool checkLinked = !fGpu->ctxInfo().isChromium(); |
693 #ifdef SK_DEBUG | 693 #ifdef SK_DEBUG |
694 checkLinked = true; | 694 checkLinked = true; |
695 #endif | 695 #endif |
696 if (checkLinked) { | 696 if (checkLinked) { |
(...skipping 12 matching lines...) Expand all Loading... |
709 &length, | 709 &length, |
710 (char*)log.get())); | 710 (char*)log.get())); |
711 GrPrintf((char*)log.get()); | 711 GrPrintf((char*)log.get()); |
712 } | 712 } |
713 SkDEBUGFAIL("Error linking program"); | 713 SkDEBUGFAIL("Error linking program"); |
714 GL_CALL(DeleteProgram(programId)); | 714 GL_CALL(DeleteProgram(programId)); |
715 return false; | 715 return false; |
716 } | 716 } |
717 } | 717 } |
718 | 718 |
719 if (!fUniformManager.isUsingBindUniform()) { | 719 if (!fUniformManager->isUsingBindUniform()) { |
720 fUniformManager.getUniformLocations(programId, fUniforms); | 720 fUniformManager->getUniformLocations(programId, fUniforms); |
721 } | 721 } |
722 | 722 |
723 for (int i = 0; i < shadersToDelete.count(); ++i) { | 723 for (int i = 0; i < shadersToDelete.count(); ++i) { |
724 GL_CALL(DeleteShader(shadersToDelete[i])); | 724 GL_CALL(DeleteShader(shadersToDelete[i])); |
725 } | 725 } |
726 | 726 |
727 *outProgramId = programId; | 727 *outProgramId = programId; |
728 return true; | 728 return true; |
729 } | 729 } |
730 | 730 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 } | 823 } |
824 } | 824 } |
825 | 825 |
826 const GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const { | 826 const GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const { |
827 return fGpu->ctxInfo(); | 827 return fGpu->ctxInfo(); |
828 } | 828 } |
829 | 829 |
830 //////////////////////////////////////////////////////////////////////////////// | 830 //////////////////////////////////////////////////////////////////////////////// |
831 | 831 |
832 GrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu, | 832 GrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu, |
833 GrGLUniformManager& uniformManager, | 833 GrGLUniformManager* uniformManager, |
834 const GrGLProgramDesc& desc) | 834 const GrGLProgramDesc& desc) |
835 : INHERITED(gpu, uniformManager, desc) | 835 : INHERITED(gpu, uniformManager, desc) |
836 , fVSAttrs(kVarsPerBlock) | 836 , fVSAttrs(kVarsPerBlock) |
837 , fVSOutputs(kVarsPerBlock) | 837 , fVSOutputs(kVarsPerBlock) |
838 , fGSInputs(kVarsPerBlock) | 838 , fGSInputs(kVarsPerBlock) |
839 , fGSOutputs(kVarsPerBlock) { | 839 , fGSOutputs(kVarsPerBlock) { |
840 | 840 |
841 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); | 841 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
842 | 842 |
843 fPositionVar = &fVSAttrs.push_back(); | 843 fPositionVar = &fVSAttrs.push_back(); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1063 | 1063 |
1064 const AttributePair* attribEnd = fEffectAttributes.end(); | 1064 const AttributePair* attribEnd = fEffectAttributes.end(); |
1065 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { | 1065 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { |
1066 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); | 1066 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); |
1067 } | 1067 } |
1068 } | 1068 } |
1069 | 1069 |
1070 //////////////////////////////////////////////////////////////////////////////// | 1070 //////////////////////////////////////////////////////////////////////////////// |
1071 | 1071 |
1072 GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu, | 1072 GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu, |
1073 GrGLUniformManager&
uniformManager, | 1073 GrGLUniformManager*
uniformManager, |
1074 const GrGLProgramDe
sc& desc) | 1074 const GrGLProgramDe
sc& desc) |
1075 : INHERITED(gpu, uniformManager, desc) | 1075 : INHERITED(gpu, uniformManager, desc) |
1076 , fNumTexCoordSets(0) { | 1076 , fNumTexCoordSets(0) { |
1077 | 1077 |
1078 SkASSERT(!desc.getHeader().fHasVertexCode); | 1078 SkASSERT(!desc.getHeader().fHasVertexCode); |
1079 SkASSERT(gpu->glCaps().pathRenderingSupport()); | 1079 SkASSERT(gpu->glCaps().pathRenderingSupport()); |
1080 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); | 1080 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); |
1081 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); | 1081 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); |
1082 } | 1082 } |
1083 | 1083 |
(...skipping 12 matching lines...) Expand all Loading... |
1096 | 1096 |
1097 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, | 1097 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |
1098 effectCnt); | 1098 effectCnt); |
1099 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, | 1099 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |
1100 effectStages, | 1100 effectStages, |
1101 effectKeys, | 1101 effectKeys, |
1102 effectCnt, | 1102 effectCnt, |
1103 inOutFSColor); | 1103 inOutFSColor); |
1104 return pathTexGenEffectsBuilder.finish(); | 1104 return pathTexGenEffectsBuilder.finish(); |
1105 } | 1105 } |
OLD | NEW |