diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 1a86c552e..e757febc6 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -297,6 +297,7 @@ GLInitParams::GLInitParams() depthBits = 32; stencilBits = 8; isSRGB = 1; + multiSamples = 1; width = 32; height = 32; } @@ -315,6 +316,7 @@ ReplayCreateStatus GLInitParams::Serialise() m_pSerialiser->Serialise("Depth bits", depthBits); m_pSerialiser->Serialise("Stencil bits", stencilBits); m_pSerialiser->Serialise("Is SRGB", isSRGB); + m_pSerialiser->Serialise("MSAA samples", multiSamples); m_pSerialiser->Serialise("Width", width); m_pSerialiser->Serialise("Height", height); @@ -494,11 +496,6 @@ void WrappedOpenGL::Initialise(GLInitParams ¶ms) gl.glGenFramebuffers(1, &m_FakeBB_FBO); gl.glBindFramebuffer(eGL_FRAMEBUFFER, m_FakeBB_FBO); - gl.glGenTextures(1, &m_FakeBB_Color); - gl.glBindTexture(eGL_TEXTURE_2D, m_FakeBB_Color); - - gl.glObjectLabel(eGL_TEXTURE, m_FakeBB_Color, -1, "Backbuffer Color"); - GLNOTIMP("backbuffer needs to resize if the size is exceeded"); GLenum colfmt = eGL_RGBA8; @@ -510,11 +507,26 @@ void WrappedOpenGL::Initialise(GLInitParams ¶ms) else RDCERR("Unexpected # colour bits: %d", params.colorBits); - gl.glTexStorage2D(eGL_TEXTURE_2D, 1, colfmt, params.width, params.height); - gl.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); - gl.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); - gl.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); - gl.glTexParameteri(eGL_TEXTURE_2D, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + GLenum target = eGL_TEXTURE_2D; + if(params.multiSamples > 1) target = eGL_TEXTURE_2D_MULTISAMPLE; + + gl.glGenTextures(1, &m_FakeBB_Color); + gl.glBindTexture(target, m_FakeBB_Color); + + gl.glObjectLabel(eGL_TEXTURE, m_FakeBB_Color, -1, "Backbuffer Color"); + + if(params.multiSamples > 1) + { + gl.glTexStorage2DMultisample(target, params.multiSamples, colfmt, params.width, params.height, true); + } + else + { + gl.glTexStorage2D(target, 1, colfmt, params.width, params.height); + gl.glTexParameteri(target, eGL_TEXTURE_MIN_FILTER, eGL_NEAREST); + gl.glTexParameteri(target, eGL_TEXTURE_MAG_FILTER, eGL_NEAREST); + gl.glTexParameteri(target, eGL_TEXTURE_WRAP_S, eGL_CLAMP_TO_EDGE); + gl.glTexParameteri(target, eGL_TEXTURE_WRAP_T, eGL_CLAMP_TO_EDGE); + } gl.glFramebufferTexture(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, m_FakeBB_Color, 0); gl.glViewport(0, 0, params.width, params.height); @@ -522,7 +534,7 @@ void WrappedOpenGL::Initialise(GLInitParams ¶ms) if(params.depthBits > 0 || params.stencilBits > 0) { gl.glGenTextures(1, &m_FakeBB_DepthStencil); - gl.glBindTexture(eGL_TEXTURE_2D, m_FakeBB_DepthStencil); + gl.glBindTexture(target, m_FakeBB_DepthStencil); GLenum depthfmt = eGL_DEPTH32F_STENCIL8; bool stencil = false; @@ -557,7 +569,10 @@ void WrappedOpenGL::Initialise(GLInitParams ¶ms) else gl.glObjectLabel(eGL_TEXTURE, m_FakeBB_DepthStencil, -1, "Backbuffer Depth"); - gl.glTexStorage2D(eGL_TEXTURE_2D, 1, depthfmt, params.width, params.height); + if(params.multiSamples > 1) + gl.glTexStorage2DMultisample(target, params.multiSamples, depthfmt, params.width, params.height, true); + else + gl.glTexStorage2D(target, 1, depthfmt, params.width, params.height); if(stencil) gl.glFramebufferTexture(eGL_FRAMEBUFFER, eGL_DEPTH_STENCIL_ATTACHMENT, m_FakeBB_DepthStencil, 0); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index e39a188d6..e6d904225 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -51,6 +51,7 @@ struct GLInitParams : public RDCInitParams uint32_t depthBits; uint32_t stencilBits; uint32_t isSRGB; + uint32_t multiSamples; uint32_t width; uint32_t height; diff --git a/renderdoc/hooks/gl_linux_hooks.cpp b/renderdoc/hooks/gl_linux_hooks.cpp index 31771bc5d..ebc6f8fec 100644 --- a/renderdoc/hooks/gl_linux_hooks.cpp +++ b/renderdoc/hooks/gl_linux_hooks.cpp @@ -346,6 +346,8 @@ GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis, GLXContext shareList OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_STENCIL_SIZE, &value); init.stencilBits = value; value = 1; // default to srgb OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &value); init.isSRGB = value; + value = 1; + OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_SAMPLES_ARB, &value); init.isSRGB = RDCMAX(1, value); OpenGLHook::glhooks.GetDriver()->CreateContext(NULL, ret, shareList, init); @@ -419,6 +421,10 @@ GLXContext glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, GLXConte OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_BUFFER_SIZE, &value); init.colorBits = value; OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_DEPTH_SIZE, &value); init.depthBits = value; OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_STENCIL_SIZE, &value); init.stencilBits = value; + value = 1; // default to srgb + OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &value); init.isSRGB = value; + value = 1; + OpenGLHook::glhooks.glXGetConfig_real(dpy, vis, GLX_SAMPLES_ARB, &value); init.isSRGB = RDCMAX(1, value); XFree(vis); diff --git a/renderdoc/hooks/gl_win32_hooks.cpp b/renderdoc/hooks/gl_win32_hooks.cpp index efed08b4d..684646c78 100644 --- a/renderdoc/hooks/gl_win32_hooks.cpp +++ b/renderdoc/hooks/gl_win32_hooks.cpp @@ -309,6 +309,11 @@ class OpenGLHook : LibraryHook int srgb = 1; glhooks.wglGetPixelFormatAttribivARB_realfunc(dc, pf, 0, 1, &attrname, &srgb); ret.isSRGB = srgb; + + attrname = eWGL_SAMPLES_ARB; + int ms = 1; + glhooks.wglGetPixelFormatAttribivARB_realfunc(dc, pf, 0, 1, &attrname, &ms); + ret.multiSamples = RDCMAX(1, ms); } if(pfd.iPixelType != PFD_TYPE_RGBA)