diff options
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 37 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.h | 26 | ||||
-rw-r--r-- | src/gpu/gl/GrGLDefines.h | 4 | ||||
-rw-r--r-- | src/gpu/gl/GrGLShaderBuilder.cpp | 54 | ||||
-rw-r--r-- | src/gpu/gl/GrGLShaderBuilder.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGpuGL.cpp | 9 |
6 files changed, 59 insertions, 74 deletions
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 7dee3de4b1..f12871192c 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -22,7 +22,6 @@ void GrGLCaps::reset() { fStencilFormats.reset(); fStencilVerifiedColorConfigs.reset(); fMSFBOType = kNone_MSFBOType; - fFBFetchType = kNone_FBFetchType; fInvalidateFBType = kNone_InvalidateFBType; fLATCAlias = kLATC_LATCAlias; fMapBufferType = kNone_MapBufferType; @@ -48,6 +47,9 @@ void GrGLCaps::reset() { fIsCoreProfile = false; fFullClearIsFree = false; fDropsTileOnZeroDivide = false; + fFBFetchSupport = false; + fFBFetchColorName = NULL; + fFBFetchExtensionString = NULL; } GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrDrawTargetCaps() { @@ -65,7 +67,6 @@ GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { fMaxFragmentTextureUnits = caps.fMaxFragmentTextureUnits; fMaxFixedFunctionTextureCoords = caps.fMaxFixedFunctionTextureCoords; fMSFBOType = caps.fMSFBOType; - fFBFetchType = caps.fFBFetchType; fInvalidateFBType = caps.fInvalidateFBType; fMapBufferType = caps.fMapBufferType; fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport; @@ -86,6 +87,9 @@ GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { fIsCoreProfile = caps.fIsCoreProfile; fFullClearIsFree = caps.fFullClearIsFree; fDropsTileOnZeroDivide = caps.fDropsTileOnZeroDivide; + fFBFetchSupport = caps.fFBFetchSupport; + fFBFetchColorName = caps.fFBFetchColorName; + fFBFetchExtensionString = caps.fFBFetchExtensionString; return *this; } @@ -233,9 +237,19 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { if (kGLES_GrGLStandard == standard) { if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { - fFBFetchType = kEXT_FBFetchType; + fFBFetchSupport = true; + fFBFetchColorName = "gl_LastFragData[0]"; + fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch"; } else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { - fFBFetchType = kNV_FBFetchType; + fFBFetchSupport = true; + fFBFetchColorName = "gl_LastFragData[0]"; + fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch"; + } else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { + // The arm extension also requires an additional flag which we will set onResetContext + // This is all temporary. + fFBFetchSupport = true; + fFBFetchColorName = "gl_LastFragColorARM"; + fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch"; } } @@ -335,7 +349,8 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { fGpuTracingSupport = ctxInfo.hasExtension("GL_EXT_debug_marker"); - fDstReadInShaderSupport = kNone_FBFetchType != fFBFetchType; + // For now these two are equivalent but we could have dst read in shader via some other method + fDstReadInShaderSupport = fFBFetchSupport; // Disable scratch texture reuse on Mali and Adreno devices fReuseScratchTextures = kARM_GrGLVendor != ctxInfo.vendor() && @@ -777,16 +792,6 @@ SkString GrGLCaps::dump() const { GR_STATIC_ASSERT(6 == kES_EXT_MsToTexture_MSFBOType); GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1); - static const char* kFBFetchTypeStr[] = { - "None", - "EXT", - "NV", - }; - GR_STATIC_ASSERT(0 == kNone_FBFetchType); - GR_STATIC_ASSERT(1 == kEXT_FBFetchType); - GR_STATIC_ASSERT(2 == kNV_FBFetchType); - GR_STATIC_ASSERT(SK_ARRAY_COUNT(kFBFetchTypeStr) == kLast_FBFetchType + 1); - static const char* kInvalidateFBTypeStr[] = { "None", "Discard", @@ -811,7 +816,7 @@ SkString GrGLCaps::dump() const { r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO")); r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]); - r.appendf("FB Fetch Type: %s\n", kFBFetchTypeStr[fFBFetchType]); + r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO")); r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType]); r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]); r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index ccf04fd7ba..887e2e9e2a 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -68,16 +68,6 @@ public: kLast_MSFBOType = kES_EXT_MsToTexture_MSFBOType }; - enum FBFetchType { - kNone_FBFetchType, - /** GL_EXT_shader_framebuffer_fetch */ - kEXT_FBFetchType, - /** GL_NV_shader_framebuffer_fetch */ - kNV_FBFetchType, - - kLast_FBFetchType = kNV_FBFetchType - }; - enum InvalidateFBType { kNone_InvalidateFBType, kDiscard_InvalidateFBType, //<! glDiscardFramebuffer() @@ -174,7 +164,16 @@ public: kES_EXT_MsToTexture_MSFBOType == fMSFBOType; } - FBFetchType fbFetchType() const { return fFBFetchType; } + /** + * 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 + */ + bool fbFetchSupport() const { return fFBFetchSupport; } + + const char* fbFetchColorName() const { return fFBFetchColorName; } + + const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } InvalidateFBType invalidateFBType() const { return fInvalidateFBType; } @@ -340,7 +339,6 @@ private: int fMaxFixedFunctionTextureCoords; MSFBOType fMSFBOType; - FBFetchType fFBFetchType; InvalidateFBType fInvalidateFBType; MapBufferType fMapBufferType; LATCAlias fLATCAlias; @@ -363,6 +361,10 @@ private: bool fIsCoreProfile : 1; bool fFullClearIsFree : 1; bool fDropsTileOnZeroDivide : 1; + bool fFBFetchSupport : 1; + + const char* fFBFetchColorName; + const char* fFBFetchExtensionString; typedef GrDrawTargetCaps INHERITED; }; diff --git a/src/gpu/gl/GrGLDefines.h b/src/gpu/gl/GrGLDefines.h index 77b7a15366..06dd99dae1 100644 --- a/src/gpu/gl/GrGLDefines.h +++ b/src/gpu/gl/GrGLDefines.h @@ -900,4 +900,8 @@ // shader stage of <program> (if a fragment stage exists). #define GR_GL_FRAGMENT_INPUT 0x936D +/* ARM specific define for MSAA support on framebuffer fetch */ +#define GR_GL_FETCH_PER_SAMPLE_ARM 0x8F65 + + #endif diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp index 561acd5ce6..d6679dcc95 100644 --- a/src/gpu/gl/GrGLShaderBuilder.cpp +++ b/src/gpu/gl/GrGLShaderBuilder.cpp @@ -114,8 +114,7 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[], /////////////////////////////////////////////////////////////////////////// // emit code to read the dst copy texture, if necessary - if (kNoDstRead_DstReadKey != header.fDstReadKey && - GrGLCaps::kNone_FBFetchType == fGpu->glCaps().fbFetchType()) { + if (kNoDstRead_DstReadKey != header.fDstReadKey && !fGpu->glCaps().fbFetchSupport()) { bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & header.fDstReadKey); const char* dstCopyTopLeftName; const char* dstCopyCoordScaleName; @@ -280,37 +279,6 @@ bool GrGLShaderBuilder::enableFeature(GLSLFeature feature) { } } -bool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) { - switch (feature) { - case kFragCoordConventions_GLSLPrivateFeature: - if (!fGpu->glCaps().fragCoordConventionsSupport()) { - return false; - } - if (fGpu->glslGeneration() < k150_GrGLSLGeneration) { - this->addFSFeature(1 << kFragCoordConventions_GLSLPrivateFeature, - "GL_ARB_fragment_coord_conventions"); - } - return true; - case kEXTShaderFramebufferFetch_GLSLPrivateFeature: - if (GrGLCaps::kEXT_FBFetchType != fGpu->glCaps().fbFetchType()) { - return false; - } - this->addFSFeature(1 << kEXTShaderFramebufferFetch_GLSLPrivateFeature, - "GL_EXT_shader_framebuffer_fetch"); - return true; - case kNVShaderFramebufferFetch_GLSLPrivateFeature: - if (GrGLCaps::kNV_FBFetchType != fGpu->glCaps().fbFetchType()) { - return false; - } - this->addFSFeature(1 << kNVShaderFramebufferFetch_GLSLPrivateFeature, - "GL_NV_shader_framebuffer_fetch"); - return true; - default: - SkFAIL("Unexpected GLSLPrivateFeature requested."); - return false; - } -} - void GrGLShaderBuilder::addFSFeature(uint32_t featureBit, const char* extensionName) { if (!(featureBit & fFSFeaturesAddedMask)) { fFSExtensions.appendf("#extension %s: require\n", extensionName); @@ -342,14 +310,11 @@ const char* GrGLShaderBuilder::dstColor() { return ""; } } - static const char kFBFetchColorName[] = "gl_LastFragData[0]"; - GrGLCaps::FBFetchType fetchType = fGpu->glCaps().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; + + if (fGpu->glCaps().fbFetchSupport()) { + this->addFSFeature(1 << (kLastGLSLPrivateFeature + 1), + fGpu->glCaps().fbFetchExtensionString()); + return fGpu->glCaps().fbFetchColorName(); } else if (fOutput.fUniformHandles.fDstCopySamplerUni.isValid()) { return kDstCopyColorName; } else { @@ -389,7 +354,7 @@ void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( GrGLShaderBuilder::DstReadKey GrGLShaderBuilder::KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps& caps) { uint32_t key = kYesDstRead_DstReadKeyBit; - if (GrGLCaps::kNone_FBFetchType != caps.fbFetchType()) { + if (caps.fbFetchSupport()) { return key; } SkASSERT(NULL != dstCopy); @@ -500,7 +465,10 @@ const char* GrGLShaderBuilder::fragmentPosition() { return "gl_FragCoord"; } else if (fGpu->glCaps().fragCoordConventionsSupport()) { if (!fSetupFragPosition) { - SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSLPrivateFeature)); + if (fGpu->glslGeneration() < k150_GrGLSLGeneration) { + this->addFSFeature(1 << kFragCoordConventions_GLSLPrivateFeature, + "GL_ARB_fragment_coord_conventions"); + } fFSInputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kIn_TypeModifier, "gl_FragCoord", diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h index 15e9ad8c83..9b74b471ec 100644 --- a/src/gpu/gl/GrGLShaderBuilder.h +++ b/src/gpu/gl/GrGLShaderBuilder.h @@ -371,8 +371,7 @@ private: */ enum GLSLPrivateFeature { kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1, - kEXTShaderFramebufferFetch_GLSLPrivateFeature, - kNVShaderFramebufferFetch_GLSLPrivateFeature, + kLastGLSLPrivateFeature = kFragCoordConventions_GLSLPrivateFeature }; bool enablePrivateFeature(GLSLPrivateFeature); diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index 404e7abdbd..8982785b3e 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -275,6 +275,13 @@ void GrGpuGL::onResetContext(uint32_t resetBits) { // currently part of our gl interface. There are probably others as // well. } + + if (kGLES_GrGLStandard == this->glStandard() && + fGLContext.hasExtension("GL_ARM_shader_framebuffer_fetch")) { + // The arm extension requires specifically enabling MSAA fetching per sample. + // On some devices this may have a perf hit. Also multiple render targets are disabled + GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM)); + } fHWWriteToColor = kUnknown_TriState; // we only ever use lines in hairline mode GL_CALL(LineWidth(1)); @@ -1490,7 +1497,7 @@ void GrGpuGL::discard(GrRenderTarget* renderTarget) { GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); } switch (this->glCaps().invalidateFBType()) { - case GrGLCaps::kNone_FBFetchType: + case GrGLCaps::kNone_InvalidateFBType: SkFAIL("Should never get here."); break; case GrGLCaps::kInvalidate_InvalidateFBType: |