diff options
Diffstat (limited to 'src/gpu/gl')
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 1 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp | 23 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLFragmentShaderBuilder.h | 1 |
4 files changed, 21 insertions, 7 deletions
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index b4cfad354a..ee87a39089 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -7,6 +7,7 @@ #include "GrGLCaps.h" + #include "GrGLContext.h" #include "SkTSearch.h" #include "SkTSort.h" diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index eb56798fda..f84019335c 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -168,7 +168,7 @@ public: /** * Some helper functions for encapsulating various extensions to read FB Buffer on openglES * - * TODO On desktop opengl 4.2+ we can achieve something similar to this effect + * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect */ bool fbFetchSupport() const { return fFBFetchSupport; } @@ -367,6 +367,7 @@ private: bool fIsCoreProfile : 1; bool fFullClearIsFree : 1; bool fDropsTileOnZeroDivide : 1; + // TODO(joshualitt) encapsulate the FB Fetch logic in a feature object bool fFBFetchSupport : 1; const char* fFBFetchColorName; 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() { diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h index fdf685cc09..1637d25612 100644 --- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h +++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h @@ -149,6 +149,7 @@ private: bool fHasSecondaryOutput; bool fSetupFragPosition; bool fTopLeftFragPosRead; + int fCustomColorOutputIndex; // some state to verify shaders and effects are consistent, this is reset between effects by // the program creator |