| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 , fUniformManager(uniformManager) | 105 , fUniformManager(uniformManager) |
| 106 , fFSFeaturesAddedMask(0) | 106 , fFSFeaturesAddedMask(0) |
| 107 #if GR_GL_EXPERIMENTAL_GS | 107 #if GR_GL_EXPERIMENTAL_GS |
| 108 , fUsesGS(desc.fExperimentalGS) | 108 , fUsesGS(desc.fExperimentalGS) |
| 109 #else | 109 #else |
| 110 , fUsesGS(false) | 110 , fUsesGS(false) |
| 111 #endif | 111 #endif |
| 112 , fSetupFragPosition(false) | 112 , fSetupFragPosition(false) |
| 113 , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle) | 113 , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle) |
| 114 , fDstCopyTopLeftUniform (GrGLUniformManager::kInvalidUniformHandle) | 114 , fDstCopyTopLeftUniform (GrGLUniformManager::kInvalidUniformHandle) |
| 115 , fDstCopyScaleUniform (GrGLUniformManager::kInvalidUniformHandle) { | 115 , fDstCopyScaleUniform (GrGLUniformManager::kInvalidUniformHandle) |
| 116 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.fFragPosKey) { |
| 116 | 117 |
| 117 fPositionVar = &fVSAttrs.push_back(); | 118 fPositionVar = &fVSAttrs.push_back(); |
| 118 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "
aPosition"); | 119 fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "
aPosition"); |
| 119 if (-1 != desc.fLocalCoordAttributeIndex) { | 120 if (-1 != desc.fLocalCoordAttributeIndex) { |
| 120 fLocalCoordsVar = &fVSAttrs.push_back(); | 121 fLocalCoordsVar = &fVSAttrs.push_back(); |
| 121 fLocalCoordsVar->set(kVec2f_GrSLType, | 122 fLocalCoordsVar->set(kVec2f_GrSLType, |
| 122 GrGLShaderVar::kAttribute_TypeModifier, | 123 GrGLShaderVar::kAttribute_TypeModifier, |
| 123 "aLocalCoords"); | 124 "aLocalCoords"); |
| 124 } else { | 125 } else { |
| 125 fLocalCoordsVar = fPositionVar; | 126 fLocalCoordsVar = fPositionVar; |
| 126 } | 127 } |
| 127 // Emit code to read the dst copy textue if necessary. | 128 // Emit code to read the dst copy textue if necessary. |
| 128 if (kNoDstRead_DstReadKey != desc.fDstRead && | 129 if (kNoDstRead_DstReadKey != desc.fDstReadKey && |
| 129 GrGLCaps::kNone_FBFetchType == ctxInfo.caps()->fbFetchType()) { | 130 GrGLCaps::kNone_FBFetchType == ctxInfo.caps()->fbFetchType()) { |
| 130 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & desc.fDstRead); | 131 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & desc.fDstReadKey)
; |
| 131 const char* dstCopyTopLeftName; | 132 const char* dstCopyTopLeftName; |
| 132 const char* dstCopyCoordScaleName; | 133 const char* dstCopyCoordScaleName; |
| 133 uint32_t configMask; | 134 uint32_t configMask; |
| 134 if (SkToBool(kUseAlphaConfig_DstReadKeyBit & desc.fDstRead)) { | 135 if (SkToBool(kUseAlphaConfig_DstReadKeyBit & desc.fDstReadKey)) { |
| 135 configMask = kA_GrColorComponentFlag; | 136 configMask = kA_GrColorComponentFlag; |
| 136 } else { | 137 } else { |
| 137 configMask = kRGBA_GrColorComponentFlags; | 138 configMask = kRGBA_GrColorComponentFlags; |
| 138 } | 139 } |
| 139 fDstCopySampler.init(this, configMask, "rgba", 0); | 140 fDstCopySampler.init(this, configMask, "rgba", 0); |
| 140 | 141 |
| 141 fDstCopyTopLeftUniform = this->addUniform(kFragment_ShaderType, | 142 fDstCopyTopLeftUniform = this->addUniform(kFragment_ShaderType, |
| 142 kVec2f_GrSLType, | 143 kVec2f_GrSLType, |
| 143 "DstCopyUpperLeft", | 144 "DstCopyUpperLeft", |
| 144 &dstCopyTopLeftName); | 145 &dstCopyTopLeftName); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 // The fact that the config is alpha-only must be considered when genera
ting code. | 345 // The fact that the config is alpha-only must be considered when genera
ting code. |
| 345 key |= kUseAlphaConfig_DstReadKeyBit; | 346 key |= kUseAlphaConfig_DstReadKeyBit; |
| 346 } | 347 } |
| 347 if (kTopLeft_GrSurfaceOrigin == dstCopy->origin()) { | 348 if (kTopLeft_GrSurfaceOrigin == dstCopy->origin()) { |
| 348 key |= kTopLeftOrigin_DstReadKeyBit; | 349 key |= kTopLeftOrigin_DstReadKeyBit; |
| 349 } | 350 } |
| 350 GrAssert(static_cast<DstReadKey>(key) == key); | 351 GrAssert(static_cast<DstReadKey>(key) == key); |
| 351 return static_cast<DstReadKey>(key); | 352 return static_cast<DstReadKey>(key); |
| 352 } | 353 } |
| 353 | 354 |
| 355 GrGLShaderBuilder::FragPosKey GrGLShaderBuilder::KeyForFragmentPosition(const Gr
RenderTarget* dst, |
| 356 const Gr
GLCaps&) { |
| 357 if (kTopLeft_GrSurfaceOrigin == dst->origin()) { |
| 358 return kTopLeftFragPosRead_FragPosKey; |
| 359 } else { |
| 360 return kBottomLeftFragPosRead_FragPosKey; |
| 361 } |
| 362 } |
| 363 |
| 364 |
| 354 const GrGLenum* GrGLShaderBuilder::GetTexParamSwizzle(GrPixelConfig config, cons
t GrGLCaps& caps) { | 365 const GrGLenum* GrGLShaderBuilder::GetTexParamSwizzle(GrPixelConfig config, cons
t GrGLCaps& caps) { |
| 355 if (caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(config)) { | 366 if (caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(config)) { |
| 356 if (caps.textureRedSupport()) { | 367 if (caps.textureRedSupport()) { |
| 357 static const GrGLenum gRedSmear[] = { GR_GL_RED, GR_GL_RED, GR_GL_RE
D, GR_GL_RED }; | 368 static const GrGLenum gRedSmear[] = { GR_GL_RED, GR_GL_RED, GR_GL_RE
D, GR_GL_RED }; |
| 358 return gRedSmear; | 369 return gRedSmear; |
| 359 } else { | 370 } else { |
| 360 static const GrGLenum gAlphaSmear[] = { GR_GL_ALPHA, GR_GL_ALPHA, | 371 static const GrGLenum gAlphaSmear[] = { GR_GL_ALPHA, GR_GL_ALPHA, |
| 361 GR_GL_ALPHA, GR_GL_ALPHA }; | 372 GR_GL_ALPHA, GR_GL_ALPHA }; |
| 362 return gAlphaSmear; | 373 return gAlphaSmear; |
| 363 } | 374 } |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 | 477 |
| 467 const char* GrGLShaderBuilder::fragmentPosition() { | 478 const char* GrGLShaderBuilder::fragmentPosition() { |
| 468 if (fCodeStage.inStageCode()) { | 479 if (fCodeStage.inStageCode()) { |
| 469 const GrEffectRef& effect = *fCodeStage.effectStage()->getEffect(); | 480 const GrEffectRef& effect = *fCodeStage.effectStage()->getEffect(); |
| 470 if (!effect->willReadFragmentPosition()) { | 481 if (!effect->willReadFragmentPosition()) { |
| 471 GrDebugCrash("GrGLEffect asked for frag position but its generating
GrEffect " | 482 GrDebugCrash("GrGLEffect asked for frag position but its generating
GrEffect " |
| 472 "did not request access."); | 483 "did not request access."); |
| 473 return ""; | 484 return ""; |
| 474 } | 485 } |
| 475 } | 486 } |
| 476 #if 1 | 487 if (fTopLeftFragPosRead) { |
| 477 if (fCtxInfo.caps()->fragCoordConventionsSupport()) { | 488 if (!fSetupFragPosition) { |
| 489 fFSInputs.push_back().set(kVec4f_GrSLType, |
| 490 GrGLShaderVar::kIn_TypeModifier, |
| 491 "gl_FragCoord", |
| 492 GrGLShaderVar::kDefault_Precision); |
| 493 fSetupFragPosition = true; |
| 494 } |
| 495 return "gl_FragCoord"; |
| 496 } else if (fCtxInfo.caps()->fragCoordConventionsSupport()) { |
| 478 if (!fSetupFragPosition) { | 497 if (!fSetupFragPosition) { |
| 479 SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSL
PrivateFeature)); | 498 SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSL
PrivateFeature)); |
| 480 fFSInputs.push_back().set(kVec4f_GrSLType, | 499 fFSInputs.push_back().set(kVec4f_GrSLType, |
| 481 GrGLShaderVar::kIn_TypeModifier, | 500 GrGLShaderVar::kIn_TypeModifier, |
| 482 "gl_FragCoord", | 501 "gl_FragCoord", |
| 483 GrGLShaderVar::kDefault_Precision, | 502 GrGLShaderVar::kDefault_Precision, |
| 484 GrGLShaderVar::kUpperLeft_Origin); | 503 GrGLShaderVar::kUpperLeft_Origin); |
| 485 fSetupFragPosition = true; | 504 fSetupFragPosition = true; |
| 486 } | 505 } |
| 487 return "gl_FragCoord"; | 506 return "gl_FragCoord"; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 499 "RTHeight", | 518 "RTHeight", |
| 500 &rtHeightName); | 519 &rtHeightName); |
| 501 | 520 |
| 502 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", |
| 503 kCoordName, rtHeightName); | 522 kCoordName, rtHeightName); |
| 504 fSetupFragPosition = true; | 523 fSetupFragPosition = true; |
| 505 } | 524 } |
| 506 GrAssert(GrGLUniformManager::kInvalidUniformHandle != fRTHeightUniform); | 525 GrAssert(GrGLUniformManager::kInvalidUniformHandle != fRTHeightUniform); |
| 507 return kCoordName; | 526 return kCoordName; |
| 508 } | 527 } |
| 509 #else | |
| 510 // This is the path we'll need to use once we have support for TopLeft | |
| 511 // render targets. | |
| 512 if (!fSetupFragPosition) { | |
| 513 fFSInputs.push_back().set(kVec4f_GrSLType, | |
| 514 GrGLShaderVar::kIn_TypeModifier, | |
| 515 "gl_FragCoord", | |
| 516 GrGLShaderVar::kDefault_Precision); | |
| 517 fSetupFragPosition = true; | |
| 518 } | |
| 519 return "gl_FragCoord"; | |
| 520 #endif | |
| 521 } | 528 } |
| 522 | 529 |
| 523 | 530 |
| 524 void GrGLShaderBuilder::emitFunction(ShaderType shader, | 531 void GrGLShaderBuilder::emitFunction(ShaderType shader, |
| 525 GrSLType returnType, | 532 GrSLType returnType, |
| 526 const char* name, | 533 const char* name, |
| 527 int argCnt, | 534 int argCnt, |
| 528 const GrGLShaderVar* args, | 535 const GrGLShaderVar* args, |
| 529 const char* body, | 536 const char* body, |
| 530 SkString* outName) { | 537 SkString* outName) { |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 for (const AttributePair* attrib = this->getEffectAttributes().begin(); | 729 for (const AttributePair* attrib = this->getEffectAttributes().begin(); |
| 723 attrib != attribEnd; | 730 attrib != attribEnd; |
| 724 ++attrib) { | 731 ++attrib) { |
| 725 if (attrib->fIndex == attributeIndex) { | 732 if (attrib->fIndex == attributeIndex) { |
| 726 return &attrib->fName; | 733 return &attrib->fName; |
| 727 } | 734 } |
| 728 } | 735 } |
| 729 | 736 |
| 730 return NULL; | 737 return NULL; |
| 731 } | 738 } |
| OLD | NEW |