summaryrefslogtreecommitdiffstats
path: root/src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py')
-rwxr-xr-xsrc/VBox/GuestHost/OpenGL/state_tracker/gendiffcode.py273
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()