+#define PACK_F(type) util_format_##type##_pack_rgba_float \
+ ( (uint8_t*) &clear_value[0], 0, tmp, 0, 1, 1)
+ switch (vk_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, PIPE_SWIZZLE_X)) {
+ case 4:
+ PACK_F(r4g4b4a4_unorm);
+ break;
+ case 5:
+ if (vk_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, PIPE_SWIZZLE_Y) == 6)
+ PACK_F(r5g6b5_unorm);
+ else
+ PACK_F(r5g5b5a1_unorm);
+ break;
+ case 8:
+ if (vk_format_is_snorm(format))
+ PACK_F(r8g8b8a8_snorm);
+ else if (vk_format_is_unorm(format))
+ PACK_F(r8g8b8a8_unorm);
+ else
+ pack_int8(clear_value, val->color.uint32);
+ break;
+ case 10:
+ if (vk_format_is_int(format))
+ pack_int10_2(clear_value, val->color.uint32);
+ else
+ PACK_F(r10g10b10a2_unorm);
+ break;
+ case 11:
+ clear_value[0] = float3_to_r11g11b10f(val->color.float32);
+ break;
+ case 16:
+ if (vk_format_is_snorm(format))
+ PACK_F(r16g16b16a16_snorm);
+ else if (vk_format_is_unorm(format))
+ PACK_F(r16g16b16a16_unorm);
+ else if (vk_format_is_float(format))
+ PACK_F(r16g16b16a16_float);
+ else
+ pack_int16(clear_value, val->color.uint32);
+ break;
+ case 32:
+ memcpy(clear_value, val->color.float32, 4 * sizeof(float));
+ break;
+ default:
+ unreachable("unexpected channel size");
+ }
+#undef PACK_F