2/5 doesn't seem right, prepare_push_constant_buffer() is a client side function and can't be called from the CS. Maybe "prepare" is a misleading name and should be fixed.
It works, technically, since I'm adding WINED3DUSAGE_PRIVATE to the buffer (which maybe should be there anyway). But I understand if it's not acceptable.
I guess the problem here is that we have a NULL buffer in this case. Instead of creating the buffer anyway I think we should just skip loading constants.
That's the problem, yes, but it's a bit more subtle. Specifically, the ARB backend accesses int / bool constant data directly (because in general shader generation depends on those values) and it might happen that the shader has no constants at all, so there is no previous call to wined3d_device_context_push_constants().
It's probably not as critical with the GLSL backend but in theory the issue is there as well I think?
Skipping constant loading altogether should do the trick though, I'll give that a try.