Skip to content

vtn: add vtn_bindgen2 tool

Alyssa Rosenzweig requested to merge alyssa/mesa:bindgen into main

This is a rewrite of vtn_bindgen. For now the two tools live in parallel, to give Intel time to migrate off v1.

For a refresher, the classic vtn_bindgen reads a SPIR-V and generates a .h containing nir_builder stubs for each exported function. The stub inserts an unimplemented nir_function with the proper signature into the shader, and adds a "call" to that function. The driver is responsible for linking with the library later, which is annoying.

vtn_bindgen2 instead generates a .c/.h pair. The header are just prototypes with identical signatures to what we have now. The .c implementations, however, are very different. Instead of generating unimplemented nir_function, the implementations contain the actual code (as serialized NIR, deserialized on-the-fly). There is no linking step, nor a library nir_shader that the driver has to keep around.

The programming model here is that this is "just" nir_builder ... just a massively more competent way of using nir_builder.

Additionally, the whole SPIR-V -> optimized lowered serialized NIR step is now all common code. There's no longer anything target-specific, and it's disentangled from the nir_precomp infrastructure.

That means drivers can use CL with zero integration, except a few meson.build rules. This gives a very gentle on-ramp to CL for drivers. (Note: that applies only for library-style CL. For precompiled kernel-style CL, that still requires significant driver integration. I do have plans there, though. Also, printf/abort support requires a minimal amount of driver code.)

Furthermore, this unblocks the use of CL library functions in common code. That makes this an important step towards common code geom/tess or maybe saner raytracing.

For drivers already using classic vtn_bindgen, porting to vtn_bindgen2 should just be deleting all your linking/deserializing code. The .cl's are unchanged, as are the function prototypes exposed.


To illustrate how easy the new bindgen is to integrate, this series also includes a port of lavapipe's ray intersection routines to CL. The resulting code is significantly more compact and intelligible. The integration is just meson and #include as promised :-)

Merge request reports

Loading