#!/usr/bin/env python3 # Copyright 2021 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. # Helper script that reads drm_fourcc.h and writes a static table with the # simpler format token modifiers import sys import re filename = sys.argv[1] towrite = sys.argv[2] fm_re = { 'intel': r'^#define I915_FORMAT_MOD_(\w+)', 'others': r'^#define DRM_FORMAT_MOD_((?:ARM|SAMSUNG|QCOM|VIVANTE|NVIDIA|BROADCOM|ALLWINNER)\w+)\s', 'vendors': r'^#define DRM_FORMAT_MOD_VENDOR_(\w+)' } def print_fm_intel(f, f_mod): f.write(' {{ DRM_MODIFIER_INTEL({}, {}) }},\n'.format(f_mod, f_mod)) # generic write func def print_fm(f, vendor, mod, f_name): f.write(' {{ DRM_MODIFIER({}, {}, {}) }},\n'.format(vendor, mod, f_name)) with open(filename, "r") as f: data = f.read() for k, v in fm_re.items(): fm_re[k] = re.findall(v, data, flags=re.M) with open(towrite, "w") as f: f.write('''\ /* AUTOMATICALLY GENERATED by gen_table_fourcc.py. You should modify that script instead of adding here entries manually! */ static const struct drmFormatModifierInfo drm_format_modifier_table[] = { ''') f.write(' { DRM_MODIFIER_INVALID(NONE, INVALID) },\n') f.write(' { DRM_MODIFIER_LINEAR(NONE, LINEAR) },\n') for entry in fm_re['intel']: print_fm_intel(f, entry) for entry in fm_re['others']: (vendor, mod) = entry.split('_', 1) if vendor == 'ARM' and (mod == 'TYPE_AFBC' or mod == 'TYPE_MISC' or mod == 'TYPE_AFRC'): continue print_fm(f, vendor, mod, mod) f.write('''\ }; ''') f.write('''\ static const struct drmFormatModifierVendorInfo drm_format_modifier_vendor_table[] = { ''') for entry in fm_re['vendors']: f.write(" {{ DRM_FORMAT_MOD_VENDOR_{}, \"{}\" }},\n".format(entry, entry)) f.write('''\ }; ''')