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.