|
Allegro 5 - Cannot Destroy Shader |
DragonDePlatino
Member #16,608
December 2016
|
I don't understand... 1#include <allegro5/allegro5.h>
2#include <stdio.h>
3
4int main(void) {
5 al_init();
6 al_create_display(1280, 720);
7
8 ALLEGRO_SHADER* shader = al_create_shader(ALLEGRO_SHADER_AUTO);
9
10 if (NULL == shader) {
11 printf("Failed to initialize shader.");
12 }
13
14 al_destroy_shader(shader);
15}
Call Stack: 1#0 0x4be280 hlsl_destroy_shader(shader=0xdf6890) (C:/dev/allegro_winpkg/universal/allegro/src/win/d3d_shader.cpp:319)
2#1 0x43962b al_destroy_shader(shader=0xdf6890) (C:/dev/allegro_winpkg/universal/allegro/src/shader.c:232)
3#2 0x405b6a main() (C:\Users\Platino\Documents\C\Crucis\src\main.c:32)
Why does this crash when I attempt to destroy the shader? I haven't even attempted to attach a source yet. I've read through the documentation here, looked at the examples here and checked my allegro.log for anything odd. This is frustrating beyond belief. |
Edgar Reynaldo
Major Reynaldo
May 2007
|
What version of Allegro are you using? When it crashes type bt full and check the local variables. 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 |
DragonDePlatino
Member #16,608
December 2016
|
Wow. Never used GDB before. Nor did I know that existed before you mentioned it. 1(gdb) bt full
2#0 0x00000000004be2d0 in hlsl_destroy_shader (shader=0x3f6850)
3 at C:/dev/allegro_winpkg/universal/allegro/src/win/d3d_shader.cpp:319
4 hlsl_shader = 0x3f6850
5 __func__ = "hlsl_destroy_shader"
6#1 0x000000000043967b in al_destroy_shader (shader=0x3f6850)
7 at C:/dev/allegro_winpkg/universal/allegro/src/shader.c:232
8 bmp = 0x26337b8
9 i = 0
10 __func__ = "al_destroy_shader"
11#2 0x0000000000405b6a in main ()
12 at C:\Users\Platino\Documents\C\Crucis\src\main.c:35
13 shader = 0x3f6850
Is that what you're looking for? I'm using a static x64 version of Allegro 5.2.2. |
SiegeLord
Member #7,827
October 2006
|
It looks like a bug in Allegro, the only way to avoid it (aside from not destroying the shader) is to actually add sources and build it. "For in much wisdom is much grief: and he that increases knowledge increases sorrow."-Ecclesiastes 1:18 |
DragonDePlatino
Member #16,608
December 2016
|
1#include <allegro5/allegro5.h>
2#include <stdio.h>
3
4int main(void) {
5 al_init();
6 al_create_display(1280, 720);
7
8 ALLEGRO_SHADER* shader = al_create_shader(ALLEGRO_SHADER_AUTO);
9 ALLEGRO_SHADER_PLATFORM platform = al_get_shader_platform(shader);
10
11 if (NULL == shader) {
12 puts("Failed to initialize shader.\n");
13 }
14
15 FILE* test_file = fopen("share/test.glsl", "r");
16
17 if (NULL == test_file) {
18 puts("Failed to find GLSL shader.");
19 exit(1);
20 }
21
22 fclose(test_file);
23 test_file = fopen("share/test.hlsl", "r");
24
25 if (NULL == test_file) {
26 puts("Failed to find HLSL shader.");
27 exit(1);
28 }
29
30 fclose(test_file);
31
32 bool success = false;
33 if (platform == ALLEGRO_SHADER_GLSL) {
34 success = al_attach_shader_source_file(shader, ALLEGRO_PIXEL_SHADER, "share/test.glsl");
35 } else if (platform == ALLEGRO_SHADER_HLSL) {
36 success = al_attach_shader_source_file(shader, ALLEGRO_PIXEL_SHADER, "share/test.hlsl");
37 } else {
38 puts("Failed to identify shader platform.\n");
39 exit(1);
40 }
41
42 if (!success) {
43 puts("Failed to attach shader source.\n");
44 exit(1);
45 }
46
47 al_build_shader(shader);
48 al_destroy_shader(shader);
49 al_uninstall_system();
50}
When I run this, it creates the shader and correctly finds both of the shader files with fopen(). The platform is identified as ALLEGRO_SHADER_HLSL and line 36 is run. My console then prints "Failed to attach shader source." I don't know how to write HLSL shaders yet so I used ex_prim_shader_pixel.glsl and ex_prim_shader_pixel.hlsl from here. This is the GDB output: 1(gdb) run
2Starting program: C:\Users\Platino\Documents\C\Crucis\bin-debug\crucis.exe
3[New Thread 3644.0x1884]
4[New Thread 3644.0xfc4]
5[New Thread 3644.0x1b20]
6[New Thread 3644.0x18cc]
7[New Thread 3644.0xf1c]
8[New Thread 3644.0x1638]
9Failed to attach shader source.
10
11
12Program received signal SIGSEGV, Segmentation fault.
130x00000000004be240 in hlsl_destroy_shader (shader=0x1236850)
14 at C:/dev/allegro_winpkg/universal/allegro/src/win/d3d_shader.cpp:319
15319 C:/dev/allegro_winpkg/universal/allegro/src/win/d3d_shader.cpp: No such
16file or directory.
17(gdb) bt full
18#0 0x00000000004be240 in hlsl_destroy_shader (shader=0x1236850)
19 at C:/dev/allegro_winpkg/universal/allegro/src/win/d3d_shader.cpp:319
20 hlsl_shader = 0x1236850
21 __func__ = "hlsl_destroy_shader"
22#1 0x00000000004395eb in al_destroy_shader (shader=0x1236850)
23 at C:/dev/allegro_winpkg/universal/allegro/src/shader.c:232
24 bmp = 0x3137b8
25 i = 0
26 __func__ = "al_destroy_shader"
27#2 0x00000000004314c2 in _al_run_destructors (dtors=0x1234520)
28 at C:/dev/allegro_winpkg/universal/allegro/src/dtor.c:120
29 dtor = 0x31db60
30 object = 0x1236850
31 func = 0x4393fd <al_destroy_shader>
32 iter = 0x31dbb0
33 __func__ = "_al_run_destructors"
34#3 0x000000000043a464 in al_uninstall_system ()
35 at C:/dev/allegro_winpkg/universal/allegro/src/system.c:311
36 __func__ = "al_uninstall_system"
37#4 0x00007ffe46fe6e1f in msvcrt!_flushall ()
38 from C:\Windows\system32\msvcrt.dll
39No symbol table info available.
40#5 0x0000000000405c6e in main ()
41 at C:\Users\Platino\Documents\C\Crucis\src\main.c:44
|
SiegeLord
Member #7,827
October 2006
|
The destructor crash is fixed on the master branch, but that's unrelated to your issues with attaching the source. Could you try seeing if al_get_shader_log returns anything? "For in much wisdom is much grief: and he that increases knowledge increases sorrow."-Ecclesiastes 1:18 |
DragonDePlatino
Member #16,608
December 2016
|
If I use the example shader I found here then print al_get_shader_log after attaching the source, I get the following error: 1C:\Users\Platino\Documents\C\Crucis\memory(11,16): error X3000: unrecognized ide
2ntifier 'VS_OUTPUT'
3Failed to attach shader source.
If I use the following pixel shader I found here... 1float4 PixelShaderFunction() : COLOR0
2{
3 return float4(1, 0, 0, 1);
4}
...then it successfully attaches, builds, then destroys. Finally! I haven't learned HLSL so I don't understand what VS_OUTPUT is. In the past, I used SFML which defaulted to GLSL. Is there any reason why allegro is forcing me to use HLSL? Would I get a performance penalty if I switched to GLSL? Is that even possible on Windows 8.1? Would it be portable? On another note, could there please be an allegro error to reflect this quirk with shaders? It would be nice if you got a printout like "Cannot destroy a shader without attaching source." when you attempt doing so. It would've saved me several days and a lot of frustration getting this to work. The shader was going to be for something very minor, anyways. |
SiegeLord
Member #7,827
October 2006
|
Oh, VS_OUTPUT is defined in the vertex shader, I guess you had to attach both for it to work. You can use GLSL too if you want, there is a tiny performance penalty but nothing that should prevent you from using it. Do this by adding al_set_new_display_flags(ALLEGRO_OPENGL) before creating the display. As for destroying the shaders, your original code will work in the next release without the crash. "For in much wisdom is much grief: and he that increases knowledge increases sorrow."-Ecclesiastes 1:18 |
Elias
Member #358
May 2000
|
Also, if you want your game to ever work anywhere besides Windows, you will want GLSL anyway -- |
DragonDePlatino
Member #16,608
December 2016
|
Ah, I see. In that case, I'll switch to OpenGL and use that for all platforms. Thanks for helping me! |
|