|
SIGSEGV when attaching shaders |
brisingr123
Member #15,673
July 2014
|
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. |
Slartibartfast
Member #8,789
June 2007
|
al_attach_shader_source expects the source code for the shader, not a path to the shader. ---- |
brisingr123
Member #15,673
July 2014
|
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? |
Slartibartfast
Member #8,789
June 2007
|
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? brisingr123 said: 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? ---- |
brisingr123
Member #15,673
July 2014
|
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. EDIT : https://www.allegro.cc/forums/thread/613773/995477#target 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);
|
Slartibartfast
Member #8,789
June 2007
|
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. References
---- |
brisingr123
Member #15,673
July 2014
|
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 |
Edgar Reynaldo
Major Reynaldo
May 2007
|
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. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
|