From cb72a741ce9892840032bba72a161c805d8de03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Mon, 6 Jan 2014 09:12:12 +0200 Subject: [PATCH] libgui|OpenGL: Detect NVIDIA CSAA support, use it if available IssueID #1707 --- .../libgui/include/de/gui/glentrypoints.h | 7 ++++-- doomsday/libgui/include/de/gui/glinfo.h | 1 + doomsday/libgui/src/glentrypoints.cpp | 10 ++++++-- doomsday/libgui/src/glinfo.cpp | 2 ++ doomsday/libgui/src/gltarget.cpp | 23 +++++++++++++++---- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/doomsday/libgui/include/de/gui/glentrypoints.h b/doomsday/libgui/include/de/gui/glentrypoints.h index 8fdcd2c5d0..0ec235f337 100644 --- a/doomsday/libgui/include/de/gui/glentrypoints.h +++ b/doomsday/libgui/include/de/gui/glentrypoints.h @@ -120,8 +120,11 @@ LIBGUI_EXTERN_C PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; // Extensions: -LIBGUI_EXTERN_C PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; -LIBGUI_EXTERN_C PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +LIBGUI_EXTERN_C PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; +LIBGUI_EXTERN_C PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +#ifdef GL_NV_framebuffer_multisample_coverage +LIBGUI_EXTERN_C PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENV glRenderbufferStorageMultisampleCoverageNV; +#endif void getAllOpenGLEntryPoints(); diff --git a/doomsday/libgui/include/de/gui/glinfo.h b/doomsday/libgui/include/de/gui/glinfo.h index 061b2a8dba..9868faf2b2 100644 --- a/doomsday/libgui/include/de/gui/glinfo.h +++ b/doomsday/libgui/include/de/gui/glinfo.h @@ -44,6 +44,7 @@ class LIBGUI_PUBLIC GLInfo // Vendor-specific extensions: duint32 ATI_texture_env_combine3 : 1; + duint32 NV_framebuffer_multisample_coverage : 1; duint32 NV_texture_env_combine4 : 1; duint32 SGIS_generate_mipmap : 1; diff --git a/doomsday/libgui/src/glentrypoints.cpp b/doomsday/libgui/src/glentrypoints.cpp index 9950487471..da5c3c2ac2 100644 --- a/doomsday/libgui/src/glentrypoints.cpp +++ b/doomsday/libgui/src/glentrypoints.cpp @@ -99,8 +99,11 @@ PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; // Extensions: -PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +#ifdef GL_NV_framebuffer_multisample_coverage +PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENV glRenderbufferStorageMultisampleCoverageNV; +#endif void getAllOpenGLEntryPoints() { @@ -178,6 +181,9 @@ void getAllOpenGLEntryPoints() GET_PROC_EXT(glBlitFramebufferEXT); GET_PROC_EXT(glRenderbufferStorageMultisampleEXT); +#ifdef GL_NV_framebuffer_multisample_coverage + GET_PROC_EXT(glRenderbufferStorageMultisampleCoverageNV); +#endif haveProcs = true; } diff --git a/doomsday/libgui/src/glinfo.cpp b/doomsday/libgui/src/glinfo.cpp index 92de844526..6168f598bd 100644 --- a/doomsday/libgui/src/glinfo.cpp +++ b/doomsday/libgui/src/glinfo.cpp @@ -114,6 +114,8 @@ DENG2_PIMPL_NOREF(GLInfo) ext.EXT_texture_filter_anisotropic = query("GL_EXT_texture_filter_anisotropic"); ext.ATI_texture_env_combine3 = query("GL_ATI_texture_env_combine3"); + ext.NV_framebuffer_multisample_coverage + = query("GL_NV_framebuffer_multisample_coverage"); ext.NV_texture_env_combine4 = query("GL_NV_texture_env_combine4"); ext.SGIS_generate_mipmap = query("GL_SGIS_generate_mipmap"); diff --git a/doomsday/libgui/src/gltarget.cpp b/doomsday/libgui/src/gltarget.cpp index 18d208963d..9cac054f11 100644 --- a/doomsday/libgui/src/gltarget.cpp +++ b/doomsday/libgui/src/gltarget.cpp @@ -186,12 +186,25 @@ DENG2_OBSERVES(Asset, Deletion) if(sampleCount > 1) { - LOG_DEBUG("FBO %i: renderbuffer %ix%i is multisampled with %i samples => attachment %i") - << fbo << size.x << size.y << sampleCount - << attachmentToId(attachment); +#ifdef GL_NV_framebuffer_multisample_coverage + if(GLInfo::extensions().NV_framebuffer_multisample_coverage) + { + LOG_DEBUG("FBO %i: renderbuffer %ix%i is multisampled with %i CSAA samples => attachment %i") + << fbo << size.x << size.y << sampleCount + << attachmentToId(attachment); + + glRenderbufferStorageMultisampleCoverageNV(GL_RENDERBUFFER, 8, sampleCount, type, size.x, size.y); + } + else +#endif + { + LOG_DEBUG("FBO %i: renderbuffer %ix%i is multisampled with %i samples => attachment %i") + << fbo << size.x << size.y << sampleCount + << attachmentToId(attachment); - DENG2_ASSERT(GLInfo::extensions().EXT_framebuffer_multisample); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, sampleCount, type, size.x, size.y); + DENG2_ASSERT(GLInfo::extensions().EXT_framebuffer_multisample); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, sampleCount, type, size.x, size.y); + } } else {