From 60d647f9def4b84396fd820fd7a5e6ea7a4f1f0a Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 13 May 2020 12:07:46 -0400 Subject: [PATCH] panfrost: Determine unpacked type for formats Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/util/pan_lower_framebuffer.c | 33 +++++++++++++++++++++ src/panfrost/util/pan_lower_framebuffer.h | 35 +++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/panfrost/util/pan_lower_framebuffer.h diff --git a/src/panfrost/util/pan_lower_framebuffer.c b/src/panfrost/util/pan_lower_framebuffer.c index 1df763c20dd..28c44f7b0cb 100644 --- a/src/panfrost/util/pan_lower_framebuffer.c +++ b/src/panfrost/util/pan_lower_framebuffer.c @@ -51,3 +51,36 @@ #include "compiler/nir/nir_builder.h" #include "compiler/nir/nir_format_convert.h" #include "util/format/u_format.h" +#include "pan_lower_framebuffer.h" + +/* Determines the unpacked type best suiting a given format, so the rest of the + * pipeline may be adjusted accordingly */ + +nir_alu_type +pan_unpacked_type_for_format(const struct util_format_description *desc) +{ + int c = util_format_get_first_non_void_channel(desc->format); + + if (c == -1) + unreachable("Void format not renderable"); + + bool large = (desc->channel[c].size > 16); + bool bit8 = (desc->channel[c].size == 8); + assert(desc->channel[c].size <= 32); + + if (desc->channel[c].normalized) + return large ? nir_type_float32 : nir_type_float16; + + switch (desc->channel[c].type) { + case UTIL_FORMAT_TYPE_UNSIGNED: + return bit8 ? nir_type_uint8 : + large ? nir_type_uint32 : nir_type_uint16; + case UTIL_FORMAT_TYPE_SIGNED: + return bit8 ? nir_type_int8 : + large ? nir_type_int32 : nir_type_int16; + case UTIL_FORMAT_TYPE_FLOAT: + return large ? nir_type_float32 : nir_type_float16; + default: + unreachable("Format not renderable"); + } +} diff --git a/src/panfrost/util/pan_lower_framebuffer.h b/src/panfrost/util/pan_lower_framebuffer.h new file mode 100644 index 00000000000..b18660eb9b2 --- /dev/null +++ b/src/panfrost/util/pan_lower_framebuffer.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2020 Collabora, Ltd. + * + * 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. + * + * Authors (Collabora): + * Alyssa Rosenzweig + */ + +#ifndef __PAN_LOWER_FRAMEBUFFER_H +#define __PAN_LOWER_FRAMEBUFFER_H + +#include "compiler/nir/nir.h" +#include "util/format/u_format.h" + +nir_alu_type pan_unpacked_type_for_format(const struct util_format_description *desc); + +#endif -- 2.30.2