Sign in to follow this  
Amazing Retardo

OpenGL Really strange extension problem

Recommended Posts

Hi Everyone! Just posting about a really weird problem I'm facing with opengl extensions, particularly deleting extension objects (like shaders, vbos, fbos.. etc) Setting up the extensions and using them works fine, the problem happens when I try to delete these objects. (I'm using ARB extensions, but I've tested with the OpenGL 2.0 alternatives to no avail)
HFGLShader::~HFGLShader()
{
	for (list<HFVirtualShader*>::iterator i = mShaderList.begin(); i != mShaderList.end(); i ++)
	{
		HFBaseShader * shader = (HFBaseShader*)(*i);
		glDetachObjectARB(mShaderProgId, shader->GetShader());
		shader->UnloadAssets();
		delete shader;
	}
	if (mShaderProgId)
		glDeleteObjectARB(mShaderProgId);
	mShaderProgId = 0;
}



The program crashes at glDetachObjectARB() with: "Unhandled exception at 0x69638b16 in HFTestingPad.exe: 0xC0000005: Access violation reading location 0x00000864.". This happens with other related extension deletion code as well (e.g. glDeleteObjectARB(), glDeleteBuffersARB()) I've tried implementing extensions using glew first, and then glee later to see if it was my extension library that was causing it, but sadly, it wasn't. (I even obtained the address myself using wglGetProcAddress()). Lastly, this problem only seems to happen on computers using nvidia cards. (Testing on a quadrofx and a 8600 GT caused the crash) ATI cards do not seem to have a problem with the extension. (Tested using X1400 Mobility and 2900 HD XT) Any help solving this strange bug is greatly appreciated! Thanks! A. Retardo

Share this post


Link to post
Share on other sites
Hodgman    51335
Hmmm strange indeed that it works on some cards but not others!

My first thought is that perhaps there's some kind of memory corruption problem in your code that is causing you to pass garbage into glDetachObjectARB. Perhaps ATI's driver is more robust (for once) and silently ignores the garbage, while NVidia's driver trusts you more and tries to use the garbage but crashes.


What is this cast for:
HFBaseShader * shader = (HFBaseShader*)(*i);

Is HFVirtualShader a sub-class of HFBaseShader?

If so, then the cast is not needed, and if not... bad stuff... Anyway, if you do need to cast you should be using a C++ one, not a C one ;)

Share this post


Link to post
Share on other sites
Yup HFVirtualShader is a sub-class, however to access the UnloadAssets() function it has to be type-cast to the HFBaseShader (a little hack I did, since my alternative (Cg) doesn't require the UnloadAssets() function and is deleted in a different way, in it's own inherited class. It's bad program design, but it shouldn't be the cause of the problem?)

I'm quite sure its not a memory corruption problem, because I placed a break point at glDetachObjectARB and the first time it calls (before any other actual deletion is done) it crashes. (p.s. I'm not calling glDetachObjectARB anywhere else in the code).

I know I should be using the C++ cast.. but I got lazy :P (will probably implement it later once I solve this bug though.)

Share this post


Link to post
Share on other sites
ma_hty    100
Quote:
Original post by Amazing Retardo
...
I'm quite sure its not a memory corruption problem, because I placed a break point at glDetachObjectARB and the first time it calls (before any other actual deletion is done) it crashes. (p.s. I'm not calling glDetachObjectARB anywhere else in the code).
...


Your interpretation about memory corruption is incorrect. When you have memory corruption, the behavior will become unpredictable. It may or may not cause a access violation depending on the content of the memory. However, when your program end up with a access violation, it is almost saying your program have memory corruption.

Share this post


Link to post
Share on other sites
ma_hty    100
The location of the memory corruption can be anywhere of your source code. Although it causing a access violation during deleting a extension, it doesn't imply the memory corruption is located in the routine about the extension. For memory corruption, all outcomes are possible anyway.

I suggest you debug your application as a whole, especially for the memory allocation routine and the destructor of all your C++ class. Although this is going to be a very difficult debugging process, it doesn't sound all that bad actually. At least, you knew your program has a bug as it cause a access violation occasionally. The situation can be even worst if the bug just causing the result incorrect occasionally. In this case, you will not alerted of the bug until it cause a problem to your customer, painful isn't it?

Share this post


Link to post
Share on other sites
It's strange though, how it only breaks at that line on computers with nvidia cards. Strangely enough, on all the computers I tested on it crashed on the exact same line only on nvidia cards. Ah well, could be like what Hodgman described it. At any rate, I'll start debugging the code the moment I get access to my workstation.

Thanks!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By pseudomarvin
      I assumed that if a shader is computationally expensive then the execution is just slower. But running the following GLSL FS instead just crashes
      void main() { float x = 0; float y = 0; int sum = 0; for (float x = 0; x < 10; x += 0.00005) { for (float y = 0; y < 10; y += 0.00005) { sum++; } } fragColor = vec4(1, 1, 1 , 1.0); } with unhandled exception in nvoglv32.dll. Are there any hard limits on the number of steps/time that a shader can take before it is shut down? I was thinking about implementing some time intensive computation in shaders where it would take on the order of seconds to compute a frame, is that possible? Thanks.
    • By Arulbabu Donbosco
      There are studios selling applications which is just copying any 3Dgraphic content and regenerating into another new window. especially for CAVE Virtual reality experience. so that the user opens REvite or CAD or any other 3D applications and opens a model. then when the user selects the rendered window the VR application copies the 3D model information from the OpenGL window. 
      I got the clue that the VR application replaces the windows opengl32.dll file. how this is possible ... how can we copy the 3d content from the current OpenGL window.
      anyone, please help me .. how to go further... to create an application like VR CAVE. 
       
      Thanks
    • By cebugdev
      hi all,

      i am trying to build an OpenGL 2D GUI system, (yeah yeah, i know i should not be re inventing the wheel, but this is for educational and some other purpose only),
      i have built GUI system before using 2D systems such as that of HTML/JS canvas, but in 2D system, i can directly match a mouse coordinates to the actual graphic coordinates with additional computation for screen size/ratio/scale ofcourse.
      now i want to port it to OpenGL, i know that to render a 2D object in OpenGL we specify coordiantes in Clip space or use the orthographic projection, now heres what i need help about.
      1. what is the right way of rendering the GUI? is it thru drawing in clip space or switching to ortho projection?
      2. from screen coordinates (top left is 0,0 nd bottom right is width height), how can i map the mouse coordinates to OpenGL 2D so that mouse events such as button click works? In consideration ofcourse to the current screen/size dimension.
      3. when let say if the screen size/dimension is different, how to handle this? in my previous javascript 2D engine using canvas, i just have my working coordinates and then just perform the bitblk or copying my working canvas to screen canvas and scale the mouse coordinates from there, in OpenGL how to work on a multiple screen sizes (more like an OpenGL ES question).
      lastly, if you guys know any books, resources, links or tutorials that handle or discuss this, i found one with marekknows opengl game engine website but its not free,
      Just let me know. Did not have any luck finding resource in google for writing our own OpenGL GUI framework.
      IF there are no any available online, just let me know, what things do i need to look into for OpenGL and i will study them one by one to make it work.
      thank you, and looking forward to positive replies.
    • By fllwr0491
      I have a few beginner questions about tesselation that I really have no clue.
      The opengl wiki doesn't seem to talk anything about the details.
       
      What is the relationship between TCS layout out and TES layout in?
      How does the tesselator know how control points are organized?
          e.g. If TES input requests triangles, but TCS can output N vertices.
             What happens in this case?
      In this article,
      http://www.informit.com/articles/article.aspx?p=2120983
      the isoline example TCS out=4, but TES in=isoline.
      And gl_TessCoord is only a single one.
      So which ones are the control points?
      How are tesselator building primitives?
    • By Orella
      I've been developing a 2D Engine using SFML + ImGui.
      Here you can see an image
      The editor is rendered using ImGui and the scene window is a sf::RenderTexture where I draw the GameObjects and then is converted to ImGui::Image to render it in the editor.
      Now I need to create a 3D Engine during this year in my Bachelor Degree but using SDL2 + ImGui and I want to recreate what I did with the 2D Engine. 
      I've managed to render the editor like I did in the 2D Engine using this example that comes with ImGui. 
      3D Editor preview
      But I don't know how to create an equivalent of sf::RenderTexture in SDL2, so I can draw the 3D scene there and convert it to ImGui::Image to show it in the editor.
      If you can provide code will be better. And if you want me to provide any specific code tell me.
      Thanks!
  • Popular Now