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:
parent
b9c095cc2c
commit
62e902101b
|
@ -34,7 +34,6 @@
|
||||||
#include "pan_encoder.h"
|
#include "pan_encoder.h"
|
||||||
|
|
||||||
#include "util/rounding.h"
|
#include "util/rounding.h"
|
||||||
#include "util/u_pack_color.h"
|
|
||||||
#include "vk_format.h"
|
#include "vk_format.h"
|
||||||
|
|
||||||
static VkResult
|
static VkResult
|
||||||
|
@ -577,90 +576,6 @@ panvk_TrimCommandPool(VkDevice device,
|
||||||
panvk_destroy_cmdbuf(cmdbuf);
|
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
|
static void
|
||||||
panvk_cmd_prepare_clear_values(struct panvk_cmd_buffer *cmdbuf,
|
panvk_cmd_prepare_clear_values(struct panvk_cmd_buffer *cmdbuf,
|
||||||
const VkClearValue *in)
|
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;
|
cmdbuf->state.clear[i].stencil = in[i].depthStencil.stencil;
|
||||||
}
|
}
|
||||||
} else if (attachment->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
|
} 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue