1e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenHow to add a new post-processing filter
2e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen=======================================
3e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
4e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenThe Gallium post-processing queue works by passing the current screen to a fragment shader.
5e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenThese shaders may be written in any supported language, but are added here in TGSI text
6e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenassembly.
7e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
8e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenYou can translate GLSL/ARB fairly easily via llvmpipe (LP_DEBUG=tgsi). I don't know the
9e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenstatus of the D3D state tracker, but if/when that works, I'd assume HLSL would be possible
10e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanentoo.
11e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
12e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
13e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
14e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenSteps
15e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen=====
16e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
17e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen1. Add it to PP
18e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen2. Make it known to PP
19e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen3. Make it known to driconf
20e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen4. ????
21e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen5. Profit
22e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
23e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
24e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
25e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
26e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen1. Add it to PP
27e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen---------------
28e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
29e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenOnce you have the shader(s) in TGSI asm, put them to static const char arrays in a header
30e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenfile (see pp_colors.h).
31e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
32e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenAdd the filter's prototypes (main and init functions) to postprocess.h. This is mostly a
33e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanencopy-paste job with only changing the name.
34e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
35e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenThen create a file containing empty main and init functions, named as you specified above.
36e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenSee pp_colors.c for an example.
37e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
38e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
39e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
40e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen2. Make it known to PP
41e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen----------------------
42e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
43e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenAdd your filter to filters.h, in a correct place. Placement is important, AA should usually
44e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenbe the last effect in the queue for example.
45e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
46e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenName is the config option your filter will be enabled by, both in driconf and as an env var.
47e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
48e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenInner temp means an intermediate framebuffer you may use in your filter to store
49e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenresults between passes. If you have a single-pass filter, request 0 of those.
50e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
51e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenShaders is the number of shaders your filter needs. The minimum is 2.
52e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
53e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
54e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenYou could also write the init and main functions now. If your filter is single-pass without
55e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanena vertex shader and any other input than the main screen, you can use pp_nocolor as your
56e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenmain function as is.
57e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
58e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
59e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
60e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen3. Make it known to driconf
61e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen---------------------------
62e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
63e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenFirst time outside of auxiliary/postprocess. First, add a suitable description to
64e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanendrivers/dri/common/xmlpool/t_options.h, and regenerate options.h by running make in that
65e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanendirectory. Use the name you put into filters.h as the config option name.
66e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
67e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenWith driconf aware of the option, make Gallium aware of it too. Add it to
68e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenstate_trackers/dri/common/dri_screen.c in a proper section, specifying its default value and
69e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanenthe accepted range (if applicable).
70e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
71e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenDo check that __driNConfigOptions is still correct after the addition.
72e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
73e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
74e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
75e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen4. ????
76e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen-------
77e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
78e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenTesting, praying, hookers, blow, sacrificial lambs...
79e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
80e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
81e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
82e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen5. Profit
83e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen---------
84e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
85e86e4cf128105db8b3e18d34b28040a26be6516cLauri KasanenAssuming you got here, sharing is caring. Send your filter to mesa-dev.
86e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
87e86e4cf128105db8b3e18d34b28040a26be6516cLauri Kasanen
88