summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2019-11-07 10:37:54 -0800
committerMarge Bot <eric+marge@anholt.net>2021-01-15 18:58:50 +0000
commit13ae72aaae81049acd684089a36ac270d093715b (patch)
tree59b893682dd39b80471b36e769185031f7f44f80
parent83f97cd0be0cb162a1be8dec122ff596b9ff96c7 (diff)
mesa: Replace the float[4] unpack code with util/format's.
The gallium drivers lose 10-15k of binary by not having this duplicated unpack code, but classic i965 gains 215k of binary by pulling in u_format's pack/unpack code. The cost to classic will go down as we drop more of the duplicated code. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6297>
-rw-r--r--src/mesa/main/format_unpack.h8
-rw-r--r--src/mesa/main/format_unpack.py162
-rw-r--r--src/mesa/main/pack.c3
-rw-r--r--src/mesa/main/tests/meson.build2
4 files changed, 9 insertions, 166 deletions
diff --git a/src/mesa/main/format_unpack.h b/src/mesa/main/format_unpack.h
index 4db0a9332ca..829505314dd 100644
--- a/src/mesa/main/format_unpack.h
+++ b/src/mesa/main/format_unpack.h
@@ -25,15 +25,19 @@
#ifndef FORMAT_UNPACK_H
#define FORMAT_UNPACK_H
+#include "util/format/u_format.h"
#include "formats.h"
#ifdef __cplusplus
extern "C" {
#endif
-extern void
+static inline void
_mesa_unpack_rgba_row(mesa_format format, uint32_t n,
- const void *src, float dst[][4]);
+ const void *src, float dst[][4])
+{
+ util_format_unpack_rgba(format, dst, src, n);
+}
extern void
_mesa_unpack_ubyte_rgba_row(mesa_format format, uint32_t n,
diff --git a/src/mesa/main/format_unpack.py b/src/mesa/main/format_unpack.py
index a17a6354f6a..ec826652268 100644
--- a/src/mesa/main/format_unpack.py
+++ b/src/mesa/main/format_unpack.py
@@ -68,136 +68,6 @@ for f in formats:
rgb_formats.append(f)
%>
-/* float unpacking functions */
-
-%for f in rgb_formats:
- %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT'):
- <% continue %>
- %elif f.is_int() and not f.is_normalized():
- <% continue %>
- %elif f.is_compressed():
- <% continue %>
- %endif
-
-static inline void
-unpack_float_${f.short_name()}(const void *void_src, float dst[4])
-{
- ${f.datatype()} *src = (${f.datatype()} *)void_src;
- %if f.layout == parser.PACKED:
- %for c in f.channels:
- %if c.type != 'x':
- ${c.datatype()} ${c.name} = UNPACK(*src, ${c.shift}, ${c.size});
- %endif
- %endfor
- %elif f.layout == parser.ARRAY:
- %for (i, c) in enumerate(f.channels):
- %if c.type != 'x':
- ${c.datatype()} ${c.name} = src[${i}];
- %endif
- %endfor
- %else:
- <% assert False %>
- %endif
-
- %for i in range(4):
- <% s = f.swizzle[i] %>
- %if 0 <= s and s <= parser.Swizzle.SWIZZLE_W:
- <% c = f.channels[s] %>
- %if c.type == parser.UNSIGNED:
- %if f.colorspace == 'srgb' and c.name in 'rgb':
- <% assert c.size == 8 %>
- dst[${i}] = util_format_srgb_8unorm_to_linear_float(${c.name});
- %else:
- dst[${i}] = _mesa_unorm_to_float(${c.name}, ${c.size});
- %endif
- %elif c.type == parser.SIGNED:
- dst[${i}] = _mesa_snorm_to_float(${c.name}, ${c.size});
- %elif c.type == parser.FLOAT:
- %if c.size == 32:
- dst[${i}] = ${c.name};
- %elif c.size == 16:
- dst[${i}] = _mesa_half_to_float(${c.name});
- %else:
- <% assert False %>
- %endif
- %else:
- <% assert False %>
- %endif
- %elif s == parser.Swizzle.SWIZZLE_ZERO:
- dst[${i}] = 0.0f;
- %elif s == parser.Swizzle.SWIZZLE_ONE:
- dst[${i}] = 1.0f;
- %else:
- <% assert False %>
- %endif
- %endfor
-}
-%endfor
-
-static void
-unpack_float_r9g9b9e5_float(const void *src, float dst[4])
-{
- rgb9e5_to_float3(*(const uint32_t *)src, dst);
- dst[3] = 1.0f;
-}
-
-static void
-unpack_float_r11g11b10_float(const void *src, float dst[4])
-{
- r11g11b10f_to_float3(*(const uint32_t *)src, dst);
- dst[3] = 1.0f;
-}
-
-static void
-unpack_float_ycbcr(const void *src, float dst[][4], uint32_t n)
-{
- uint32_t i;
- for (i = 0; i < n; i++) {
- const uint16_t *src0 = ((const uint16_t *) src) + i * 2; /* even */
- const uint16_t *src1 = src0 + 1; /* odd */
- const uint8_t y0 = (*src0 >> 8) & 0xff; /* luminance */
- const uint8_t cb = *src0 & 0xff; /* chroma U */
- const uint8_t y1 = (*src1 >> 8) & 0xff; /* luminance */
- const uint8_t cr = *src1 & 0xff; /* chroma V */
- const uint8_t y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
- float r = 1.164F * (y - 16) + 1.596F * (cr - 128);
- float g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
- float b = 1.164F * (y - 16) + 2.018F * (cb - 128);
- r *= (1.0F / 255.0F);
- g *= (1.0F / 255.0F);
- b *= (1.0F / 255.0F);
- dst[i][0] = CLAMP(r, 0.0F, 1.0F);
- dst[i][1] = CLAMP(g, 0.0F, 1.0F);
- dst[i][2] = CLAMP(b, 0.0F, 1.0F);
- dst[i][3] = 1.0F;
- }
-}
-
-static void
-unpack_float_ycbcr_rev(const void *src, float dst[][4], uint32_t n)
-{
- uint32_t i;
- for (i = 0; i < n; i++) {
- const uint16_t *src0 = ((const uint16_t *) src) + i * 2; /* even */
- const uint16_t *src1 = src0 + 1; /* odd */
- const uint8_t y0 = *src0 & 0xff; /* luminance */
- const uint8_t cr = (*src0 >> 8) & 0xff; /* chroma V */
- const uint8_t y1 = *src1 & 0xff; /* luminance */
- const uint8_t cb = (*src1 >> 8) & 0xff; /* chroma U */
- const uint8_t y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
- float r = 1.164F * (y - 16) + 1.596F * (cr - 128);
- float g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
- float b = 1.164F * (y - 16) + 2.018F * (cb - 128);
- r *= (1.0F / 255.0F);
- g *= (1.0F / 255.0F);
- b *= (1.0F / 255.0F);
- dst[i][0] = CLAMP(r, 0.0F, 1.0F);
- dst[i][1] = CLAMP(g, 0.0F, 1.0F);
- dst[i][2] = CLAMP(b, 0.0F, 1.0F);
- dst[i][3] = 1.0F;
- }
-}
-
/* ubyte packing functions */
%for f in rgb_formats:
@@ -306,38 +176,6 @@ unpack_int_${f.short_name()}(const void *void_src, uint32_t dst[4])
void
-_mesa_unpack_rgba_row(mesa_format format, uint32_t n,
- const void *src, float dst[][4])
-{
- uint8_t *s = (uint8_t *)src;
- uint32_t i;
-
- switch (format) {
-%for f in rgb_formats:
- %if f.is_compressed():
- <% continue %>
- %elif f.is_int() and not f.is_normalized():
- <% continue %>
- %endif
- case ${f.name}:
- for (i = 0; i < n; ++i) {
- unpack_float_${f.short_name()}(s, dst[i]);
- s += ${f.block_size() // 8};
- }
- break;
-%endfor
- case MESA_FORMAT_YCBCR:
- unpack_float_ycbcr(src, dst, n);
- break;
- case MESA_FORMAT_YCBCR_REV:
- unpack_float_ycbcr_rev(src, dst, n);
- break;
- default:
- unreachable("bad format");
- }
-}
-
-void
_mesa_unpack_ubyte_rgba_row(mesa_format format, uint32_t n,
const void *src, uint8_t dst[][4])
{
diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c
index 223bbb5adc1..6ebca5a6c99 100644
--- a/src/mesa/main/pack.c
+++ b/src/mesa/main/pack.c
@@ -55,7 +55,8 @@
#include "glformats.h"
#include "format_utils.h"
#include "format_pack.h"
-
+#include "format_unpack.h"
+#include "util/format/u_format.h"
/**
* Flip the 8 bits in each byte of the given array.
diff --git a/src/mesa/main/tests/meson.build b/src/mesa/main/tests/meson.build
index 0e95fbfbbd0..7e9e843cab4 100644
--- a/src/mesa/main/tests/meson.build
+++ b/src/mesa/main/tests/meson.build
@@ -38,7 +38,7 @@ test(
executable(
'main_test',
[files_main_test, main_dispatch_h],
- include_directories : [inc_include, inc_src, inc_mapi, inc_mesa],
+ include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium],
dependencies : [idep_gtest, dep_clock, dep_dl, dep_thread, idep_mesautil],
link_with : [libmesa_classic, link_main_test],
),