From 94aa39116e851cb98feefe9d840526fc8db42d37 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 16 Feb 2014 14:54:33 -0400 Subject: [PATCH] Fixed stencils used when an antialiased Canvas is active --- src/modules/graphics/opengl/Canvas.cpp | 47 ++++++++++++++++++++------ 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index ed9ff6113..daf32429c 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -55,10 +55,11 @@ struct FramebufferStrategy /** * @param[in] width Width of the stencil buffer * @param[in] height Height of the stencil buffer + * @param[in] samples Number of samples to use * @param[out] stencil Name for stencil buffer * @return Whether the stencil buffer was successfully created **/ - virtual bool createStencil(int, int, GLuint &) + virtual bool createStencil(int, int, int, GLuint &) { return false; } @@ -121,16 +122,20 @@ struct FramebufferStrategyGL3 : public FramebufferStrategy return status; } - virtual bool createStencil(int width, int height, GLuint &stencil) + virtual bool createStencil(int width, int height, int samples, GLuint &stencil) { // create combined depth/stencil buffer glDeleteRenderbuffers(1, &stencil); glGenRenderbuffers(1, &stencil); glBindRenderbuffer(GL_RENDERBUFFER, stencil); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height); + + if (samples > 0) + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH_STENCIL, width, height); + else + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencil); + GL_RENDERBUFFER, stencil); glBindRenderbuffer(GL_RENDERBUFFER, 0); @@ -237,14 +242,24 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy return status; } - virtual bool createStencil(int width, int height, GLuint &stencil) + virtual bool createStencil(int width, int height, int samples, GLuint &stencil) { // create combined depth/stencil buffer glDeleteRenderbuffersEXT(1, &stencil); glGenRenderbuffersEXT(1, &stencil); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, - width, height); + + if (samples > 0) + { + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, + GL_DEPTH_STENCIL, width, height); + } + else + { + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, + width, height); + } + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, stencil); @@ -336,14 +351,24 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy struct FramebufferStrategyEXT : public FramebufferStrategyPackedEXT { - virtual bool createStencil(int width, int height, GLuint &stencil) + virtual bool createStencil(int width, int height, int samples, GLuint &stencil) { // create stencil buffer glDeleteRenderbuffersEXT(1, &stencil); glGenRenderbuffersEXT(1, &stencil); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, - width, height); + + if (samples > 0) + { + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, + GL_STENCIL_INDEX, width, height); + } + else + { + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, + width, height); + } + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, stencil); @@ -854,7 +879,7 @@ bool Canvas::checkCreateStencil() if (current != this) strategy->bindFBO(fbo); - bool success = strategy->createStencil(width, height, depth_stencil); + bool success = strategy->createStencil(width, height, fsaa_samples, depth_stencil); if (current && current != this) strategy->bindFBO(current->fbo);