diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c index aa160c8f3fa..3a19c93ab99 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_cmd_buffer.c @@ -34,7 +34,6 @@ #include "pan_encoder.h" #include "util/rounding.h" -#include "util/u_pack_color.h" #include "vk_format.h" static VkResult @@ -577,90 +576,6 @@ panvk_TrimCommandPool(VkDevice device, panvk_destroy_cmdbuf(cmdbuf); } -static void -panvk_pack_color_32(uint32_t *packed, uint32_t v) -{ - for (unsigned i = 0; i < 4; ++i) - packed[i] = v; -} - -static void -panvk_pack_color_64(uint32_t *packed, uint32_t lo, uint32_t hi) -{ - for (unsigned i = 0; i < 4; i += 2) { - packed[i + 0] = lo; - packed[i + 1] = hi; - } -} - -void -panvk_pack_color(struct panvk_clear_value *out, - const VkClearColorValue *in, - enum pipe_format format) -{ - const struct util_format_description *desc = util_format_description(format); - - /* Alpha magicked to 1.0 if there is no alpha */ - bool has_alpha = util_format_has_alpha(format); - float clear_alpha = has_alpha ? in->float32[3] : 1.0f; - uint32_t *packed = out->color; - - if (util_format_is_rgba8_variant(desc) && desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { - panvk_pack_color_32(packed, - ((uint32_t) float_to_ubyte(clear_alpha) << 24) | - ((uint32_t) float_to_ubyte(in->float32[2]) << 16) | - ((uint32_t) float_to_ubyte(in->float32[1]) << 8) | - ((uint32_t) float_to_ubyte(in->float32[0]) << 0)); - } else if (format == PIPE_FORMAT_B5G6R5_UNORM) { - /* First, we convert the components to R5, G6, B5 separately */ - unsigned r5 = _mesa_roundevenf(SATURATE(in->float32[0]) * 31.0); - unsigned g6 = _mesa_roundevenf(SATURATE(in->float32[1]) * 63.0); - unsigned b5 = _mesa_roundevenf(SATURATE(in->float32[2]) * 31.0); - - /* Then we pack into a sparse u32. TODO: Why these shifts? */ - panvk_pack_color_32(packed, (b5 << 25) | (g6 << 14) | (r5 << 5)); - } else if (format == PIPE_FORMAT_B4G4R4A4_UNORM) { - /* Convert to 4-bits */ - unsigned r4 = _mesa_roundevenf(SATURATE(in->float32[0]) * 15.0); - unsigned g4 = _mesa_roundevenf(SATURATE(in->float32[1]) * 15.0); - unsigned b4 = _mesa_roundevenf(SATURATE(in->float32[2]) * 15.0); - unsigned a4 = _mesa_roundevenf(SATURATE(clear_alpha) * 15.0); - - /* Pack on *byte* intervals */ - panvk_pack_color_32(packed, (a4 << 28) | (b4 << 20) | (g4 << 12) | (r4 << 4)); - } else if (format == PIPE_FORMAT_B5G5R5A1_UNORM) { - /* Scale as expected but shift oddly */ - unsigned r5 = _mesa_roundevenf(SATURATE(in->float32[0]) * 31.0); - unsigned g5 = _mesa_roundevenf(SATURATE(in->float32[1]) * 31.0); - unsigned b5 = _mesa_roundevenf(SATURATE(in->float32[2]) * 31.0); - unsigned a1 = _mesa_roundevenf(SATURATE(clear_alpha) * 1.0); - - panvk_pack_color_32(packed, (a1 << 31) | (b5 << 25) | (g5 << 15) | (r5 << 5)); - } else { - /* Otherwise, it's generic subject to replication */ - - union util_color out = { 0 }; - unsigned size = util_format_get_blocksize(format); - - util_pack_color(in->float32, format, &out); - - if (size == 1) { - unsigned b = out.ui[0]; - unsigned s = b | (b << 8); - panvk_pack_color_32(packed, s | (s << 16)); - } else if (size == 2) - panvk_pack_color_32(packed, out.ui[0] | (out.ui[0] << 16)); - else if (size == 3 || size == 4) - panvk_pack_color_32(packed, out.ui[0]); - else if (size == 6 || size == 8) - panvk_pack_color_64(packed, out.ui[0], out.ui[1]); - else if (size == 12 || size == 16) - memcpy(packed, out.ui, 16); - else - unreachable("Unknown generic format size packing clear colour"); - } -} - static void panvk_cmd_prepare_clear_values(struct panvk_cmd_buffer *cmdbuf, const VkClearValue *in) @@ -677,7 +592,8 @@ panvk_cmd_prepare_clear_values(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.clear[i].stencil = in[i].depthStencil.stencil; } } else if (attachment->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { - panvk_pack_color(&cmdbuf->state.clear[i], &in[i].color, fmt); + union pipe_color_union *col = (union pipe_color_union *) &in[i].color; + pan_pack_color(cmdbuf->state.clear[i].color, col, fmt); } } }