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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 switch (feature) { | 179 switch (feature) { |
180 case kStandardDerivatives_GLSLFeature: | 180 case kStandardDerivatives_GLSLFeature: |
181 if (!fGpu->glCaps().shaderDerivativeSupport()) { | 181 if (!fGpu->glCaps().shaderDerivativeSupport()) { |
182 return false; | 182 return false; |
183 } | 183 } |
184 if (kGLES_GrGLStandard == fGpu->glStandard()) { | 184 if (kGLES_GrGLStandard == fGpu->glStandard()) { |
185 this->addFSFeature(1 << kStandardDerivatives_GLSLFeature, | 185 this->addFSFeature(1 << kStandardDerivatives_GLSLFeature, |
186 "GL_OES_standard_derivatives"); | 186 "GL_OES_standard_derivatives"); |
187 } | 187 } |
188 return true; | 188 return true; |
| 189 case kTexCoordSupport_GLSLFeature: |
| 190 if (!fGpu->glCaps().pathRenderingSupport()) { |
| 191 return false; |
| 192 } |
| 193 if (kGLES_GrGLStandard == fGpu->glStandard()) { |
| 194 this->addFSFeature(1 << kTexCoordSupport_GLSLFeature, |
| 195 "GL_CHROMIUM_path_rendering"); |
| 196 } |
| 197 return true; |
189 default: | 198 default: |
190 GrCrash("Unexpected GLSLFeature requested."); | 199 GrCrash("Unexpected GLSLFeature requested."); |
191 return false; | 200 return false; |
192 } | 201 } |
193 } | 202 } |
194 | 203 |
195 bool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) { | 204 bool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) { |
196 switch (feature) { | 205 switch (feature) { |
197 case kFragCoordConventions_GLSLPrivateFeature: | 206 case kFragCoordConventions_GLSLPrivateFeature: |
198 if (!fGpu->glCaps().fragCoordConventionsSupport()) { | 207 if (!fGpu->glCaps().fragCoordConventionsSupport()) { |
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 : INHERITED(gpu, uniformManager, desc) | 978 : INHERITED(gpu, uniformManager, desc) |
970 , fNumTexCoordSets(0) { | 979 , fNumTexCoordSets(0) { |
971 | 980 |
972 SkASSERT(!desc.getHeader().fHasVertexCode); | 981 SkASSERT(!desc.getHeader().fHasVertexCode); |
973 SkASSERT(gpu->glCaps().pathRenderingSupport()); | 982 SkASSERT(gpu->glCaps().pathRenderingSupport()); |
974 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); | 983 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); |
975 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); | 984 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); |
976 } | 985 } |
977 | 986 |
978 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { | 987 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { |
| 988 SkAssertResult(this->enableFeature(kTexCoordSupport_GLSLFeature)); |
979 int firstFreeCoordSet = fNumTexCoordSets; | 989 int firstFreeCoordSet = fNumTexCoordSets; |
980 fNumTexCoordSets += count; | 990 fNumTexCoordSets += count; |
981 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fNumTexCoordSets
); | 991 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fNumTexCoordSets
); |
982 return firstFreeCoordSet; | 992 return firstFreeCoordSet; |
983 } | 993 } |
984 | 994 |
985 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( | 995 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( |
986 const GrEffectStage* effectStages[], | 996 const GrEffectStage* effectStages[], |
987 const EffectKey effectKeys[], | 997 const EffectKey effectKeys[], |
988 int effectCnt, | 998 int effectCnt, |
989 GrGLSLExpr4* inOutFSColor) { | 999 GrGLSLExpr4* inOutFSColor) { |
990 | 1000 |
991 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, | 1001 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |
992 effectCnt); | 1002 effectCnt); |
993 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, | 1003 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |
994 effectStages, | 1004 effectStages, |
995 effectKeys, | 1005 effectKeys, |
996 effectCnt, | 1006 effectCnt, |
997 inOutFSColor); | 1007 inOutFSColor); |
998 return pathTexGenEffectsBuilder.finish(); | 1008 return pathTexGenEffectsBuilder.finish(); |
999 } | 1009 } |
| 1010 |
| 1011 bool GrGLFragmentOnlyShaderBuilder::compileAndAttachShaders(GrGLuint programId,
SkTDArray<GrGLuint>* shaderIds) const { |
| 1012 // Command buffer does not support vertexshader-less programs. |
| 1013 // Use a dummy shader. |
| 1014 const GrGLContext& glCtx = this->gpu()->glContext(); |
| 1015 SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); |
| 1016 vertShaderSrc.append("void main() {\n"); |
| 1017 vertShaderSrc.append("gl_Position = vec4(1);"); |
| 1018 vertShaderSrc.append("}\n"); |
| 1019 GrGLuint vertShaderId = attach_shader(glCtx, programId, GR_GL_VERTEX_SHADER,
vertShaderSrc); |
| 1020 if (!vertShaderId) { |
| 1021 return false; |
| 1022 } |
| 1023 *shaderIds->append() = vertShaderId; |
| 1024 |
| 1025 return this->INHERITED::compileAndAttachShaders(programId, shaderIds); |
| 1026 } |
| 1027 |
OLD | NEW |