| 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 SkAutoTDelete<GrGLShaderBuilder> builder; |
| 98 if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing(
)) { | 99 if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing(
)) { |
| 99 GrGLFullShaderBuilder fullBuilder(gpu, uman, desc); | 100 builder.reset(SkNEW_ARGS(GrGLFullShaderBuilder, (gpu, uman, desc))); |
| 100 if (fullBuilder.genProgram(inColorStages, inCoverageStages, output)) { | |
| 101 output->fHasVS = true; | |
| 102 output->fUniformHandles.fViewMatrixUni = fullBuilder.getViewMatrixUn
iform(); | |
| 103 output->fUniformHandles.fRTAdjustmentUni = fullBuilder.getRTAdjustme
ntVecUniform(); | |
| 104 return true; | |
| 105 } | |
| 106 } else { | 101 } else { |
| 107 GrGLFragmentOnlyShaderBuilder fragmentOnlyBuilder(gpu, uman, desc); | 102 builder.reset(SkNEW_ARGS(GrGLFragmentOnlyShaderBuilder, (gpu, uman, desc
))); |
| 108 if (fragmentOnlyBuilder.genProgram(inColorStages, inCoverageStages, outp
ut)) { | 103 } |
| 109 output->fHasVS = false; | 104 if (builder->genProgram(inColorStages, inCoverageStages)) { |
| 110 output->fNumTexCoordSets = fragmentOnlyBuilder.getNumTexCoordSets(); | 105 *output = builder->getOutput(); |
| 111 return true; | 106 return true; |
| 112 } | |
| 113 } | 107 } |
| 114 return false; | 108 return false; |
| 115 } | 109 } |
| 116 | 110 |
| 117 bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[], | 111 bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[], |
| 118 const GrEffectStage* coverageStages[], | 112 const GrEffectStage* coverageStages[]) { |
| 119 GenProgramOutput* output) { | |
| 120 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); | 113 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
| 121 | 114 |
| 122 // incoming color to current stage being processed. | 115 // incoming color to current stage being processed. |
| 123 GrGLSLExpr4 inColor = this->getInputColor(); | 116 GrGLSLExpr4 inColor = this->getInputColor(); |
| 124 | 117 |
| 125 output->fColorEffects = | 118 fOutput.fColorEffects = |
| 126 this->createAndEmitEffects(colorStages, | 119 this->createAndEmitEffects(colorStages, |
| 127 this->desc().getEffectKeys(), | 120 this->desc().getEffectKeys(), |
| 128 this->desc().numColorEffects(), | 121 this->desc().numColorEffects(), |
| 129 &inColor); | 122 &inColor); |
| 130 | 123 |
| 131 /////////////////////////////////////////////////////////////////////////// | 124 /////////////////////////////////////////////////////////////////////////// |
| 132 // compute the partial coverage | 125 // compute the partial coverage |
| 133 GrGLSLExpr4 inCoverage = this->getInputCoverage(); | 126 GrGLSLExpr4 inCoverage = this->getInputCoverage(); |
| 134 | 127 |
| 135 output->fCoverageEffects = | 128 fOutput.fCoverageEffects = |
| 136 this->createAndEmitEffects(coverageStages, | 129 this->createAndEmitEffects(coverageStages, |
| 137 this->desc().getEffectKeys() + this->desc().
numColorEffects(), | 130 this->desc().getEffectKeys() + this->desc().
numColorEffects(), |
| 138 this->desc().numCoverageEffects(), | 131 this->desc().numCoverageEffects(), |
| 139 &inCoverage); | 132 &inCoverage); |
| 140 | 133 |
| 141 if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutpu
t)) { | 134 if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutpu
t)) { |
| 142 const char* secondaryOutputName = this->enableSecondaryOutput(); | 135 const char* secondaryOutputName = this->enableSecondaryOutput(); |
| 143 | 136 |
| 144 // default coeff to ones for kCoverage_DualSrcOutput | 137 // default coeff to ones for kCoverage_DualSrcOutput |
| 145 GrGLSLExpr4 coeff(1); | 138 GrGLSLExpr4 coeff(1); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 163 // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do
so. | 156 // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do
so. |
| 164 if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutpu
t) { | 157 if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutpu
t) { |
| 165 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inCoverage; | 158 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inCoverage; |
| 166 | 159 |
| 167 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstColor()); | 160 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstColor()); |
| 168 | 161 |
| 169 fragColor = fragColor + dstContribution; | 162 fragColor = fragColor + dstContribution; |
| 170 } | 163 } |
| 171 this->fsCodeAppendf("\t%s = %s;\n", this->getColorOutputName(), fragColor.c_
str()); | 164 this->fsCodeAppendf("\t%s = %s;\n", this->getColorOutputName(), fragColor.c_
str()); |
| 172 | 165 |
| 173 if (!this->finish(&output->fProgramID)) { | 166 if (!this->finish()) { |
| 174 return false; | 167 return false; |
| 175 } | 168 } |
| 176 | 169 |
| 177 output->fUniformHandles.fRTHeightUni = fRTHeightUniform; | |
| 178 output->fUniformHandles.fColorUni = fColorUniform; | |
| 179 output->fUniformHandles.fCoverageUni = fCoverageUniform; | |
| 180 output->fUniformHandles.fDstCopyTopLeftUni = fDstCopyTopLeftUniform; | |
| 181 output->fUniformHandles.fDstCopyScaleUni = fDstCopyScaleUniform; | |
| 182 output->fUniformHandles.fDstCopySamplerUni = fDstCopySamplerUniform; | |
| 183 | |
| 184 return true; | 170 return true; |
| 185 } | 171 } |
| 186 | 172 |
| 187 ////////////////////////////////////////////////////////////////////////////// | 173 ////////////////////////////////////////////////////////////////////////////// |
| 188 | 174 |
| 189 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, | 175 GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
| 190 GrGLUniformManager* uniformManager, | 176 GrGLUniformManager* uniformManager, |
| 191 const GrGLProgramDesc& desc) | 177 const GrGLProgramDesc& desc) |
| 192 : fDesc(desc) | 178 : fDesc(desc) |
| 193 , fGpu(gpu) | 179 , fGpu(gpu) |
| 194 , fUniformManager(SkRef(uniformManager)) | 180 , fUniformManager(SkRef(uniformManager)) |
| 195 , fFSFeaturesAddedMask(0) | 181 , fFSFeaturesAddedMask(0) |
| 196 , fFSInputs(kVarsPerBlock) | 182 , fFSInputs(kVarsPerBlock) |
| 197 , fFSOutputs(kMaxFSOutputs) | 183 , fFSOutputs(kMaxFSOutputs) |
| 198 , fUniforms(kVarsPerBlock) | 184 , fUniforms(kVarsPerBlock) |
| 199 , fSetupFragPosition(false) | 185 , fSetupFragPosition(false) |
| 186 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) |
| 200 , fHasCustomColorOutput(false) | 187 , fHasCustomColorOutput(false) |
| 201 , fHasSecondaryOutput(false) | 188 , fHasSecondaryOutput(false) { |
| 202 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr
agPosKey) { | |
| 203 | 189 |
| 204 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); | 190 const GrGLProgramDesc::KeyHeader& header = desc.getHeader(); |
| 205 | 191 |
| 206 // Emit code to read the dst copy textue if necessary. | 192 // Emit code to read the dst copy textue if necessary. |
| 207 if (kNoDstRead_DstReadKey != header.fDstReadKey && | 193 if (kNoDstRead_DstReadKey != header.fDstReadKey && |
| 208 GrGLCaps::kNone_FBFetchType == fGpu->glCaps().fbFetchType()) { | 194 GrGLCaps::kNone_FBFetchType == fGpu->glCaps().fbFetchType()) { |
| 209 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & header.fDstReadKe
y); | 195 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & header.fDstReadKe
y); |
| 210 const char* dstCopyTopLeftName; | 196 const char* dstCopyTopLeftName; |
| 211 const char* dstCopyCoordScaleName; | 197 const char* dstCopyCoordScaleName; |
| 198 const char* dstCopySamplerName; |
| 212 uint32_t configMask; | 199 uint32_t configMask; |
| 213 if (SkToBool(kUseAlphaConfig_DstReadKeyBit & header.fDstReadKey)) { | 200 if (SkToBool(kUseAlphaConfig_DstReadKeyBit & header.fDstReadKey)) { |
| 214 configMask = kA_GrColorComponentFlag; | 201 configMask = kA_GrColorComponentFlag; |
| 215 } else { | 202 } else { |
| 216 configMask = kRGBA_GrColorComponentFlags; | 203 configMask = kRGBA_GrColorComponentFlags; |
| 217 } | 204 } |
| 218 fDstCopySamplerUniform = this->addUniform(kFragment_Visibility, | 205 fOutput.fUniformHandles.fDstCopySamplerUni = |
| 219 kSampler2D_GrSLType, | 206 this->addUniform(kFragment_Visibility, kSampler2D_GrSLType, "DstCopy
Sampler", |
| 220 "DstCopySampler"); | 207 &dstCopySamplerName); |
| 221 fDstCopyTopLeftUniform = this->addUniform(kFragment_Visibility, | 208 fOutput.fUniformHandles.fDstCopyTopLeftUni = |
| 222 kVec2f_GrSLType, | 209 this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyUppe
rLeft", |
| 223 "DstCopyUpperLeft", | 210 &dstCopyTopLeftName); |
| 224 &dstCopyTopLeftName); | 211 fOutput.fUniformHandles.fDstCopyScaleUni = |
| 225 fDstCopyScaleUniform = this->addUniform(kFragment_Visibility, | 212 this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyCoor
dScale", |
| 226 kVec2f_GrSLType, | 213 &dstCopyCoordScaleName); |
| 227 "DstCopyCoordScale", | |
| 228 &dstCopyCoordScaleName); | |
| 229 const char* fragPos = this->fragmentPosition(); | 214 const char* fragPos = this->fragmentPosition(); |
| 230 this->fsCodeAppend("\t// Read color from copy of the destination.\n"); | 215 this->fsCodeAppend("\t// Read color from copy of the destination.\n"); |
| 231 this->fsCodeAppendf("\tvec2 _dstTexCoord = (%s.xy - %s) * %s;\n", | 216 this->fsCodeAppendf("\tvec2 _dstTexCoord = (%s.xy - %s) * %s;\n", |
| 232 fragPos, dstCopyTopLeftName, dstCopyCoordScaleName); | 217 fragPos, dstCopyTopLeftName, dstCopyCoordScaleName); |
| 233 if (!topDown) { | 218 if (!topDown) { |
| 234 this->fsCodeAppend("\t_dstTexCoord.y = 1.0 - _dstTexCoord.y;\n"); | 219 this->fsCodeAppend("\t_dstTexCoord.y = 1.0 - _dstTexCoord.y;\n"); |
| 235 } | 220 } |
| 236 this->fsCodeAppendf("\tvec4 %s = ", kDstCopyColorName); | 221 this->fsCodeAppendf("\tvec4 %s = ", kDstCopyColorName); |
| 237 append_texture_lookup(&fFSCode, | 222 append_texture_lookup(&fFSCode, |
| 238 fGpu, | 223 fGpu, |
| 239 this->getUniformCStr(fDstCopySamplerUniform), | 224 dstCopySamplerName, |
| 240 "_dstTexCoord", | 225 "_dstTexCoord", |
| 241 configMask, | 226 configMask, |
| 242 "rgba"); | 227 "rgba"); |
| 243 this->fsCodeAppend(";\n\n"); | 228 this->fsCodeAppend(";\n\n"); |
| 244 } | 229 } |
| 245 | 230 |
| 246 if (GrGLProgramDesc::kUniform_ColorInput == header.fColorInput) { | 231 if (GrGLProgramDesc::kUniform_ColorInput == header.fColorInput) { |
| 247 const char* name; | 232 const char* name; |
| 248 fColorUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibility
, | 233 fOutput.fUniformHandles.fColorUni = |
| 249 kVec4f_GrSLType, "Color", &name); | 234 this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrS
LType, "Color", |
| 235 &name); |
| 250 fInputColor = GrGLSLExpr4(name); | 236 fInputColor = GrGLSLExpr4(name); |
| 251 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fColorInput) { | 237 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fColorInput) { |
| 252 fInputColor = GrGLSLExpr4(1); | 238 fInputColor = GrGLSLExpr4(1); |
| 253 } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fColorInput) { | 239 } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fColorInput) { |
| 254 fInputColor = GrGLSLExpr4(0); | 240 fInputColor = GrGLSLExpr4(0); |
| 255 } | 241 } |
| 256 | 242 |
| 257 if (GrGLProgramDesc::kUniform_ColorInput == header.fCoverageInput) { | 243 if (GrGLProgramDesc::kUniform_ColorInput == header.fCoverageInput) { |
| 258 const char* name; | 244 const char* name; |
| 259 fCoverageUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibil
ity, | 245 fOutput.fUniformHandles.fCoverageUni = |
| 260 kVec4f_GrSLType, "Coverage", &name); | 246 this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrS
LType, "Coverage", |
| 247 &name); |
| 261 fInputCoverage = GrGLSLExpr4(name); | 248 fInputCoverage = GrGLSLExpr4(name); |
| 262 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fCoverageInput)
{ | 249 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fCoverageInput)
{ |
| 263 fInputCoverage = GrGLSLExpr4(1); | 250 fInputCoverage = GrGLSLExpr4(1); |
| 264 } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fCoverageInput)
{ | 251 } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fCoverageInput)
{ |
| 265 fInputCoverage = GrGLSLExpr4(0); | 252 fInputCoverage = GrGLSLExpr4(0); |
| 266 } | 253 } |
| 267 | 254 |
| 268 if (k110_GrGLSLGeneration != fGpu->glslGeneration()) { | 255 if (k110_GrGLSLGeneration != fGpu->glslGeneration()) { |
| 269 fFSOutputs.push_back().set(kVec4f_GrSLType, | 256 fFSOutputs.push_back().set(kVec4f_GrSLType, |
| 270 GrGLShaderVar::kOut_TypeModifier, | 257 GrGLShaderVar::kOut_TypeModifier, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 } | 340 } |
| 354 } | 341 } |
| 355 static const char kFBFetchColorName[] = "gl_LastFragData[0]"; | 342 static const char kFBFetchColorName[] = "gl_LastFragData[0]"; |
| 356 GrGLCaps::FBFetchType fetchType = fGpu->glCaps().fbFetchType(); | 343 GrGLCaps::FBFetchType fetchType = fGpu->glCaps().fbFetchType(); |
| 357 if (GrGLCaps::kEXT_FBFetchType == fetchType) { | 344 if (GrGLCaps::kEXT_FBFetchType == fetchType) { |
| 358 SkAssertResult(this->enablePrivateFeature(kEXTShaderFramebufferFetch_GLS
LPrivateFeature)); | 345 SkAssertResult(this->enablePrivateFeature(kEXTShaderFramebufferFetch_GLS
LPrivateFeature)); |
| 359 return kFBFetchColorName; | 346 return kFBFetchColorName; |
| 360 } else if (GrGLCaps::kNV_FBFetchType == fetchType) { | 347 } else if (GrGLCaps::kNV_FBFetchType == fetchType) { |
| 361 SkAssertResult(this->enablePrivateFeature(kNVShaderFramebufferFetch_GLSL
PrivateFeature)); | 348 SkAssertResult(this->enablePrivateFeature(kNVShaderFramebufferFetch_GLSL
PrivateFeature)); |
| 362 return kFBFetchColorName; | 349 return kFBFetchColorName; |
| 363 } else if (fDstCopySamplerUniform.isValid()) { | 350 } else if (fOutput.fUniformHandles.fDstCopySamplerUni.isValid()) { |
| 364 return kDstCopyColorName; | 351 return kDstCopyColorName; |
| 365 } else { | 352 } else { |
| 366 return ""; | 353 return ""; |
| 367 } | 354 } |
| 368 } | 355 } |
| 369 | 356 |
| 370 void GrGLShaderBuilder::appendTextureLookup(SkString* out, | 357 void GrGLShaderBuilder::appendTextureLookup(SkString* out, |
| 371 const GrGLShaderBuilder::TextureSamp
ler& sampler, | 358 const GrGLShaderBuilder::TextureSamp
ler& sampler, |
| 372 const char* coordName, | 359 const char* coordName, |
| 373 GrSLType varyingType) const { | 360 GrSLType varyingType) const { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 GrGLShaderVar::kUpperLeft_Origin); | 505 GrGLShaderVar::kUpperLeft_Origin); |
| 519 fSetupFragPosition = true; | 506 fSetupFragPosition = true; |
| 520 } | 507 } |
| 521 return "gl_FragCoord"; | 508 return "gl_FragCoord"; |
| 522 } else { | 509 } else { |
| 523 static const char* kCoordName = "fragCoordYDown"; | 510 static const char* kCoordName = "fragCoordYDown"; |
| 524 if (!fSetupFragPosition) { | 511 if (!fSetupFragPosition) { |
| 525 // temporarily change the stage index because we're inserting non-st
age code. | 512 // temporarily change the stage index because we're inserting non-st
age code. |
| 526 CodeStage::AutoStageRestore csar(&fCodeStage, NULL); | 513 CodeStage::AutoStageRestore csar(&fCodeStage, NULL); |
| 527 | 514 |
| 528 SkASSERT(!fRTHeightUniform.isValid()); | 515 SkASSERT(!fOutput.fUniformHandles.fRTHeightUni.isValid()); |
| 529 const char* rtHeightName; | 516 const char* rtHeightName; |
| 530 | 517 |
| 531 fRTHeightUniform = this->addUniform(kFragment_Visibility, | 518 fOutput.fUniformHandles.fRTHeightUni = |
| 532 kFloat_GrSLType, | 519 this->addUniform(kFragment_Visibility, kFloat_GrSLType, "RTHeigh
t", &rtHeightName); |
| 533 "RTHeight", | |
| 534 &rtHeightName); | |
| 535 | 520 |
| 536 this->fFSCode.prependf("\tvec4 %s = vec4(gl_FragCoord.x, %s - gl_Fra
gCoord.y, gl_FragCoord.zw);\n", | 521 this->fFSCode.prependf("\tvec4 %s = vec4(gl_FragCoord.x, %s - gl_Fra
gCoord.y, gl_FragCoord.zw);\n", |
| 537 kCoordName, rtHeightName); | 522 kCoordName, rtHeightName); |
| 538 fSetupFragPosition = true; | 523 fSetupFragPosition = true; |
| 539 } | 524 } |
| 540 SkASSERT(fRTHeightUniform.isValid()); | 525 SkASSERT(fOutput.fUniformHandles.fRTHeightUni.isValid()); |
| 541 return kCoordName; | 526 return kCoordName; |
| 542 } | 527 } |
| 543 } | 528 } |
| 544 | 529 |
| 545 void GrGLShaderBuilder::fsEmitFunction(GrSLType returnType, | 530 void GrGLShaderBuilder::fsEmitFunction(GrSLType returnType, |
| 546 const char* name, | 531 const char* name, |
| 547 int argCnt, | 532 int argCnt, |
| 548 const GrGLShaderVar* args, | 533 const GrGLShaderVar* args, |
| 549 const char* body, | 534 const char* body, |
| 550 SkString* outName) { | 535 SkString* outName) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 const char* GrGLShaderBuilder::enableSecondaryOutput() { | 645 const char* GrGLShaderBuilder::enableSecondaryOutput() { |
| 661 if (!fHasSecondaryOutput) { | 646 if (!fHasSecondaryOutput) { |
| 662 fFSOutputs.push_back().set(kVec4f_GrSLType, | 647 fFSOutputs.push_back().set(kVec4f_GrSLType, |
| 663 GrGLShaderVar::kOut_TypeModifier, | 648 GrGLShaderVar::kOut_TypeModifier, |
| 664 dual_source_output_name()); | 649 dual_source_output_name()); |
| 665 fHasSecondaryOutput = true; | 650 fHasSecondaryOutput = true; |
| 666 } | 651 } |
| 667 return dual_source_output_name(); | 652 return dual_source_output_name(); |
| 668 } | 653 } |
| 669 | 654 |
| 670 bool GrGLShaderBuilder::finish(GrGLuint* outProgramId) { | 655 bool GrGLShaderBuilder::finish() { |
| 671 GrGLuint programId = 0; | 656 SkASSERT(0 == fOutput.fProgramID); |
| 672 GL_CALL_RET(programId, CreateProgram()); | 657 GL_CALL_RET(fOutput.fProgramID, CreateProgram()); |
| 673 if (!programId) { | 658 if (!fOutput.fProgramID) { |
| 674 return false; | 659 return false; |
| 675 } | 660 } |
| 676 | 661 |
| 677 SkTDArray<GrGLuint> shadersToDelete; | 662 SkTDArray<GrGLuint> shadersToDelete; |
| 678 | 663 |
| 679 if (!this->compileAndAttachShaders(programId, &shadersToDelete)) { | 664 if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) { |
| 680 GL_CALL(DeleteProgram(programId)); | 665 GL_CALL(DeleteProgram(fOutput.fProgramID)); |
| 681 return false; | 666 return false; |
| 682 } | 667 } |
| 683 | 668 |
| 684 this->bindProgramLocations(programId); | 669 this->bindProgramLocations(fOutput.fProgramID); |
| 685 if (fUniformManager->isUsingBindUniform()) { | 670 if (fUniformManager->isUsingBindUniform()) { |
| 686 fUniformManager->getUniformLocations(programId, fUniforms); | 671 fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); |
| 687 } | 672 } |
| 688 | 673 |
| 689 GL_CALL(LinkProgram(programId)); | 674 GL_CALL(LinkProgram(fOutput.fProgramID)); |
| 690 | 675 |
| 691 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. | 676 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. |
| 692 bool checkLinked = !fGpu->ctxInfo().isChromium(); | 677 bool checkLinked = !fGpu->ctxInfo().isChromium(); |
| 693 #ifdef SK_DEBUG | 678 #ifdef SK_DEBUG |
| 694 checkLinked = true; | 679 checkLinked = true; |
| 695 #endif | 680 #endif |
| 696 if (checkLinked) { | 681 if (checkLinked) { |
| 697 GrGLint linked = GR_GL_INIT_ZERO; | 682 GrGLint linked = GR_GL_INIT_ZERO; |
| 698 GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked)); | 683 GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_LINK_STATUS, &linked)); |
| 699 if (!linked) { | 684 if (!linked) { |
| 700 GrGLint infoLen = GR_GL_INIT_ZERO; | 685 GrGLint infoLen = GR_GL_INIT_ZERO; |
| 701 GL_CALL(GetProgramiv(programId, GR_GL_INFO_LOG_LENGTH, &infoLen)); | 686 GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_INFO_LOG_LENGTH, &inf
oLen)); |
| 702 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debug
ger | 687 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debug
ger |
| 703 if (infoLen > 0) { | 688 if (infoLen > 0) { |
| 704 // retrieve length even though we don't need it to workaround | 689 // retrieve length even though we don't need it to workaround |
| 705 // bug in chrome cmd buffer param validation. | 690 // bug in chrome cmd buffer param validation. |
| 706 GrGLsizei length = GR_GL_INIT_ZERO; | 691 GrGLsizei length = GR_GL_INIT_ZERO; |
| 707 GL_CALL(GetProgramInfoLog(programId, | 692 GL_CALL(GetProgramInfoLog(fOutput.fProgramID, |
| 708 infoLen+1, | 693 infoLen+1, |
| 709 &length, | 694 &length, |
| 710 (char*)log.get())); | 695 (char*)log.get())); |
| 711 GrPrintf((char*)log.get()); | 696 GrPrintf((char*)log.get()); |
| 712 } | 697 } |
| 713 SkDEBUGFAIL("Error linking program"); | 698 SkDEBUGFAIL("Error linking program"); |
| 714 GL_CALL(DeleteProgram(programId)); | 699 GL_CALL(DeleteProgram(fOutput.fProgramID)); |
| 700 fOutput.fProgramID = 0; |
| 715 return false; | 701 return false; |
| 716 } | 702 } |
| 717 } | 703 } |
| 718 | 704 |
| 719 if (!fUniformManager->isUsingBindUniform()) { | 705 if (!fUniformManager->isUsingBindUniform()) { |
| 720 fUniformManager->getUniformLocations(programId, fUniforms); | 706 fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); |
| 721 } | 707 } |
| 722 | 708 |
| 723 for (int i = 0; i < shadersToDelete.count(); ++i) { | 709 for (int i = 0; i < shadersToDelete.count(); ++i) { |
| 724 GL_CALL(DeleteShader(shadersToDelete[i])); | 710 GL_CALL(DeleteShader(shadersToDelete[i])); |
| 725 } | 711 } |
| 726 | 712 |
| 727 *outProgramId = programId; | |
| 728 return true; | 713 return true; |
| 729 } | 714 } |
| 730 | 715 |
| 731 // Compiles a GL shader and attaches it to a program. Returns the shader ID if | 716 // Compiles a GL shader and attaches it to a program. Returns the shader ID if |
| 732 // successful, or 0 if not. | 717 // successful, or 0 if not. |
| 733 static GrGLuint attach_shader(const GrGLContext& glCtx, | 718 static GrGLuint attach_shader(const GrGLContext& glCtx, |
| 734 GrGLuint programId, | 719 GrGLuint programId, |
| 735 GrGLenum type, | 720 GrGLenum type, |
| 736 const SkString& shaderSrc) { | 721 const SkString& shaderSrc) { |
| 737 const GrGLInterface* gli = glCtx.interface(); | 722 const GrGLInterface* gli = glCtx.interface(); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 GrGLUniformManager* uniformManager, | 818 GrGLUniformManager* uniformManager, |
| 834 const GrGLProgramDesc& desc) | 819 const GrGLProgramDesc& desc) |
| 835 : INHERITED(gpu, uniformManager, desc) | 820 : INHERITED(gpu, uniformManager, desc) |
| 836 , fVSAttrs(kVarsPerBlock) | 821 , fVSAttrs(kVarsPerBlock) |
| 837 , fVSOutputs(kVarsPerBlock) | 822 , fVSOutputs(kVarsPerBlock) |
| 838 , fGSInputs(kVarsPerBlock) | 823 , fGSInputs(kVarsPerBlock) |
| 839 , fGSOutputs(kVarsPerBlock) { | 824 , fGSOutputs(kVarsPerBlock) { |
| 840 | 825 |
| 841 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); | 826 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
| 842 | 827 |
| 828 fOutput.fHasVertexShader = true; |
| 829 |
| 843 fPositionVar = &fVSAttrs.push_back(); | 830 fPositionVar = &fVSAttrs.push_back(); |
| 844 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "
aPosition"); | 831 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "
aPosition"); |
| 845 if (-1 != header.fLocalCoordAttributeIndex) { | 832 if (-1 != header.fLocalCoordAttributeIndex) { |
| 846 fLocalCoordsVar = &fVSAttrs.push_back(); | 833 fLocalCoordsVar = &fVSAttrs.push_back(); |
| 847 fLocalCoordsVar->set(kVec2f_GrSLType, | 834 fLocalCoordsVar->set(kVec2f_GrSLType, |
| 848 GrGLShaderVar::kAttribute_TypeModifier, | 835 GrGLShaderVar::kAttribute_TypeModifier, |
| 849 "aLocalCoords"); | 836 "aLocalCoords"); |
| 850 } else { | 837 } else { |
| 851 fLocalCoordsVar = fPositionVar; | 838 fLocalCoordsVar = fPositionVar; |
| 852 } | 839 } |
| 853 | 840 |
| 854 const char* viewMName; | 841 const char* viewMName; |
| 855 fViewMatrixUniform = this->addUniform(GrGLShaderBuilder::kVertex_Visibility, | 842 fOutput.fUniformHandles.fViewMatrixUni = |
| 856 kMat33f_GrSLType, "ViewM", &viewMName)
; | 843 this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kMat33f_GrSLType
, "ViewM", |
| 844 &viewMName); |
| 857 const char* rtAdjustName; | 845 const char* rtAdjustName; |
| 858 fRTAdustmentVecUniform = this->addUniform(GrGLShaderBuilder::kVertex_Visibil
ity, | 846 fOutput.fUniformHandles.fRTAdjustmentUni = |
| 859 kVec4f_GrSLType, "rtAdjustment", &
rtAdjustName); | 847 this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kVec4f_GrSLType,
"rtAdjustment", |
| 848 &rtAdjustName); |
| 860 | 849 |
| 861 // Transform the position into Skia's device coords. | 850 // Transform the position into Skia's device coords. |
| 862 this->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n", | 851 this->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n", |
| 863 viewMName, fPositionVar->c_str()); | 852 viewMName, fPositionVar->c_str()); |
| 864 | 853 |
| 865 // Transform from Skia's device coords to GL's normalized device coords. | 854 // Transform from Skia's device coords to GL's normalized device coords. |
| 866 this->vsCodeAppendf( | 855 this->vsCodeAppendf( |
| 867 "\tgl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.
z);\n", | 856 "\tgl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.
z);\n", |
| 868 rtAdjustName, rtAdjustName); | 857 rtAdjustName, rtAdjustName); |
| 869 | 858 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { | 1054 for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attr
ibEnd; ++attrib) { |
| 1066 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); | 1055 GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_s
tr())); |
| 1067 } | 1056 } |
| 1068 } | 1057 } |
| 1069 | 1058 |
| 1070 //////////////////////////////////////////////////////////////////////////////// | 1059 //////////////////////////////////////////////////////////////////////////////// |
| 1071 | 1060 |
| 1072 GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu, | 1061 GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu, |
| 1073 GrGLUniformManager*
uniformManager, | 1062 GrGLUniformManager*
uniformManager, |
| 1074 const GrGLProgramDe
sc& desc) | 1063 const GrGLProgramDe
sc& desc) |
| 1075 : INHERITED(gpu, uniformManager, desc) | 1064 : INHERITED(gpu, uniformManager, desc) { |
| 1076 , fNumTexCoordSets(0) { | |
| 1077 | 1065 |
| 1078 SkASSERT(!desc.getHeader().fHasVertexCode); | 1066 SkASSERT(!desc.getHeader().fHasVertexCode); |
| 1079 SkASSERT(gpu->glCaps().pathRenderingSupport()); | 1067 SkASSERT(gpu->glCaps().pathRenderingSupport()); |
| 1080 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); | 1068 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
put); |
| 1081 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); | 1069 SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
eInput); |
| 1082 } | 1070 } |
| 1083 | 1071 |
| 1084 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { | 1072 int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { |
| 1085 int firstFreeCoordSet = fNumTexCoordSets; | 1073 int firstFreeCoordSet = fOutput.fTexCoordSetCnt; |
| 1086 fNumTexCoordSets += count; | 1074 fOutput.fTexCoordSetCnt += count; |
| 1087 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fNumTexCoordSets
); | 1075 SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fOutput.fTexCoor
dSetCnt); |
| 1088 return firstFreeCoordSet; | 1076 return firstFreeCoordSet; |
| 1089 } | 1077 } |
| 1090 | 1078 |
| 1091 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( | 1079 GrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( |
| 1092 const GrEffectStage* effectStages[], | 1080 const GrEffectStage* effectStages[], |
| 1093 const EffectKey effectKeys[], | 1081 const EffectKey effectKeys[], |
| 1094 int effectCnt, | 1082 int effectCnt, |
| 1095 GrGLSLExpr4* inOutFSColor) { | 1083 GrGLSLExpr4* inOutFSColor) { |
| 1096 | 1084 |
| 1097 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, | 1085 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |
| 1098 effectCnt); | 1086 effectCnt); |
| 1099 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, | 1087 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |
| 1100 effectStages, | 1088 effectStages, |
| 1101 effectKeys, | 1089 effectKeys, |
| 1102 effectCnt, | 1090 effectCnt, |
| 1103 inOutFSColor); | 1091 inOutFSColor); |
| 1104 return pathTexGenEffectsBuilder.finish(); | 1092 return pathTexGenEffectsBuilder.finish(); |
| 1105 } | 1093 } |
| OLD | NEW |