aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gpu/gl/GrGLCaps.cpp37
-rw-r--r--src/gpu/gl/GrGLCaps.h26
-rw-r--r--src/gpu/gl/GrGLDefines.h4
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.cpp54
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.h3
-rw-r--r--src/gpu/gl/GrGpuGL.cpp9
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: