1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
rototiller is, rendered entirely in software:
drizzle: a 2D raindrops visualization
flui2d: a 2D fluid dynamics simulation
julia: a morphing Julia set (fractal)
meta2d: a 2D metaballs effect
montage: a montage of modules meta-module
pixbounce: a 2D bouncing pixmap demonstration
plasma: an oldskool "plasma" effect
plato: a basic 3D Platonic solids display
ray: a multi-threaded ray tracer
roto: a simple fixed-point tiled texture rotation
rtv: a "Rototiller TV" slideshow meta-module
snow: a "TV snow" / white noise effect
sparkler: a fireworks-like particle system with spatial interactions
spiro: a Spirograph simulator
stars: a starfield simulator
submit: a 2D cellular automata game sim
swab: a colorful perlin-noise visualization
swarm: "Boids"-inspired particle swarm in 3D
---
This is a quick little graphics hack I put together to experiment with libdrm
and this "dumb buffer" thingy David Airlie added to the kernel back in 2011.
If you're like me and miss the pre-KMS days of functional SVGAlib on linux
where we could write purely software-rendered graphics toys like demos that
were still beautiful and synchronized to vertical retrace without any tearing
or flickering, there is cause to rejoice.
Using libdrm and these two ioctls:
DRM_IOCTL_MODE_CREATE_DUMB
DRM_IOCTL_MODE_MAP_DUMB
We can then mmap into our address space a 32bpp buffer that can be drawn to
while off-screen, and submitted to the gpu for displaying in a page-flipping
fashion, synchronized to the vertical retrace. It's revisiting the 90s, it's
VESA 2.0 linear frame buffers but actually supporting all our crazy native
resolutions and abundant memory for 32bpp with page flipping.
In my testing so far, this seems to work without even requiring root.
Before you try to run these things, realize this is direct libdrm graphics,
it's going to compete with your X/wayland server. Switch to a plain virtual
console to run the program. You don't need to quit X, just switch away from the
X vt so it's not visible.
To quit it's as simple as Ctrl-C, rototiller will otherwise run forever.
Do not try switching back to X while rototiller is drawing, Ctrl-C it first, or
X will get angry and exit when it tries to do drm things and can't.
Your display may be left in an inconsistent state after exiting rototiller.
Don't panic! Just switch virtual consoles or go back to X, graphics will be
restored. This seems like a bug in drm to me. It's genuine SVGAlib dejavu,
corrupt displays and all. BUCKETS OF NOSTALGIA
|