Jump to content
  • Advertisement
Sign in to follow this  
Oogst

OpenGL Crash in glGenFramebuffersEXT for some users

This topic is 2193 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Our game Awesomenauts released last week for Windows and for a small number of users the game turns out to crash when post-effects are enabled. It works fine without. All of these users have Nvidia videocards, but from various generations: from 8800 to 560. Most users with the exact same videocards don't get these crashes. I asked those with crashes to update their drivers, and that does not help.

Now the interesting thing is that creating the first rendertexture does not crash, and the second rendertexture the game creates, crashes. It crashes in glGenFramebuffersEXT (or maybe glGenTextures, not entirely sure, but I think it is glGenFramebuffersEXT). These rendertextures are created directly after each other, with no relevant code in-between. So it basically looks like this (removed some irrelevant code in-between):


{
unsigned int frameBufferID;
unsigned int textureID;
glGenFramebuffersEXT(1, &frameBufferID);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
GLint filterMode = GL_LINEAR;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMode);
GLint frameBufferFormat = GL_RGBA;
glTexImage2D(GL_TEXTURE_2D, 0, frameBufferFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBufferID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureID, 0);
}
{
unsigned int frameBufferID;
unsigned int textureID;
glGenFramebuffersEXT(1, &frameBufferID); // << CRASH!
glGenTextures(1, &textureID); // << OR MAYBE THE CRASH IS HERE
glBindTexture(GL_TEXTURE_2D, textureID);
GLint filterMode = GL_LINEAR;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMode);
GLint frameBufferFormat = GL_RGBA;
glTexImage2D(GL_TEXTURE_2D, 0, frameBufferFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBufferID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureID, 0);
}


Some random pieces of information:
-Crashes are on Windows
-Crashes only happen on Nvidia videocards
-Happens for less than 1% of our users (which is quite a few computers for a game that is selling well on Steam)
-We use SDL 1.2.13
-Our engine is multi-threaded, and all OpenGL code happens in one thread

What could cause this to crash on only some rare computers, and what can I do to fix this?

Share this post


Link to post
Share on other sites
Advertisement

I asked those with crashes to update their drivers, and that does not help.

Try to get a dxdiag report and take a look at the driver version yourself.

Else your code looks ok to me. Maybe it is just a result of an previous error. I would add a lot of error checking code at the suspecious location and send the pimped exe to one of the players with this problem to track it down.

Share this post


Link to post
Share on other sites

Try to get a dxdiag report and take a look at the driver version yourself.

I already have this:
GL_VENDOR: NVIDIA Corporation
GL_RENDERER GeForce 9800 GT/PCIe/SSE2
GL_VERSION 3.3.0
What other information would be interesting to check in the dxdiag report?

Else your code looks ok to me. Maybe it is just a result of an previous error. I would add a lot of error checking code at the suspecious location and send the pimped exe to one of the players with this problem to track it down.[/quote]
I call glGetError() and cgGetError() regularly already, and they don't print anything at all. I added logging to find the exact line where the crash happens. What other things could I log that are interesting?

Share this post


Link to post
Share on other sites

GL_VERSION 3.3.0

This is the supported gl version, but not the driver version. Current driver version for nvidia should be above 300. Early driver version, which supported ogl 3.3.0, might be buggier than later one which still support the same ogl version.


I call glGetError() and cgGetError() regularly already,

Btw. this kills performance (at least decrease it due to flushing the command queue). Nevertheless, there are special error checking functions avaible for the framebuffer (glCheckFramebufferStatusEXT), try to check these one after creating the first framebuffer.

Share this post


Link to post
Share on other sites
I'd suggest using the core (i.e non-EXT) version of the FBO API where it's available, which it should be on all 3.3 hardware. A best guess here is that you're using some other functionality which doesn't interact well with the -EXT version on these cards.

Share this post


Link to post
Share on other sites
I tried using the non-EXT versions, but it still crashes. sad.png

Strangely, I still had to call them EXT, is that correct? For some reason I can request glGenFramebuffers and it works fine, but I can only put it in a PFNGLGENFRAMEBUFFERSEXTPROC pointer. It seems like PFNGLGENFRAMEBUFFERSPROC does not exist?! Here's how I get the functions related to the framebuffer:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffers = PFNGLGENFRAMEBUFFERSEXTPROC(wglGetProcAddress("glGenFramebuffers"));
if (glGenFramebuffers == NULL)
{
glGenFramebuffers = PFNGLGENFRAMEBUFFERSEXTPROC(wglGetProcAddress("glGenFramebuffersEXT"));
}


I also had to still use GL_FRAMEBUFFER_EXT instead of GL_FRAMEBUFFER. Is that okay, or am I doing something wrong?

So using glGenFramebuffers instead of glGenFramebuffersEXT does work on my own computer and behaves the exact same as just using the EXT versions, but on the computers where it used to crash, it still crashes. Edited by Oogst

Share this post


Link to post
Share on other sites
Have you considered using an extension wrangler (like GLEW) instead of doing that yourself? Right now it is not clear if the problem happens because you are setting up the extensions wrong or because something with OpenGL does not work as intended.

Share this post


Link to post
Share on other sites
I second the notion of using GLEW, instead of retrieving the function addresses yourself.
Also note that the name of your function variable is just that, a variable name. Changing it will not change the behaviour of your program. The call to wglGetProcAddress("glGenFramebuffersEXT") determines whether you retrieving the EXT version of the function or not. I am not sure whether there is actually any difference between the two since glGenFramebuffers moved to the Core profile though.

Share this post


Link to post
Share on other sites
I didn't know about GLEW before it was brought up in this topic, and I really don't want to switch these kinds of libraries on an already released game with tens of thousands of users: the risk is just too big...

What could I be doing wrong in retrieving these functions that GLEW would fix? I think my own code is exactly as the standard advocates, or am I overlooking something here?

Anyway, since it works for 99% of users, I don't think the way the extensions are retrieved would be the problem, right? Is it not more probably something with the use of rendertextures itself?

Share this post


Link to post
Share on other sites
Well, for a start you are missing several constants, starting with GL_FRAMEBUFFER. I'm not sure if GL_FRAMEBUFFER_EXT works instead. Then you have to query all the required functions yourself and make extremely sure that their signature matches exactly. Do glGenFramebuffersEXT and glGenFramebuffers have the exact same signature and calling convention? Probably, but I'd hate to make sure of that myself for every function I need to use.

Even if you do not want to use GLEW in general (though I would strongly advocate using GLEW or an equivalent well-tested extension wrangler), you could still build a test version which uses GLEW instead of your own code and send it to the people who currently have the crashing problem.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!