-
Notifications
You must be signed in to change notification settings - Fork 640
Description
I am facing a number of issues attempting to use --convert-relaxed-to-half to convert shaders with RelaxedPrecision into using true float16. Some of them fail in the NVIDIA driver with vkCreateGraphicsPipelines returning VK_ERROR_UNKNOWN, crash in the AMD Windows driver, and assert on RADV. In most cases, I do not get spirv-val errors. Although I was able to find a case that produced a spirv-val error attached in this bug to maybe narrow down the issues.
>spirv-opt --version
SPIRV-Tools v2025.4 v2025.4-0-g7f2d9ee9
>spirv-opt --convert-relaxed-to-half --simplify-instructions --redundancy-elimination --eliminate-dead-code-aggressive relaxed_precision.spv -o half.spv
>spirv-val relaxed_precision.spv --target-env vulkan1.4
>spirv-val half.spv --target-env vulkan1.4
error: line 388: Result type (OpTypeVector) does not match the type that results from indexing into the composite (OpTypeVector).
%19019 = OpCompositeExtract %v4half %14911 0
As shown above, you can produce a spirv-val error by running the input shader (relaxed_precision.spv) through spirv-opt --convert-relaxed-to-half --simplify-instructions --redundancy-elimination --eliminate-dead-code-aggressive relaxed_precision.spv -o half.spv and it will produce a shader with:
error: line 388: Result type (OpTypeVector) does not match the type that results from indexing into the composite (OpTypeVector).
%19019 = OpCompositeExtract %v4half %14911 0
Often, I find it is producing pixel shaders that do not have spirv-val errors, but fail in the driver, such as the other shader pair attached (vr_simple.vfx_vs_34.spv and vr_simple.vfx_ps_34.spv). I unfortunately don't easily have access to the exact inputs that produced the output pixel shader here. Converting those shaders into a foz file with
fossilize-synth --vert vr_simple.vfx_vs_34.spv --frag vr_simple.vfx_ps_34.spv --output vr_simple.foz
and replaying on RADV give an assert:
> fossilize-replay: ../src/amd/compiler/instruction_selection/aco_select_nir.cpp:145: void aco::(anonymous namespace)::visit_tex(isel_context *, nir_tex_instr *): Assertion `instr->src[i].src.ssa->bit_size == (a16 ? 16 : 32)' failed.