d26ae4f455a2ebfb4bf4fba62dd93a050603b8e2

Add OpenCL kernels implementing the tessellation algorithm on device. This is an OpenCL C port of the D3D11 reference tessellator, originally written by Microsoft in C++. There are significant differences compared to the CPU based reference implementation: * significant simplifications and clean up. The reference code did a lot of things in weird ways that would be inefficient on the GPU. I did a *lot* of work here to get good AGX assembly generated for the tessellation kernels ... the first attempts were quite bad! Notably, everything is carefully written to ensure that all private memory access is optimized out in NIR; the resulting kernels do not use scratch and do not spill on G13. * prefix sum variants. To implement geom+tess efficiently, we need to first calculate the count of indices generated by the tessellator, then prefix sum that, then tessellate using the prefix sum results writing into 1 large index buffer for a single indirect draw. This isn't too bad, we already have most of the logic and the guts of the prefix sum kernel is shared with geometry shaders. * VDM generation variant. To implement tess alone, it's fastest to generate a hardware Index List word for each patch, adding an appropriate 32-bit index bias to the dynamically allocated U16 index buffers. Then from the CPU, we have the illusion of a single draw to Stream Link with Return to. This requires packing hardware control words from the tessellator kernel. Fortunately, we have GenXML available so we just use agx_pack like we would in the driver. Along the way, we pick up indirect tess support (this follows on naturally), which gets rid of the other bit of tessellation-related cheating. Implementing this requires reworking our internal agx_launch data structures, but that has the nice side effect of speeding up GS invocations too (by fixing the workgroup size). Don't get me wrong. tessellator.cl is the single most unhinged file of my career, featuring GenXML-based pack macros fed by dynamic memory allocation fed by the inscrutable tessellation algorithm. But it works *really* well. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30051>
`Mesa <https://mesa3d.org>`_ - The 3D Graphics Library ====================================================== Source ------ This repository lives at https://gitlab.freedesktop.org/mesa/mesa. Other repositories are likely forks, and code found there is not supported. Build & install --------------- You can find more information in our documentation (`docs/install.rst <https://docs.mesa3d.org/install.html>`_), but the recommended way is to use Meson (`docs/meson.rst <https://docs.mesa3d.org/meson.html>`_): .. code-block:: sh $ mkdir build $ cd build $ meson .. $ sudo ninja install Support ------- Many Mesa devs hang on IRC; if you're not sure which channel is appropriate, you should ask your question on `OFTC's #dri-devel <irc://irc.oftc.net/dri-devel>`_, someone will redirect you if necessary. Remember that not everyone is in the same timezone as you, so it might take a while before someone qualified sees your question. To figure out who you're talking to, or which nick to ping for your question, check out `Who's Who on IRC <https://dri.freedesktop.org/wiki/WhosWho/>`_. The next best option is to ask your question in an email to the mailing lists: `mesa-dev\@lists.freedesktop.org <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>`_ Bug reports ----------- If you think something isn't working properly, please file a bug report (`docs/bugs.rst <https://docs.mesa3d.org/bugs.html>`_). Contributing ------------ Contributions are welcome, and step-by-step instructions can be found in our documentation (`docs/submittingpatches.rst <https://docs.mesa3d.org/submittingpatches.html>`_). Note that Mesa uses gitlab for patches submission, review and discussions.
Description
Languages
C
75.3%
C++
18.2%
Python
2.7%
Assembly
1.5%
Rust
1.2%
Other
0.9%