That one is probably a little harder. I'm not sure "\[require\]" is the ideal place for this, but I imagine fundamentally we want something equivalent to this:
``` [loop sm=1,2,3]
...
[pixel shader] ...
[test] ...
...
[endloop] ```
or
``` [require] foreach shader model = 1.0, 2.0, 3.0
...
[require] ```
I'd rather go with the second one and avoid complicating the `.shader_test` parser by introduction the concept of blocks. It might be that the name `[require]` is increasingly less sensible, but that can be solved by changing to something like `[metadata]` or `[config]`. Another thing it might be nice to have, not necessarily now, is to gate `todo` on something else than shader model. The use case I have in mind is changing the shader runner so that under Windows it can compile shaders with vkd3d-shader and run them with native D3D implementations, or alternatively compile them with the native compiler and run them with vkd3d. In these cases it is important to know whether `todo`'s are to be attributed to the shader compiler or shader executor. -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/418#note_51309