From b4384b9bba6f3473a3f024150bfe307cdd1753c7 Mon Sep 17 00:00:00 2001 From: joshualitt Date: Tue, 21 Oct 2014 12:53:15 -0700 Subject: Bug fix for es 3.00 fb fetch patch for es 300 shader fb fetch BUG=skia: Review URL: https://codereview.chromium.org/665893008 --- src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp') diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp index 5d5741ef9b..76558d8875 100644 --- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp @@ -75,6 +75,7 @@ GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program , fHasSecondaryOutput(false) , fSetupFragPosition(false) , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey) + , fCustomColorOutputIndex(-1) , fHasReadDstColor(false) , fHasReadFragmentPosition(false) { } @@ -172,7 +173,15 @@ const char* GrGLFragmentShaderBuilder::dstColor() { if (gpu->glCaps().fbFetchSupport()) { this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeature + 1), gpu->glCaps().fbFetchExtensionString()); - return gpu->glCaps().fbFetchColorName(); + + // On ES 3.0 we have to declare this, and use the custom color output name + const char* fbFetchColorName = gpu->glCaps().fbFetchColorName(); + if (gpu->glslGeneration() >= k330_GrGLSLGeneration) { + this->enableCustomOutput(); + fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOut_TypeModifier); + fbFetchColorName = declared_color_output_name(); + } + return fbFetchColorName; } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) { return kDstCopyColorName; } else { @@ -223,11 +232,13 @@ void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() { } void GrGLFragmentShaderBuilder::enableCustomOutput() { - SkASSERT(!fHasCustomColorOutput); - fHasCustomColorOutput = true; - fOutputs.push_back().set(kVec4f_GrSLType, - GrGLShaderVar::kOut_TypeModifier, - declared_color_output_name()); + if (!fHasCustomColorOutput) { + fHasCustomColorOutput = true; + fCustomColorOutputIndex = fOutputs.count(); + fOutputs.push_back().set(kVec4f_GrSLType, + GrGLShaderVar::kOut_TypeModifier, + declared_color_output_name()); + } } void GrGLFragmentShaderBuilder::enableSecondaryOutput() { -- cgit v1.2.3