| How to add a new post-processing filter |
| ======================================= |
| |
| The Gallium post-processing queue works by passing the current screen to a fragment shader. |
| These shaders may be written in any supported language, but are added here in TGSI text |
| assembly. |
| |
| You can translate GLSL/ARB fairly easily via llvmpipe (LP_DEBUG=tgsi). I don't know the |
| status of the D3D gallium frontend, but if/when that works, I'd assume HLSL would be possible |
| too. |
| |
| |
| |
| Steps |
| ===== |
| |
| 1. Add it to PP |
| 2. Make it known to PP |
| 3. Make it known to driconf |
| 4. ???? |
| 5. Profit |
| |
| |
| |
| |
| 1. Add it to PP |
| --------------- |
| |
| Once you have the shader(s) in TGSI asm, put them to static const char arrays in a header |
| file (see pp_colors.h). |
| |
| Add the filter's prototypes (main and init functions) to postprocess.h. This is mostly a |
| copy-paste job with only changing the name. |
| |
| Then create a file containing empty main and init functions, named as you specified above. |
| See pp_colors.c for an example. |
| |
| |
| |
| 2. Make it known to PP |
| ---------------------- |
| |
| Add your filter to filters.h, in a correct place. Placement is important, AA should usually |
| be the last effect in the queue for example. |
| |
| Name is the config option your filter will be enabled by, both in driconf and as an env var. |
| |
| Inner temp means an intermediate framebuffer you may use in your filter to store |
| results between passes. If you have a single-pass filter, request 0 of those. |
| |
| Shaders is the number of shaders your filter needs. The minimum is 2. |
| |
| |
| You could also write the init and main functions now. If your filter is single-pass without |
| a vertex shader and any other input than the main screen, you can use pp_nocolor as your |
| main function as is. |
| |
| |
| |
| 3. Make it known to driconf |
| --------------------------- |
| |
| First time outside of auxiliary/postprocess. First, add a suitable description to |
| src/util/driconf.h. |
| Use the name you put into filters.h as the config option name. |
| |
| With driconf aware of the option, make Gallium aware of it too. Add it to |
| frontends/dri/common/dri_screen.c in a proper section, specifying its default value and |
| the accepted range (if applicable). |
| |
| Do check that __driNConfigOptions is still correct after the addition. |
| |
| |
| |
| 4. ???? |
| ------- |
| |
| Testing, praying, hookers, blow, sacrificial lambs... |
| |
| |
| |
| 5. Profit |
| --------- |
| |
| Assuming you got here, sharing is caring. Send your filter to mesa-dev. |
| |
| |