SIGSEGV when attaching shaders

Hello everyone. I've recently started using Allegro, and was initially started out with Allegro 5.0.10. However, I needed shaders for my game, so I decided to port over to 5.1.8. I downloaded the windows binaries that someone in this forum had made for the same, and somewhat clumsily replaced the old header and lib files, although I'm not entirely sure I did it the right way. One way or the other I got the library working and functions like al_get_shader_source that were earlier not working now worked. However, now I've run into a strange problem.

    ALLEGRO_SHADER* shader = al_create_shader(ALLEGRO_SHADER_GLSL);
    if(shader == NULL)
        MessageBox(NULL, "Could not create shader!", "Error!", MB_OK | MB_ICONERROR);
        return 0;
    if (!al_attach_shader_source(shader, ALLEGRO_VERTEX_SHADER, "Assets\\shaders\\tempVert.vert"))
        std::cout << al_get_shader_log(shader);

When I try attaching a shader, the program gives me a SIGSEGV (segmentation fault). Not sure where I'm wrong, so any help would be appreciated.


al_attach_shader_source expects the source code for the shader, not a path to the shader.
The function you were thinking of is al_attach_shader_source_file.


Oh sorry, I got my source messed up.

Actually, I've tried al_attach_shader_source_file, as well as later changed it to al_attach_shader_source while providing the shader code in the program itself, but it crashed either way. So I undo-ed the change, but I guess I didn't undo it completely. So I'm pretty sure the problem is not with not being able to find the file or incorrect shader code - one way or the other, that would generate an error log, not crash my program with segsev.

EDIT : Could not linking to the correct libs (or linking only to some, and not all libs) result in this kind of a thing? I ask coz when I ported from 5.0.10 to 5.1.8, I didn't exactly link to all the lib files - I only linked to those that were present in 5.0.10. Is it possible that the 2 or 3 files that I failed to link to are causing this problem?


Are you sure the crash is in al_attach_shader_source and not later on as a result of it failing when something expected it to have succeeded is called?
Either way it is a good idea to use a debugger to catch the exception, preferably when linking against a version of allegro with debug symbols so you can see exactly what goes wrong.

Is it possible that the 2 or 3 files that I failed to link to are causing this problem?

Not linking to something that is required will cause a linking error, not a runtime error, however if you linked against one library but another got loaded in its place (because they share the same name and one being in a place that puts it in a higher precedence than the other) it could cause all sorts of havoc. Also, if you linked against libraries of both 5.0.10 and 5.1.8 at the same time I don't know what would happen. Are you linking statically or dynamically?


Yup, pretty sure the crash is in attach_shader, since I set a breakpoint at that particular line, the program ran fine till then, but if I pressed "next line" it never went ahead, just gave a sigsev and crashed.

And well, I didn't make the libs myself (as I said, downloaded them from this forum) so not sure if they are debug, but they work well enough. I replaced all the old 5.0.10 libs with the new 5.1.8 ones, so I'm only linking to one of them (new one).

And lastly, static linking it is.

This was from where I downloaded the binaries. I replaced the old includes, and replaced the old allegro libs with the ones given here (for instance, replaced liballegro_acodec-5.0.10-static-mt.a with liballegro_acodec-static.a . However, liballegro_main-static.a, liballegro_video-static.a and libtheora.a have not been linked, since they were not present in 5.0.10, and I wasn't sure of the order of linking these libs.

EDIT 2 : Okay, so I cleaned the entire allegro installation and placed the files again, linked to ALL the files, but still the same problem. The program directly crashed with a sigsev - I can't even use al_get_shader_log() to get the error. Maybe I'm doing something wrong in my code... care to take a look?

1if(!al_init()) 2 { 3 MessageBox(NULL, "Could not initialize Allegro!", "Error!", MB_OK | MB_ICONERROR); 4 return false; 5 } 6 7 al_set_new_display_flags((IS_FULLSCREEN? ALLEGRO_FULLSCREEN: ALLEGRO_WINDOWED) | ALLEGRO_OPENGL_3_0); 8 al_set_new_window_position(683 - SCREEN_WIDTH/2, 384 - SCREEN_HEIGHT/2); 9 10 GAME_DISPLAY = al_create_display(SCREEN_WIDTH, SCREEN_HEIGHT); 11 if(GAME_DISPLAY == NULL) 12 { 13 MessageBox(NULL, "Could not create screen for display!", "Error!", MB_OK | MB_ICONERROR); 14 return 0; 15 } 16 17 al_init_image_addon(); 18 al_init_font_addon(); 19 al_init_ttf_addon(); 20 al_install_keyboard(); 21 al_install_mouse(); 22 23 ALLEGRO_BITMAP* icon = NAMESPACE::LoadImageFromFile("Assets\\icon.png"); 24 al_set_display_icon(GAME_DISPLAY, icon); 25 al_destroy_bitmap(icon); 26 27 NAMESPACE::ShowLoadingScreen(); 28 29 LoadAssets(); 30 31 srand(time(NULL)); 32 33 ALLEGRO_SHADER* shader = al_create_shader(ALLEGRO_SHADER_GLSL); 34 if(shader == NULL) 35 { 36 MessageBox(NULL, "Could not create shaders!", "Error!", MB_OK | MB_ICONERROR); 37 return 0; 38 } 39 if (!al_attach_shader_source_file(shader, ALLEGRO_VERTEX_SHADER, "Assets\\shaders\\tempVert.vert")) 40 std::cout << al_get_shader_log(shader); 41 if (!al_attach_shader_source_file(shader, ALLEGRO_PIXEL_SHADER, "Assets\\shaders\\tempFrag.frag")) 42 std::cout << al_get_shader_log(shader); 43 al_build_shader(shader); 44 al_use_shader(shader);


I'm not sure if that's the issue, but the al_set_new_display_flags[1] documentation states you need to set ALLEGRO_PROGRAMMABLE_PIPELINE if you want to use ALLEGRO_SHADER objects, so that may be it.


  1. note that clicking that link will bring you to 5.0 documentation and not 5.1, you should look at [2] for that.

Well, I did try the ALLEGRO_PROGRAMMABLE_PIPELINE flag initially, but the "al_set_display_icon(GAME_DISPLAY, icon);" line throws a SIGSEV in that case, and I don't even reach the shader part.

EDIT : Okay, to test the theory I moved the shader code between the icon part and the create display part. Still the error.

EDIT 2 : Okay, so I tried an allegro example (ex_shader.cpp), and was surprised to find that al_create_shader(ALLEGRO_SHADER_AUTO) gives me a ALLEGRO_SHADER_HLSL shader instead of ALLEGRO_SHADER_GLSL, and replacing ALLEGRO_SHADER_AUTO with ALLEGRO_SHADER_GLSL actually causes the program to crash. Why this surprises me is because I have set the ALLEGRO_OPENGL_3_0 flag. So, is there any way to force the creation of OpenGL display (I really don't want to be creating 2 shaders - one glsl, and one hlsl), and also, what's the method to check if my display is opengl or directX based?

EDIT 3 : Holy shit, I just figured out the problem - ALLEGRO_OPENGL_3_0 flag is shit! ALLEGRO_OPENGL works like a charm, and I get no more errors.

Not sure why that is, but either way, I'm good to go for now :D

Edgar Reynaldo

It's really confusing, but ALLEGRO_OPENGL_3_0 doesn't give you opengl. You still have to combine it with ALLEGRO_OPENGL. IMO, it should be included with ALLEGRO_OPENGL_3_0 automatically.

Thread #614442. Printed from