Hi! We have strange problem in our MSAA code, it works nice on nVidia, but memory is leaking on Radeon (catalyst 11.6-11.8). We created separate test:
static HDC DC;
static GLuint MSAAColor;
static GLuint MSAADepth;
static GLuint MSAABuffer;
static GLuint Buffer;
static GLuint Texture;
static GLuint DepthTexture;
const int MSAA_LEVEL = 8;
void initTest(HWND wnd)
{
//INIT OPENGL
HDC hDC = GetDC(wnd);
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.cStencilBits = 8;
pfd.iLayerType = PFD_MAIN_PLANE;
int iFormat = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat( hDC, iFormat, &pfd );
HGLRC hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
DC = hDC;
glewInit();
//INIT MSAA FBO
glGenRenderbuffersEXT(1, &MSAAColor);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, MSAAColor);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, MSAA_LEVEL, GL_RGBA, 1024, 1024);
glGenRenderbuffersEXT(1, &MSAADepth);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, MSAADepth);
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, MSAA_LEVEL, GL_DEPTH24_STENCIL8_EXT, 1024, 1024);
glGenFramebuffersEXT(1, &MSAABuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MSAABuffer);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_RENDERBUFFER_EXT, MSAAColor);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT, MSAADepth);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT, MSAADepth);
//INIT FBO
glGenFramebuffersEXT(1, &Buffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Buffer);
glGenTextures(1, &Texture);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenTextures(1, &DepthTexture);
glBindTexture(GL_TEXTURE_2D, DepthTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, 1024, 1024, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, Texture, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_TEXTURE_2D, DepthTexture, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
GL_TEXTURE_2D, DepthTexture, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
void renderTest()
{
glClear(GL_COLOR_BUFFER_BIT);
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MSAABuffer);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, Buffer);
glBlitFramebufferEXT(0, 0, 1024, 1024, 0, 0, 1024, 1024, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBlitFramebufferEXT(0, 0, 1024, 1024, 0, 0, 1024, 1024, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glBlitFramebufferEXT(0, 0, 1024, 1024, 0, 0, 1024, 1024, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
SwapBuffers(DC);
}
Memory is leaking very fast (Depends on FPS).
Commenting this:
//glBlitFramebufferEXT(0, 0, 1024, 1024, 0, 0, 1024, 1024, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
fixes leak, but makes stencil unaccessible.
Any suggestions? Maybe incorrect code?