diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py')
-rwxr-xr-x | src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py b/src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py new file mode 100755 index 00000000..6c3e91d6 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py @@ -0,0 +1,273 @@ +# Copyright (c) 2001, Stanford University +# All rights reserved. +# +# See the file LICENSE.txt for information on redistributing this software + +from __future__ import print_function +import sys + +def main(): + name = sys.argv[1] + Name = sys.argv[2] + + print("""/* This code is AUTOGENERATED!!! */ + +#include "state.h" +#include "state_internals.h\"""") + + print(""" +void crState%(Name)sDiff(CR%(Name)sBits *b, CRbitvalue *bitID, + CRContext *fromCtx, CRContext *toCtx) +{ + CR%(Name)sState *from = &(fromCtx->%(name)s); + CR%(Name)sState *to = &(toCtx->%(name)s);"""%vars()) + gendiffcode("state_%s.txt"%(name.lower()), name, docopy=1, doinvalid=0) + print("""} + +void crState%(Name)sSwitch(CR%(Name)sBits *b, CRbitvalue *bitID, + CRContext *fromCtx, CRContext *toCtx) +{ + CR%(Name)sState *from = &(fromCtx->%(name)s); + CR%(Name)sState *to = &(toCtx->%(name)s);"""%vars()) + gendiffcode("state_%s.txt"%(Name.lower()), Name, docopy=0, doinvalid=1) + print("}\n") + +def gendiffcode(fname, state_name, docopy, doinvalid): + target = "to" + current = "from" + bit = "b" + extrabit = "" + tab = "\t" + current_guard = "" + current_dependency = "" + + v_types = { + 'l': 'GLboolean', + 'b': 'GLbyte', + 'ub': 'GLubyte', + 's': 'GLshort', + 'us': 'GLushort', + 'i': 'GLint', + 'ui': 'GLuint', + 'f': 'GLfloat', + 'd': 'GLdouble' + } + + FILE = open(sys.argv[3]+"/"+fname, "r") + + print(""" unsigned int j, i; + CRbitvalue nbitID[CR_MAX_BITARRAY]; + for (j = 0; j<CR_MAX_BITARRAY; j++) + nbitID[j] = ~bitID[j]; + i = 0; /* silence compiler */""") + + import re + for line in FILE: + line = line.rstrip() + + if re.match("#", line): + continue + +## Handle text dump + m = re.match("\+(.*)", line) + if m: + if doinvalid: + continue + line = m.group(1) + + else: + m = re.match("-(.*)", line) + if m: + if docopy: + continue + line = m.group(1) + + m = re.match(">(.*)", line) + if m: + text = m.group(1) + if re.search("}", line): + tab = tab[:-1] + print(tab+text) + if re.search("{", line): + tab = tab+"\t" + continue + +## Handle commands + + m = re.search("%target=(\w*)", line) + if m: + target = m.group(1) + m = re.search("%current=(\w*)", line) + if m: + current = m.group(1) + m = re.search("%bit=(\w*)", line) + if m: + bit = m.group(1) + m = re.search("%extrabit=(\w*)", line) + if m: + extrabit = m.group(1) + + if re.search("%flush", line): + if current_guard != "": + print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) + tab = tab[:-1] + print(tab+"}") + if docopy and current_dependency != "": + tab = tab[:-1] + print(tab+"}") + current_guard = "" + current_dependency = "" + if re.search("%", line): + continue + +## Load the line + (dependency, guardbit, members, func) = \ + (re.split(":", line) + ["", ""])[0:4] + func = func.rstrip() + +## Close the guardbit and dependency + if current_guard != "" and current_guard != guardbit: + print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) + tab = tab[:-1] + print(tab+"}") + if docopy and current_dependency != "" and current_dependency != dependency: + tab = tab[:-1] + print(tab+"}") + +## Open the dependency if + if docopy and current_dependency != dependency and dependency != "": + print(tab+"if (%(target)s->%(dependency)s)\n%(tab)s{"%vars()) + tab = tab+"\t" + current_dependency = dependency + +## Open the guard if + if docopy and current_dependency != dependency and dependency != "": + print(tab+"if ($(target)s->%(dependency)s)\n%(tab)s{"%vars()) + tab = tab+"\t" + + if current_guard != guardbit and guardbit != "": + print(tab+"if (CHECKDIRTY(%(bit)s->%(guardbit)s, bitID))\n%(tab)s{"%vars()) + tab = tab+"\t" + if members[0] != "*" and guardbit[0:6] == "enable": + print(tab+"glAble able[2];") + print(tab+"able[0] = diff_api.Disable;") + print(tab+"able[1] = diff_api.Enable;") + + current_dependency = dependency + current_guard = guardbit + +## Handle text dump + if members[0] == "*": + print(tab+members[1:]) + else: + ## Parse the members variable + mainelem = re.split(",", members) + elems = re.split("\|", members) + if len(elems) > 1: + mainelem = [""] + mainelem[0] = elems[0] + elems = re.split(",", elems[1]) + newelems = [] + for elem in elems: + elem = mainelem[0] + "." + elem + newelems += [elem] + elems = newelems + else: + elems = re.split(",", members) + + ## Check member values + if guardbit != "extensions": + sys.stdout.write(tab+"if (") + first = 1 + for elem in elems: + if first != 1: + print(" ||\n"+tab+" ", end="") + first = 0 + sys.stdout.write("%(current)s->%(elem)s != %(target)s->%(elem)s"%vars()) + print(")\n"+tab+"{") + tab = tab+"\t" + +## Handle text function + if func[0] == "*": + func = func[1:] + print(tab+func) + else: + if func != "": +## Call the glhw function + if guardbit[0:6] == "enable": + print(tab+"able["+target+"->"+elems[0]+"]("+func+");") + elif guardbit == "extensions": + print(tab+"crState$state_name",end="") + if docopy == 1: + print("Diff",end="") + else: + print("Switch",end="") + print("Extensions(from, to);") + else: + funcargs = re.split(",", func) + #print "// funcargs:",funcargs + func = funcargs.pop(0) + + if func[-1] == "v": + v_type = func[-2:-1] + num_elems = len(elems) + print(tab+v_types[v_type]+" varg["+str(num_elems)+"];") + i = 0 + for elem in elems: + print(tab+"varg["+str(i)+"] = "+target+"->"+elem+";") + i += 1 + elif func[-3:] == "vNV": + v_type = func[-4:-3] + num_elems = len(elems) + print(tab+v_types[v_type]+" varg["+str(num_elems)+"];") + i = 0 + for elem in elems: + print(tab+"varg["+str(i)+"] = "+target+"->"+elem+";") + i += 1 + + sys.stdout.write(tab+"diff_api.%(func)s("%vars()) + for funcarg in funcargs: + sys.stdout.write(funcarg+", ") + +## Handle vargs + if func[-1] == "v" or func[-3:] == "vNV": + sys.stdout.write("varg") + else: + first = 1 + for elem in elems: + if first != 1: + sys.stdout.write(",\n"+tab+" ") + first = 0 + sys.stdout.write(target+"->"+elem) + print(");") + +## Do the sync if necessary + if docopy and guardbit != "extensions": + for elem in mainelem: + print(tab+current+"->"+elem+" = "+target+"->"+elem+";") + + ## Do the clear if necessary + if doinvalid: + if guardbit != "": + print(tab+"FILLDIRTY(%(bit)s->%(guardbit)s);"%vars()) + print(tab+"FILLDIRTY(%(bit)s->dirty);"%vars()) + if extrabit != "": + print(tab+"FILLDIRTY(%(extrabit)s->dirty);"%vars()) + + ## Close the compare + if guardbit != "extensions": + tab = tab[:-1] + print(tab+"}") + +## Do final closures + if current_guard != "": + print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) + tab = tab[:-1] + print(tab+"}") + if docopy and current_dependency != "": + tab = tab[:-1] + print(tab+"} /*%(current_dependency)s*/"%vars()) + + print(tab+"CLEARDIRTY(%(bit)s->dirty, nbitID);"%vars()) + +main() |