Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » Allegro SVN & Retrieving Display Modes

Credits go to Elias for helping out!
This thread is locked; no one can reply to it. rss feed Print
Allegro SVN & Retrieving Display Modes
Erin Maus
Member #7,537
July 2006
avatar

I "upgraded" to the latest SVN version today (from being between 4.9.7 release and 4.9.8 release, again, with SVN) and I ran into a strange problem.

I compiled Allegro as a shared library. No problems during compiling, everything went fine. I then had to make a few modifications to my game-thing, as expected. After it finally compiled properly, I tried to run it...and it crashed. I ran it through a debugger, and it crashed when it called the function al_get_num_display_modes in a loop, the first time it was called.

The example program is as follows:

1#include <allegro5/allegro5.h>
2#include <stdio.h>
3 
4int main(void)
5{
6 int index;
7
8 if (!al_init())
9 {
10 printf("Allegro failed to be initialized.");
11 return -1;
12 }
13
14 for (index = 0; index < al_get_num_display_modes(); index++)
15 {
16 ALLEGRO_DISPLAY_MODE mode;
17
18 al_get_display_mode(index, &mode);
19
20 printf("Mode %d:\n", index);
21 printf("\t%d x %d @ %d", mode.width, mode.height,
22 mode.refresh_rate);
23 }
24
25 return 0;
26}
27END_OF_MAIN()

Allegro initializes, but it crashes on al_get_num_display_modes(). The backtrace is as so:

(gdb) bt #0 _al_deduce_color_format (eds=0x0) at C:/Users/veiva/Desktop/Allegro/4.9.8/src/display_settings.c:535 #1 0x6b6b2795 in win_get_num_display_modes () at C:/Users/veiva/Desktop/Allegro/4.9.8/src/win/wnewsys.c:271 #2 0x00401327 in _mangled_main () #3 0x6b6b249b in _WinMain (_main=0x4012f0, hInst=0x400000, hPrev=0x0, Cmd=0x4e22e0 "", nShow=10) at C:/Users/veiva/Desktop/Allegro/4.9.8/src/win/wnewsys.c:136 #4 0x004013b3 in WinMain@16 () #5 0x004014e0 in main ()

It crashes because _al_get_new_display_settings() returns zero, as this part of GDB shows:

Breakpoint 1, win_get_num_display_modes () at C:/Users/veiva/Desktop/Allegro/4.9.8/src/win/wnewsys.c:271 271 int format = _al_deduce_color_format(_al_get_new_display_settings()); (gdb) s _al_get_new_display_settings () at C:/Users/veiva/Desktop/Allegro/4.9.8/src/tls.c:247 247 if ((tls = tls_get()) == NULL) (gdb) n 248 return 0; (gdb)

Yet, if I go "p tls," it shows a valid pointer. If I go "p *tls," it shows this:

(gdb) p *tls $1 = {new_display_refresh_rate = 0, new_display_flags = 0, new_display_settings = 0x0, current_display = <incomplete type>, target_bitmap = <incomplete type>, new_bitmap_format = 0, new_bitmap_flags = 0, blend_source = 2, blend_dest = 3, blend_alpha_source = 2, blend_alpha_dest = 3, blend_color = {r = 1, g = 1, b = 1, a = 1}, allegro_errno = 2}

I compiled Allegro with these commands (or at least, I hope I did! But it's surely a shared library...):

mkdir build cd build cmake .. -G "MinGW Makefiles" make make install

I just want to get my game-thing up and running again! ;) Please tell me which stupid mistake I did!

[edit]Oh, my GCC version is 3.4.5, if that's of any help!

---
ItsyRealm, a quirky 2D/3D RPG where you fight, skill, and explore in a medieval world with horrors unimaginable.
they / she

Elias
Member #358
May 2000

Thanks, can confirm this here. We need to fix it before 4.9.9.

--
"Either help out or stop whining" - Evert

Erin Maus
Member #7,537
July 2006
avatar

Elias said:

Thanks, can confirm this here. We need to fix it before 4.9.9.

Thank you! I was rereading the manual and all, thinking I missed something important that changed since somewhere between 4.9.7 and 4.9.8!

---
ItsyRealm, a quirky 2D/3D RPG where you fight, skill, and explore in a medieval world with horrors unimaginable.
they / she

Milan Mimica
Member #3,877
September 2003
avatar

Can you try calling al_reset_display_options() after al_init()? That should work around it but I'm too lazy to try. Thanks.

Erin Maus
Member #7,537
July 2006
avatar

Doing so stops it from crashing, but then al_get_num_display_modes returns -1, as shown by GDB:

(gdb) p al_get_num_display_modes()
$1 = -1

---
ItsyRealm, a quirky 2D/3D RPG where you fight, skill, and explore in a medieval world with horrors unimaginable.
they / she

Milan Mimica
Member #3,877
September 2003
avatar

You also have to call al_set_new_display_flags(ALLEGRO_FULLSCREEN) apparently.

Go to: