typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLTexParameteriProc)(GrGLenum target, GrGLenum pname, GrGLint param);
typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLTexParameterivProc)(GrGLenum target, GrGLenum pname, const GrGLint* params);
typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLTexStorage2DProc)(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
+ typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLDiscardFramebufferProc)(GrGLenum target, GrGLsizei numAttachments, const GrGLenum* attachments);
typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLUniform1fProc)(GrGLint location, GrGLfloat v0);
typedef GrGLvoid (GR_GL_FUNCTION_TYPE* GrGLUniform1iProc)(GrGLint location, GrGLint v0);
GLPtr<GrGLTexParameterivProc> fTexParameteriv;
GLPtr<GrGLTexSubImage2DProc> fTexSubImage2D;
GLPtr<GrGLTexStorage2DProc> fTexStorage2D;
+ GLPtr<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
GLPtr<GrGLUniform1fProc> fUniform1f;
GLPtr<GrGLUniform1iProc> fUniform1i;
GLPtr<GrGLUniform1fvProc> fUniform1fv;
fVertexArrayObjectSupport = false;
fUseNonVBOVertexAndIndexDynamicData = false;
fIsCoreProfile = false;
+ fDiscardFBSupport = false;
}
GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrDrawTargetCaps() {
fVertexArrayObjectSupport = caps.fVertexArrayObjectSupport;
fUseNonVBOVertexAndIndexDynamicData = caps.fUseNonVBOVertexAndIndexDynamicData;
fIsCoreProfile = caps.fIsCoreProfile;
+ fDiscardFBSupport = caps.fDiscardFBSupport;
return *this;
}
fIsCoreProfile = SkToBool(profileMask & GR_GL_CONTEXT_CORE_PROFILE_BIT);
}
+ fDiscardFBSupport = ctxInfo.hasExtension("GL_EXT_discard_framebuffer");
+
if (kDesktop_GrGLBinding == binding) {
fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) ||
ctxInfo.hasExtension("GL_ARB_vertex_array_object");
GrPrintf("Use non-VBO for dynamic data: %s\n",
(fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO"));
GrPrintf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO"));
+ GrPrintf("Discard FrameBuffer support: %s\n", (fDiscardFBSupport ? "YES" : "NO"));
}
bool isCoreProfile() const { return fIsCoreProfile; }
+ /// Is there support for discarding the frame buffer
+ bool discardFBSupport() const { return fDiscardFBSupport; }
+
private:
/**
* Maintains a bit per GrPixelConfig. It is used to avoid redundantly
bool fVertexArrayObjectSupport : 1;
bool fUseNonVBOVertexAndIndexDynamicData : 1;
bool fIsCoreProfile : 1;
+ bool fDiscardFBSupport : 1;
typedef GrDrawTargetCaps INHERITED;
};
interface->fTexParameteriv = noOpGLTexParameteriv;
interface->fTexSubImage2D = noOpGLTexSubImage2D;
interface->fTexStorage2D = noOpGLTexStorage2D;
+ interface->fDiscardFramebuffer = noOpGLDiscardFramebuffer;
interface->fUniform1f = noOpGLUniform1f;
interface->fUniform1i = noOpGLUniform1i;
interface->fUniform1fv = noOpGLUniform1fv;
}
}
+ if (extensions.has("GL_EXT_discard_framebuffer")) {
+// FIXME: Remove this once Chromium is updated to provide this function
+#if 0
+ if (NULL == fDiscardFramebuffer) {
+ return false;
+ }
+#endif
+ }
+
// FBO MSAA
if (kDesktop_GrGLBinding == binding) {
// GL 3.0 and the ARB extension have multisample + blit
GrGLsizei height) {
}
+GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDiscardFramebuffer(GrGLenum target,
+ GrGLsizei numAttachments,
+ const GrGLenum* attachments) {
+}
+
GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexSubImage2D(GrGLenum target,
GrGLint level,
GrGLint xoffset,
GrGLsizei width,
GrGLsizei height);
+GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDiscardFramebuffer(GrGLenum target,
+ GrGLsizei numAttachments,
+ const GrGLenum* attachments);
+
GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexSubImage2D(GrGLenum target,
GrGLint level,
GrGLint xoffset,
if (fHWBoundRenderTarget != rt) {
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID()));
- #if GR_DEBUG
+#if GR_DEBUG
GrGLenum status;
GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x\n", status);
}
- #endif
+#endif
fHWBoundRenderTarget = rt;
const GrGLIRect& vp = rt->getViewport();
if (fHWViewport != vp) {
#else
interface->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
#endif
+#if GL_EXT_discard_framebuffer
+ interface->fDiscardFramebuffer = glDiscardFramebufferEXT;
+#endif
interface->fUniform1f = glUniform1f;
interface->fUniform1i = glUniform1i;
interface->fUniform1fv = glUniform1fv;
interface->fTexParameteriv = noOpGLTexParameteriv;
interface->fTexSubImage2D = noOpGLTexSubImage2D;
interface->fTexStorage2D = noOpGLTexStorage2D;
+ interface->fDiscardFramebuffer = noOpGLDiscardFramebuffer;
interface->fUniform1f = noOpGLUniform1f;
interface->fUniform1i = noOpGLUniform1i;
interface->fUniform1fv = noOpGLUniform1fv;
#elif GL_EXT_texture_storage
interface->fTexStorage2D = glTexStorage2DEXT;
#endif
+#if GL_EXT_discard_framebuffer
+ interface->fDiscardFramebuffer = glDiscardFramebufferEXT;
+#endif
interface->fTexParameteri = glTexParameteri;
interface->fTexParameteriv = glTexParameteriv;
interface->fTexSubImage2D = glTexSubImage2D;