panvk: Use pan_pack_color

This is in common code now. Inherit all the bug fixes from panfrost.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12365>
This commit is contained in:
Alyssa Rosenzweig 2021-08-13 21:10:55 +00:00 committed by Marge Bot
parent b9c095cc2c
commit 62e902101b
1 changed files with 2 additions and 86 deletions

View File

@ -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);
}
}
}