Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrGLFragmentShaderBuilder.h" | 8 #include "GrGLFragmentShaderBuilder.h" |
| 9 #include "GrGLShaderStringBuilder.h" | 9 #include "GrGLShaderStringBuilder.h" |
| 10 #include "GrGLProgramBuilder.h" | 10 #include "GrGLProgramBuilder.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program , | 71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program , |
| 72 const GrGLProgramDesc& desc ) | 72 const GrGLProgramDesc& desc ) |
| 73 : INHERITED(program) | 73 : INHERITED(program) |
| 74 , fHasCustomColorOutput(false) | 74 , fHasCustomColorOutput(false) |
| 75 , fHasSecondaryOutput(false) | 75 , fHasSecondaryOutput(false) |
| 76 , fSetupFragPosition(false) | 76 , fSetupFragPosition(false) |
| 77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr agPosKey) | 77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr agPosKey) |
| 78 , fCustomColorOutputIndex(-1) | |
| 78 , fHasReadDstColor(false) | 79 , fHasReadDstColor(false) |
| 79 , fHasReadFragmentPosition(false) { | 80 , fHasReadFragmentPosition(false) { |
| 80 } | 81 } |
| 81 | 82 |
| 82 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { | 83 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { |
| 83 switch (feature) { | 84 switch (feature) { |
| 84 case kStandardDerivatives_GLSLFeature: { | 85 case kStandardDerivatives_GLSLFeature: { |
| 85 GrGpuGL* gpu = fProgramBuilder->gpu(); | 86 GrGpuGL* gpu = fProgramBuilder->gpu(); |
| 86 if (!gpu->glCaps().shaderDerivativeSupport()) { | 87 if (!gpu->glCaps().shaderDerivativeSupport()) { |
| 87 return false; | 88 return false; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 } | 166 } |
| 166 } | 167 } |
| 167 | 168 |
| 168 const char* GrGLFragmentShaderBuilder::dstColor() { | 169 const char* GrGLFragmentShaderBuilder::dstColor() { |
| 169 fHasReadDstColor = true; | 170 fHasReadDstColor = true; |
| 170 | 171 |
| 171 GrGpuGL* gpu = fProgramBuilder->gpu(); | 172 GrGpuGL* gpu = fProgramBuilder->gpu(); |
| 172 if (gpu->glCaps().fbFetchSupport()) { | 173 if (gpu->glCaps().fbFetchSupport()) { |
| 173 this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeatur e + 1), | 174 this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeatur e + 1), |
| 174 gpu->glCaps().fbFetchExtensionString()); | 175 gpu->glCaps().fbFetchExtensionString()); |
| 175 return gpu->glCaps().fbFetchColorName(); | 176 |
| 177 // On ES 3.0 we have to declare this, and use the custom color output na me | |
| 178 const char* fbFetchColorName = gpu->glCaps().fbFetchColorName(); | |
| 179 if (gpu->glslGeneration() >= k330_GrGLSLGeneration) { | |
| 180 if (-1 == fCustomColorOutputIndex) { | |
|
egdaniel
2014/10/21 18:22:06
do we need this if? Isn't it true that (-1 == fCus
joshualitt
2014/10/21 18:29:24
Acknowledged.
| |
| 181 this->enableCustomOutput(); | |
| 182 } | |
| 183 fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOu t_TypeModifier); | |
| 184 fbFetchColorName = declared_color_output_name(); | |
| 185 } | |
| 186 return fbFetchColorName; | |
| 176 } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) { | 187 } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) { |
| 177 return kDstCopyColorName; | 188 return kDstCopyColorName; |
| 178 } else { | 189 } else { |
| 179 return ""; | 190 return ""; |
| 180 } | 191 } |
| 181 } | 192 } |
| 182 | 193 |
| 183 void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() { | 194 void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() { |
| 184 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & fProgramBuilder->head er().fDstReadKey); | 195 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & fProgramBuilder->head er().fDstReadKey); |
| 185 const char* dstCopyTopLeftName; | 196 const char* dstCopyTopLeftName; |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 216 } | 227 } |
| 217 this->codeAppendf("vec4 %s = ", GrGLFragmentShaderBuilder::kDstCopyColorName ); | 228 this->codeAppendf("vec4 %s = ", GrGLFragmentShaderBuilder::kDstCopyColorName ); |
| 218 this->appendTextureLookup(dstCopySamplerName, | 229 this->appendTextureLookup(dstCopySamplerName, |
| 219 "_dstTexCoord", | 230 "_dstTexCoord", |
| 220 configMask, | 231 configMask, |
| 221 "rgba"); | 232 "rgba"); |
| 222 this->codeAppend(";"); | 233 this->codeAppend(";"); |
| 223 } | 234 } |
| 224 | 235 |
| 225 void GrGLFragmentShaderBuilder::enableCustomOutput() { | 236 void GrGLFragmentShaderBuilder::enableCustomOutput() { |
| 226 SkASSERT(!fHasCustomColorOutput); | 237 if (!fHasCustomColorOutput) { |
| 227 fHasCustomColorOutput = true; | 238 fHasCustomColorOutput = true; |
| 228 fOutputs.push_back().set(kVec4f_GrSLType, | 239 fCustomColorOutputIndex = fOutputs.count(); |
| 229 GrGLShaderVar::kOut_TypeModifier, | 240 fOutputs.push_back().set(kVec4f_GrSLType, |
| 230 declared_color_output_name()); | 241 GrGLShaderVar::kOut_TypeModifier, |
| 242 declared_color_output_name()); | |
| 243 } | |
| 231 } | 244 } |
| 232 | 245 |
| 233 void GrGLFragmentShaderBuilder::enableSecondaryOutput() { | 246 void GrGLFragmentShaderBuilder::enableSecondaryOutput() { |
| 234 SkASSERT(!fHasSecondaryOutput); | 247 SkASSERT(!fHasSecondaryOutput); |
| 235 fHasSecondaryOutput = true; | 248 fHasSecondaryOutput = true; |
| 236 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifier, | 249 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifier, |
| 237 dual_source_output_name()); | 250 dual_source_output_name()); |
| 238 } | 251 } |
| 239 | 252 |
| 240 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { | 253 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 | 350 |
| 338 void GrGLFragmentShaderBuilder::addVarying(GrSLType type, | 351 void GrGLFragmentShaderBuilder::addVarying(GrSLType type, |
| 339 const char* name, | 352 const char* name, |
| 340 const char** fsInName, | 353 const char** fsInName, |
| 341 GrGLShaderVar::Precision fsPrecision) { | 354 GrGLShaderVar::Precision fsPrecision) { |
| 342 fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision); | 355 fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision); |
| 343 if (fsInName) { | 356 if (fsInName) { |
| 344 *fsInName = name; | 357 *fsInName = name; |
| 345 } | 358 } |
| 346 } | 359 } |
| OLD | NEW |