mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 10:03:23 +09:00
75 lines
3.3 KiB
Python
75 lines
3.3 KiB
Python
# MobileGL - tools/device_bench/anland_glmark2/mktables.py
|
|
# Copyright (c) 2025-2026 MobileGL-Dev
|
|
# Licensed under the GNU Lesser General Public License v3.0:
|
|
# https://www.gnu.org/licenses/gpl-3.0.txt
|
|
# https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
# SPDX-License-Identifier: LGPL-3.0-only
|
|
# End of Source File Header
|
|
|
|
import json, sys, statistics as st
|
|
d = json.load(open(sys.argv[1]))
|
|
stacks = ['stock', 'espryt', 'magma']
|
|
cfgs = [('es2w', 'glmark2-es2-wayland, 800x600 window'), ('es2f', 'glmark2-es2-wayland, fullscreen'),
|
|
('glw', 'glmark2-wayland (desktop GL), 800x600 window'), ('glf', 'glmark2-wayland (desktop GL), fullscreen')]
|
|
def med(v):
|
|
v = [x for x in v if x is not None]
|
|
return st.median(v) if v else None
|
|
def spread(v):
|
|
v = [x for x in v if x is not None]
|
|
return (min(v), max(v)) if v else (None, None)
|
|
out = []
|
|
out.append('### Overall scores (median of runs; min-max in brackets; n = runs)\n')
|
|
out.append('| Configuration | stock | Espryt | Magma | Espryt/stock | Magma/stock | Espryt/stock (common scenes) | Magma/stock (common scenes) |')
|
|
out.append('|---|---|---|---|---|---|---|---|')
|
|
for c, label in cfgs:
|
|
row = [label]
|
|
meds = {}
|
|
common = {}
|
|
for s in stacks:
|
|
k = '%s/%s' % (s, c)
|
|
if k not in d: row.append('-'); continue
|
|
sc = d[k]['scenes'].get('__score', [])
|
|
m = med(sc); lo, hi = spread(sc); meds[s] = m
|
|
row.append('%d [%d-%d] n=%d' % (m, lo, hi, len(sc)) if m else '-')
|
|
# common-scene mean of medians
|
|
keys = None
|
|
for s in stacks:
|
|
k = '%s/%s' % (s, c)
|
|
if k not in d: continue
|
|
ks = {n for n, v in d[k]['scenes'].items() if n != '__score' and med(v) is not None}
|
|
keys = ks if keys is None else keys & ks
|
|
for s in stacks:
|
|
k = '%s/%s' % (s, c)
|
|
if k in d and keys:
|
|
common[s] = st.mean(med(d[k]['scenes'][n]) for n in keys)
|
|
for s in ['espryt', 'magma']:
|
|
row.append('%.2f' % (meds[s] / meds['stock']) if meds.get(s) and meds.get('stock') else '-')
|
|
for s in ['espryt', 'magma']:
|
|
row.append('%.2f' % (common[s] / common['stock']) if common.get(s) and common.get('stock') else '-')
|
|
out.append('| ' + ' | '.join(row) + ' |')
|
|
out.append('')
|
|
for c, label in cfgs:
|
|
out.append('### Per-scene FPS: %s (median of runs)\n' % label)
|
|
out.append('| Scene | stock | Espryt | Magma | Espryt/stock | Magma/stock |')
|
|
out.append('|---|---|---|---|---|---|')
|
|
names = []
|
|
for s in stacks:
|
|
k = '%s/%s' % (s, c)
|
|
if k in d:
|
|
for n in d[k]['scenes']:
|
|
if n != '__score' and n not in names: names.append(n)
|
|
for n in names:
|
|
vals = {}
|
|
for s in stacks:
|
|
k = '%s/%s' % (s, c)
|
|
v = d.get(k, {}).get('scenes', {}).get(n)
|
|
vals[s] = med(v) if v else None
|
|
if v is not None and all(x is None for x in v): vals[s] = 'unsupported'
|
|
def f(x): return x if isinstance(x, str) else ('-' if x is None else '%d' % x)
|
|
def r(a, b):
|
|
return '%.2f' % (a / b) if isinstance(a, (int, float)) and isinstance(b, (int, float)) and b else '-'
|
|
out.append('| %s | %s | %s | %s | %s | %s |' % (n.replace('|', '/'), f(vals['stock']), f(vals['espryt']), f(vals['magma']),
|
|
r(vals['espryt'], vals['stock']), r(vals['magma'], vals['stock'])))
|
|
out.append('')
|
|
print('\n'.join(out))
|