[igt-dev] [PATCH i-g-t v2 1/6] lib/v3d: Add V3D packet helpers
Kamil Konieczny
kamil.konieczny at linux.intel.com
Fri Jan 13 15:24:41 UTC 2023
Hi Maíra,
On 2023-01-12 at 10:15:29 -0300, Maíra Canal wrote:
> In order to make a valid job submission to V3D, some packet helpers are
> needed. They are responsible for handling the data and packing it
> properly. Moreover, they reuse some of the generic packet helpers from
> Mesa, the bit pack helpers. Therefore, add Mesa V3D's packet helpers for
> IGT use.
>
> Reviewed-by: Melissa Wen <mwen at igalia.com>
> Signed-off-by: Maíra Canal <mcanal at igalia.com>
> ---
> lib/bitpack_helpers.h | 78 +++++++++++++++++++++++
> lib/v3d/v3d_packet_helpers.h | 119 +++++++++++++++++++++++++++++++++++
> 2 files changed, 197 insertions(+)
> create mode 100644 lib/bitpack_helpers.h
> create mode 100644 lib/v3d/v3d_packet_helpers.h
>
> diff --git a/lib/bitpack_helpers.h b/lib/bitpack_helpers.h
> new file mode 100644
> index 00000000..358b5d64
> --- /dev/null
> +++ b/lib/bitpack_helpers.h
> @@ -0,0 +1,78 @@
> +/*
Please use SPDX licence here.
> + * Copyright (C) 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#ifndef UTIL_BITPACK_HELPERS_H
> +#define UTIL_BITPACK_HELPERS_H
> +
> +#include <math.h>
> +#include <stdbool.h>
> +#include <stdint.h>
> +
> +#ifndef util_bitpack_validate_value
> +#define util_bitpack_validate_value(x)
> +#endif
> +
> +/** Set a single bit */
> +#define BITFIELD64_BIT(b) (1ull << (b))
> +/** Set all bits up to excluding bit b */
> +#define BITFIELD64_MASK(b) \
> + ((b) == 64 ? (~0ull) : BITFIELD64_BIT(b) - 1)
> +
> +static inline uint64_t
> +util_bitpack_uint(uint64_t v, uint32_t start, __attribute__((unused)) uint32_t end)
> +{
> + util_bitpack_validate_value(v);
> + return v << start;
> +}
> +
> +static inline uint64_t
> +util_bitpack_sint(int64_t v, uint32_t start, uint32_t end)
> +{
> + const int bits = end - start + 1;
> + const uint64_t mask = BITFIELD64_MASK(bits);
> +
> + return (v & mask) << start;
> +}
> +
> +static inline uint64_t
> +util_bitpack_sfixed(float v, uint32_t start, uint32_t end,
> + uint32_t fract_bits)
> +{
> + const float factor = (1 << fract_bits);
> + const int64_t int_val = llroundf(v * factor);
> + const uint64_t mask = ~0ull >> (64 - (end - start + 1));
> +
> + return (int_val & mask) << start;
> +}
> +
> +static inline uint64_t
> +util_bitpack_ufixed(float v, uint32_t start, __attribute__((unused)) uint32_t end,
> + uint32_t fract_bits)
> +{
> + const float factor = (1 << fract_bits);
> + const uint64_t uint_val = llroundf(v * factor);
> +
> + return uint_val << start;
> +}
> +
> +#endif /* UTIL_BITPACK_HELPERS_H */
> diff --git a/lib/v3d/v3d_packet_helpers.h b/lib/v3d/v3d_packet_helpers.h
> new file mode 100644
> index 00000000..3145333d
> --- /dev/null
> +++ b/lib/v3d/v3d_packet_helpers.h
> @@ -0,0 +1,119 @@
> +/*
Same here.
Regards,
Kamil
> + * Copyright (C) 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#ifndef MESA_V3D_PACKET_HELPERS_H
> +#define MESA_V3D_PACKET_HELPERS_H
> +
> +#include <assert.h>
> +#include <stdint.h>
> +
> +#include "bitpack_helpers.h"
> +
> +/*
> + * Copied from Mesa's u_math.h
> + */
> +union fi {
> + float f;
> + int32_t i;
> + uint32_t ui;
> +};
> +
> +static inline float uif(uint32_t ui)
> +{
> + union fi fi;
> + fi.ui = ui;
> + return fi.f;
> +}
> +
> +static inline unsigned fui(float f)
> +{
> + union fi fi;
> + fi.f = f;
> + return fi.ui;
> +}
> +
> +static inline uint64_t
> +__gen_unpack_uint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
> +{
> + uint64_t val = 0;
> + const int width = end - start + 1;
> + const uint32_t mask = (width == 32 ? ~0 : (1 << width) - 1 );
> +
> + for (uint32_t byte = start / 8; byte <= end / 8; byte++) {
> + val |= cl[byte] << ((byte - start / 8) * 8);
> + }
> +
> + return (val >> (start % 8)) & mask;
> +}
> +
> +static inline uint64_t
> +__gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
> +{
> + int size = end - start + 1;
> + int64_t val = __gen_unpack_uint(cl, start, end);
> +
> + /* Get the sign bit extended. */
> + return (val << (64 - size)) >> (64 - size);
> +}
> +
> +static inline float
> +__gen_unpack_sfixed(const uint8_t *restrict cl, uint32_t start, uint32_t end,
> + uint32_t fractional_size)
> +{
> + int32_t bits = __gen_unpack_sint(cl, start, end);
> + return (float)bits / (1 << fractional_size);
> +}
> +
> +static inline float
> +__gen_unpack_ufixed(const uint8_t *restrict cl, uint32_t start, uint32_t end,
> + uint32_t fractional_size)
> +{
> + int32_t bits = __gen_unpack_uint(cl, start, end);
> + return (float)bits / (1 << fractional_size);
> +}
> +
> +static inline float
> +__gen_unpack_float(const uint8_t *restrict cl, uint32_t start, uint32_t end)
> +{
> + struct PACKED { float f; } *f;
> +
> + assert(start % 8 == 0);
> + assert(end - start == 31);
> +
> + f = (void *)(cl + (start / 8));
> +
> + return f->f;
> +}
> +
> +static inline float
> +__gen_unpack_f187(const uint8_t *restrict cl, uint32_t start, uint32_t end)
> +{
> + uint32_t bits;
> +
> + assert(end - start == 15);
> +
> + bits = __gen_unpack_uint(cl, start, end);
> + return uif(bits << 16);
> +}
> +
> +#endif
> --
> 2.39.0
>
More information about the igt-dev
mailing list