| Index: src/gpu/gl/GrGLShaderBuilder.cpp
|
| ===================================================================
|
| --- src/gpu/gl/GrGLShaderBuilder.cpp (revision 8966)
|
| +++ src/gpu/gl/GrGLShaderBuilder.cpp (working copy)
|
| @@ -87,7 +87,7 @@
|
|
|
| }
|
|
|
| -static const char kDstColorName[] = "_dstColor";
|
| +static const char kDstCopyColorName[] = "_dstColor";
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| @@ -125,7 +125,9 @@
|
| } else {
|
| fLocalCoordsVar = fPositionVar;
|
| }
|
| - if (kNoDstRead_DstReadKey != desc.fDstRead) {
|
| + // Emit code to read the dst copy textue if necessary.
|
| + if (kNoDstRead_DstReadKey != desc.fDstRead &&
|
| + GrGLCaps::kNone_FBFetchType == ctxInfo.caps()->fbFetchType()) {
|
| bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & desc.fDstRead);
|
| const char* dstCopyTopLeftName;
|
| const char* dstCopyCoordScaleName;
|
| @@ -152,7 +154,7 @@
|
| if (!topDown) {
|
| this->fsCodeAppend("\t_dstTexCoord.y = 1.0 - _dstTexCoord.y;\n");
|
| }
|
| - this->fsCodeAppendf("\tvec4 %s = ", kDstColorName);
|
| + this->fsCodeAppendf("\tvec4 %s = ", kDstCopyColorName);
|
| this->appendTextureLookup(kFragment_ShaderType, fDstCopySampler, "_dstTexCoord");
|
| this->fsCodeAppend(";\n\n");
|
| }
|
| @@ -186,6 +188,20 @@
|
| "GL_ARB_fragment_coord_conventions");
|
| }
|
| return true;
|
| + case kEXTShaderFramebufferFetch_GLSLPrivateFeature:
|
| + if (GrGLCaps::kEXT_FBFetchType != fCtxInfo.caps()->fbFetchType()) {
|
| + return false;
|
| + }
|
| + this->addFSFeature(1 << kEXTShaderFramebufferFetch_GLSLPrivateFeature,
|
| + "GL_EXT_shader_framebuffer_fetch");
|
| + return true;
|
| + case kNVShaderFramebufferFetch_GLSLPrivateFeature:
|
| + if (GrGLCaps::kNV_FBFetchType != fCtxInfo.caps()->fbFetchType()) {
|
| + return false;
|
| + }
|
| + this->addFSFeature(1 << kNVShaderFramebufferFetch_GLSLPrivateFeature,
|
| + "GL_NV_shader_framebuffer_fetch");
|
| + return true;
|
| default:
|
| GrCrash("Unexpected GLSLPrivateFeature requested.");
|
| return false;
|
| @@ -199,9 +215,17 @@
|
| }
|
| }
|
|
|
| -const char* GrGLShaderBuilder::dstColor() const {
|
| - if (fDstCopySampler.isInitialized()) {
|
| - return kDstColorName;
|
| +const char* GrGLShaderBuilder::dstColor() {
|
| + static const char kFBFetchColorName[] = "gl_LastFragData[0]";
|
| + GrGLCaps::FBFetchType fetchType = fCtxInfo.caps()->fbFetchType();
|
| + if (GrGLCaps::kEXT_FBFetchType == fetchType) {
|
| + SkAssertResult(this->enablePrivateFeature(kEXTShaderFramebufferFetch_GLSLPrivateFeature));
|
| + return kFBFetchColorName;
|
| + } else if (GrGLCaps::kNV_FBFetchType == fetchType) {
|
| + SkAssertResult(this->enablePrivateFeature(kNVShaderFramebufferFetch_GLSLPrivateFeature));
|
| + return kFBFetchColorName;
|
| + } else if (fDstCopySampler.isInitialized()) {
|
| + return kDstCopyColorName;
|
| } else {
|
| return NULL;
|
| }
|
| @@ -290,6 +314,10 @@
|
| GrGLShaderBuilder::DstReadKey GrGLShaderBuilder::KeyForDstRead(const GrTexture* dstCopy,
|
| const GrGLCaps& caps) {
|
| uint32_t key = kYesDstRead_DstReadKeyBit;
|
| + if (GrGLCaps::kNone_FBFetchType != caps.fbFetchType()) {
|
| + return key;
|
| + }
|
| + GrAssert(NULL != dstCopy);
|
| if (!caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(dstCopy->config())) {
|
| // The fact that the config is alpha-only must be considered when generating code.
|
| key |= kUseAlphaConfig_DstReadKeyBit;
|
|
|