Puzzling this gp2x-allegro..:
I still get (almost double!) faster framerates just blitting a buffer to screen rather than swapping the screen pointer; doesn't seem to matter whether it's a video or system bitmap.
EDIT1:
* Looking at gp2x_gfx.c - it implies there is no difference between system/video/'normal' bitmaps??
* I guess memory is just memory in the gp2x - no fast video memory?
Swapping screens using
show_video_bitmap() is slow - which is completely the opposite to what I expected..
Can't believe that setting a couple of registers (whether for scroll or swap) is slower than setting up the blitter and copying 320x240x16 bits of data to the screen... I'm obviously missing something!
I take it the mmsp2 mem-mapped registers are documented somewhere (will look at wiki, paeryn's SDL lib source and rlyeh's minimal lib for direction).
I suspect the wait 4 vsync code isn't up-to-date either - were there bits inverted in a new firmware (I remember seeing the ability to invert things like this in a datasheet)?
EDIT2:
Looks to me like memory is 'just memory' on the gp2x -
I guess this is common knowledge to many people, but info is a bit thin on the ground.
For interest - Allegro currently supports the following (my commented lib code):CODE
GFX_DRIVER gfx_gp2x =
{
GFX_GP2X,
empty_string,
empty_string,
"GP2X",
gp2x_gfx_init,
gp2x_gfx_exit,
gp2x_gfx_scroll,
gp2x_gfx_vsync,
gp2x_gfx_set_palette,
NULL, // no request scroll
NULL, // no poll_scroll
NULL, // no triple buffering
NULL, // no create_video_bitmap
NULL, // no destroy_video_bitmap
NULL, // no show_video_bitmap
NULL, // no request_video_bitmap
NULL, // no create_system_bitmap
NULL, // no destroy_system_bitmap
NULL, // no set_mouse_sprite
NULL, // no show_mouse
NULL, // no hide_mouse
NULL, // no move_mouse
NULL, // no drawing_mode
NULL, // no save_video_state
NULL, // no restore_video_state
NULL, // no set_blender_mode
gp2x_gfx_fetch_mode_list,
0, 0, // bank size, granularity
TRUE, // video memory is linear
0, // bank size
0, // bank granularity
0, // video memory size
0, // physical address of video memory
FALSE // windowed
};
The switch video screen use the scroll routine
gp2x_gfx_scroll() -
that just sets the two video address pointers addr:lo+hi & interlaced addr:lo+hi..
However there is a
vsync() call in there, so this explains the apparent 'slowness'.
Doesn't seem to explain why
parallax.gpe flickers though
EDIT3:
At last, with small changes to the allegro lib, the
parallax demo is now not flickering -
Have changed lib
vsync() and removed the
vsync() call in
show_video_bitmap() allegro lib function; I now call it implicitly if I want it.
EDIT4:
Have now added
dummyblit() to my allegro lib code [at end of
__allegro_linux_gp2x_init()] and that's sorted the
black screen problem with everything I have built so far...