This series addresses the following issues with the current ClearUnorderedAccessView* implementation: - Supports arbitrary buffer formats, not just R32_{UINT,TYPELESS}. - Handles images with non-UINT formats in ClearUnorderedAccessViewUint. - Avoids transfer stage barriers by always using a compute shader. - Implements ClearUnorderedAccessViewFloat, which was previously not supported. - Supports clear rects.
It should be possible to reuse a lot of the preliminary work for future meta operations (such as depth<->color clears mentioned on https://wiki.winehq.org/Vkd3d_known_issues).
As for shaders, I did try to hook up glslangValidator to the build system so that they could be compiled at build time, but without success, so I put the binaries into their own header file.
Unfortunately, the number of permutations is fairly high (12 in this case), and it seems impossible to generate a single SPIR-V binary with multiple entry points (GLSL requires the entry point to be 'main' so there can only be one, and none of the easily accessible HLSL compilers seem to support it either).
An alternative would be to generate the SPIR-V shaders on the fly, but the SPIR-V builder from vkd3d-shader is private so this would require a lot of additional work.
Note that this may conflict with the following pending patches (haven't checked in detail): - 171883 "vkd3d: Allocate one large buffer for a heap and offset into it." - 172639 "vkd3d: Store a copy of Vulkan view object handles in descriptors."