util/format: expose generated format packing functions through a header
authorJonathan Marek <jonathan@marek.ca>
Wed, 5 Aug 2020 03:32:11 +0000 (23:32 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 13 Aug 2020 16:54:06 +0000 (16:54 +0000)
Some of the generated functions can be useful without going through the
format table (filling border color struct in turnip). By not calling these
functions through the format table, we should eventually be able to garbage
collect the unused packing functions, and also allows LTOs to happen.

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6093>

src/util/Makefile.sources
src/util/SConscript
src/util/format/meson.build
src/util/format/u_format_pack.py
src/util/format/u_format_table.py

index 9aa82599dc49c855a4510f41ca2b6ea221ae4407..c1e6e34c46eacc06a3715651204083bc499ce2ad 100644 (file)
@@ -130,7 +130,8 @@ MESA_UTIL_FILES := \
 
 MESA_UTIL_GENERATED_FILES = \
        format_srgb.c \
-       format/u_format_table.c
+       format/u_format_table.c \
+       format/u_format_pack.h
 
 XMLCONFIG_FILES := \
        xmlconfig.c \
index 972135812cb4724744767e5a71bdd7999a4ff774..410279d2d2d1a298fffe5d9f2663af55aa64189c 100644 (file)
@@ -26,6 +26,18 @@ env.CodeGenerate(
     command = python_cmd + ' $SCRIPT > $TARGET'
 )
 
+env.CodeGenerate(
+    target = 'format/u_format_pack.h',
+    script = 'format/u_format_table.py',
+    source = ['format/u_format.csv'],
+    command = python_cmd + ' $SCRIPT $SOURCE --header > $TARGET'
+)
+
+env.Depends('format/u_format_pack.h', [
+    'format/u_format_parse.py',
+    'format/u_format_pack.py',
+])
+
 env.CodeGenerate(
     target = 'format/u_format_table.c',
     script = 'format/u_format_table.py',
index 34615fd35cdb9bce1722143b27e344a9a2d2f8fc..59b2adf870c1877ec7ccc36cfa743f8d580e01b7 100644 (file)
@@ -31,6 +31,15 @@ files_mesa_format = [
   'u_format_zs.c',
 ]
 
+u_format_pack_h = custom_target(
+  'u_format_pack.h',
+  input : ['u_format_table.py', 'u_format.csv'],
+  output : 'u_format_pack.h',
+  command : [prog_python, '@INPUT@', '--header'],
+  depend_files : files('u_format_pack.py', 'u_format_parse.py'),
+  capture : true,
+)
+
 u_format_table_c = custom_target(
   'u_format_table.c',
   input : ['u_format_table.py', 'u_format.csv'],
@@ -42,7 +51,7 @@ u_format_table_c = custom_target(
 
 libmesa_format = static_library(
   'mesa_format',
-  [files_mesa_format, u_format_table_c],
+  [files_mesa_format, u_format_table_c, u_format_pack_h],
   include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
   dependencies : dep_m,
   c_args : [c_msvc_compat_args],
index 15c6be72e158de910b6e117c565039dfa5388497..e2fbc4cce919d045be44ae090c6c7adf36d0b528 100644 (file)
@@ -49,7 +49,6 @@ if sys.version_info < (3, 0):
 else:
     integer_types = (int, )
 
-
 def inv_swizzles(swizzles):
     '''Return an array[4] of inverse swizzle terms'''
     '''Only pick the first matching value to avoid l8 getting blue and i8 getting alpha'''
@@ -658,9 +657,11 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix):
 
     name = format.short_name()
 
-    print('static inline void')
+    print('void')
     print('util_format_%s_pack_%s(uint8_t *dst_row, unsigned dst_stride, const %s *src_row, unsigned src_stride, unsigned width, unsigned height)' % (name, src_suffix, src_native_type))
     print('{')
+
+    print('void util_format_%s_pack_%s(uint8_t *dst_row, unsigned dst_stride, const %s *src_row, unsigned src_stride, unsigned width, unsigned height);' % (name, src_suffix, src_native_type), file=sys.stdout2)
     
     if is_format_supported(format):
         print('   unsigned x, y;')
@@ -712,6 +713,7 @@ def generate(formats):
     print('#include "util/format_srgb.h"')
     print('#include "u_format_yuv.h"')
     print('#include "u_format_zs.h"')
+    print('#include "u_format_pack.h"')
     print()
 
     for format in formats:
@@ -761,4 +763,3 @@ def generate(formats):
 
                 generate_format_unpack(format, channel, native_type, suffix)
                 generate_format_pack(format, channel, native_type, suffix)
-
index b1e58d4d4790aaffc75db242ea7606d7bc6aa91d..e079da44a64ad469ecad50f9676325913a2135f9 100644 (file)
@@ -30,7 +30,7 @@ CopyRight = '''
 '''
 
 
-import sys
+import sys, os
 
 from u_format_parse import *
 import u_format_pack
@@ -112,19 +112,24 @@ def has_access(format):
         return False
     return True
 
-def write_format_table(formats):
-    print('/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */')
-    print()
+def write_format_table_header(file):
+    print('/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */', file=file)
+    print(file=file)
     # This will print the copyright message on the top of this file
-    print(CopyRight.strip())
-    print()
-    print('#include "u_format.h"')
+    print(CopyRight.strip(), file=file)
+    print(file=file)
+    print('#include "util/format/u_format.h"', file=file)
+
+def write_format_table(formats):
+    write_format_table_header(sys.stdout)
     print('#include "u_format_bptc.h"')
     print('#include "u_format_s3tc.h"')
     print('#include "u_format_rgtc.h"')
     print('#include "u_format_latc.h"')
     print('#include "u_format_etc.h"')
     print()
+
+    write_format_table_header(sys.stdout2)
     
     u_format_pack.generate(formats)
     
@@ -261,12 +266,19 @@ def write_format_table(formats):
     generate_table_getter("unpack_")
 
 def main():
-
     formats = []
+
+    sys.stdout2 = open(os.devnull, "w")
+
     for arg in sys.argv[1:]:
+        if arg == '--header':
+            sys.stdout2 = sys.stdout
+            sys.stdout = open(os.devnull, "w")
+            continue
+
         formats.extend(parse(arg))
-    write_format_table(formats)
 
+    write_format_table(formats)
 
 if __name__ == '__main__':
     main()