xref: /aosp_15_r20/external/libdrm/gen_table_fourcc.py (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*7688df22SAndroid Build Coastguard Worker
3*7688df22SAndroid Build Coastguard Worker# Copyright 2021 Collabora, Ltd.
4*7688df22SAndroid Build Coastguard Worker#
5*7688df22SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining
6*7688df22SAndroid Build Coastguard Worker# a copy of this software and associated documentation files (the
7*7688df22SAndroid Build Coastguard Worker# "Software"), to deal in the Software without restriction, including
8*7688df22SAndroid Build Coastguard Worker# without limitation the rights to use, copy, modify, merge, publish,
9*7688df22SAndroid Build Coastguard Worker# distribute, sublicense, and/or sell copies of the Software, and to
10*7688df22SAndroid Build Coastguard Worker# permit persons to whom the Software is furnished to do so, subject to
11*7688df22SAndroid Build Coastguard Worker# the following conditions:
12*7688df22SAndroid Build Coastguard Worker#
13*7688df22SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the
14*7688df22SAndroid Build Coastguard Worker# next paragraph) shall be included in all copies or substantial
15*7688df22SAndroid Build Coastguard Worker# portions of the Software.
16*7688df22SAndroid Build Coastguard Worker#
17*7688df22SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18*7688df22SAndroid Build Coastguard Worker# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*7688df22SAndroid Build Coastguard Worker# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20*7688df22SAndroid Build Coastguard Worker# NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21*7688df22SAndroid Build Coastguard Worker# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22*7688df22SAndroid Build Coastguard Worker# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23*7688df22SAndroid Build Coastguard Worker# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24*7688df22SAndroid Build Coastguard Worker# SOFTWARE.
25*7688df22SAndroid Build Coastguard Worker
26*7688df22SAndroid Build Coastguard Worker# Helper script that reads drm_fourcc.h and writes a static table with the
27*7688df22SAndroid Build Coastguard Worker# simpler format token modifiers
28*7688df22SAndroid Build Coastguard Worker
29*7688df22SAndroid Build Coastguard Workerimport sys
30*7688df22SAndroid Build Coastguard Workerimport re
31*7688df22SAndroid Build Coastguard Worker
32*7688df22SAndroid Build Coastguard Workerfilename = sys.argv[1]
33*7688df22SAndroid Build Coastguard Workertowrite = sys.argv[2]
34*7688df22SAndroid Build Coastguard Worker
35*7688df22SAndroid Build Coastguard Workerfm_re = {
36*7688df22SAndroid Build Coastguard Worker    'intel': r'^#define I915_FORMAT_MOD_(\w+)',
37*7688df22SAndroid Build Coastguard Worker    'others': r'^#define DRM_FORMAT_MOD_((?:ARM|SAMSUNG|QCOM|VIVANTE|NVIDIA|BROADCOM|ALLWINNER)\w+)\s',
38*7688df22SAndroid Build Coastguard Worker    'vendors': r'^#define DRM_FORMAT_MOD_VENDOR_(\w+)'
39*7688df22SAndroid Build Coastguard Worker}
40*7688df22SAndroid Build Coastguard Worker
41*7688df22SAndroid Build Coastguard Workerdef print_fm_intel(f, f_mod):
42*7688df22SAndroid Build Coastguard Worker    f.write('    {{ DRM_MODIFIER_INTEL({}, {}) }},\n'.format(f_mod, f_mod))
43*7688df22SAndroid Build Coastguard Worker
44*7688df22SAndroid Build Coastguard Worker# generic write func
45*7688df22SAndroid Build Coastguard Workerdef print_fm(f, vendor, mod, f_name):
46*7688df22SAndroid Build Coastguard Worker    f.write('    {{ DRM_MODIFIER({}, {}, {}) }},\n'.format(vendor, mod, f_name))
47*7688df22SAndroid Build Coastguard Worker
48*7688df22SAndroid Build Coastguard Workerwith open(filename, "r") as f:
49*7688df22SAndroid Build Coastguard Worker    data = f.read()
50*7688df22SAndroid Build Coastguard Worker    for k, v in fm_re.items():
51*7688df22SAndroid Build Coastguard Worker        fm_re[k] = re.findall(v, data, flags=re.M)
52*7688df22SAndroid Build Coastguard Worker
53*7688df22SAndroid Build Coastguard Workerwith open(towrite, "w") as f:
54*7688df22SAndroid Build Coastguard Worker    f.write('''\
55*7688df22SAndroid Build Coastguard Worker/* AUTOMATICALLY GENERATED by gen_table_fourcc.py. You should modify
56*7688df22SAndroid Build Coastguard Worker   that script instead of adding here entries manually! */
57*7688df22SAndroid Build Coastguard Workerstatic const struct drmFormatModifierInfo drm_format_modifier_table[] = {
58*7688df22SAndroid Build Coastguard Worker''')
59*7688df22SAndroid Build Coastguard Worker    f.write('    { DRM_MODIFIER_INVALID(NONE, INVALID) },\n')
60*7688df22SAndroid Build Coastguard Worker    f.write('    { DRM_MODIFIER_LINEAR(NONE, LINEAR) },\n')
61*7688df22SAndroid Build Coastguard Worker
62*7688df22SAndroid Build Coastguard Worker    for entry in fm_re['intel']:
63*7688df22SAndroid Build Coastguard Worker        print_fm_intel(f, entry)
64*7688df22SAndroid Build Coastguard Worker
65*7688df22SAndroid Build Coastguard Worker    for entry in fm_re['others']:
66*7688df22SAndroid Build Coastguard Worker        (vendor, mod) = entry.split('_', 1)
67*7688df22SAndroid Build Coastguard Worker        if vendor == 'ARM' and (mod == 'TYPE_AFBC' or mod == 'TYPE_MISC' or mod == 'TYPE_AFRC'):
68*7688df22SAndroid Build Coastguard Worker            continue
69*7688df22SAndroid Build Coastguard Worker        print_fm(f, vendor, mod, mod)
70*7688df22SAndroid Build Coastguard Worker
71*7688df22SAndroid Build Coastguard Worker    f.write('''\
72*7688df22SAndroid Build Coastguard Worker};
73*7688df22SAndroid Build Coastguard Worker''')
74*7688df22SAndroid Build Coastguard Worker
75*7688df22SAndroid Build Coastguard Worker    f.write('''\
76*7688df22SAndroid Build Coastguard Workerstatic const struct drmFormatModifierVendorInfo drm_format_modifier_vendor_table[] = {
77*7688df22SAndroid Build Coastguard Worker''')
78*7688df22SAndroid Build Coastguard Worker
79*7688df22SAndroid Build Coastguard Worker    for entry in fm_re['vendors']:
80*7688df22SAndroid Build Coastguard Worker        f.write("    {{ DRM_FORMAT_MOD_VENDOR_{}, \"{}\" }},\n".format(entry, entry))
81*7688df22SAndroid Build Coastguard Worker
82*7688df22SAndroid Build Coastguard Worker    f.write('''\
83*7688df22SAndroid Build Coastguard Worker};
84*7688df22SAndroid Build Coastguard Worker''')
85