rust-raspberrypi-OS-tutorials/.09_framebuffer/README.md

36 lines
1.7 KiB
Markdown
Raw Normal View History

2018-01-04 17:24:49 +00:00
Tutorial 09 - Framebuffer
=========================
2018-01-18 12:56:51 +00:00
Okay, finaly some eyecandy :-) So far the screen showed the rainbow splash. Now we're about to change the resolution with
2018-01-04 17:24:49 +00:00
several tags in a single mbox_call, then display a pixmap. I've put a lot of comments for each tag and
argument to help you, see lfb.c. But at the end of the day it's nothing more than filling up an int array
and call mbox_call, really simple. If you wish, you can try to remove or add more tags to the message and
see what happens. Could have used MBOX_CH_FB (FrameBuffer channel), but MBOX_CH_PROP gives us more flexibility.
Important note on pitch: maybe you don't know, but video screens does not necessairly map raster lines
2018-01-18 13:20:17 +00:00
continously in memory. For example it is possible that 800 pixels (800 * 4=3200 bytes) are stored in 4096
bytes for every line. Therefore it's important to use the queried pitch value instead of width * 4 when
2018-01-04 17:24:49 +00:00
calculating the postition for the Y coordinate.
Also note that the GPU on the Raspberry Pi is very powerful. You can create a large virtual screen (let's say
65536x768) but display only 1024x768 pixels at once. With mailbox messages you can move that window very fast
without the need of copying pixel buffers, thus creating a smooth scrolling effect. In this tutorial both
virtual screen and physical screen is set to 1024x768.
Lfb.h, lfb.c
------------
`lfb_init()` sets up resolution, depth, and color channel order. Also queries framebuffer's address.
`lfb_showpicture()` displays a picture in the center of the screen by drawing pixels to the framebuffer.
Homer.h
-------
The pixmap, saved with the Gimp as C header file. No compression, pixels are stored one-by-one.
Main
----
Very simple. We set the resolution and display the picture, that's all.