summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-07-18 21:57:55 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-07-19 09:31:57 +0200
commit1c2b29597ec0a208ffe214d68f6af4a0ab2cb556 (patch)
tree67535ff4dc224be23f24fbdfd671313953647c76 /tools
parent073dbceac48241e27b775ccafd3ea4e7b40ffbb4 (diff)
driver: build context
First step towards support for multiple concurrent rendering programs with v2 driver (v4 driver requires different approach with state deltas, but that can be done in a similar way later).
Diffstat (limited to 'tools')
-rwxr-xr-xtools/gen_weave_state.py61
1 files changed, 60 insertions, 1 deletions
diff --git a/tools/gen_weave_state.py b/tools/gen_weave_state.py
index 0207c04..9b86c75 100755
--- a/tools/gen_weave_state.py
+++ b/tools/gen_weave_state.py
@@ -111,7 +111,8 @@ def main():
#print(field, '%05x' % offset, strides)
field_by_offset[offset] = (field, path, strides)
recs_by_offset[offset].append(rec_info)
- # Emit output
+ # Emit weave state
+ print('/* Weave state */')
offsets = sorted(field_by_offset.keys())
last_dirty_bits = None
indent = 1
@@ -185,6 +186,64 @@ def main():
out.write(' ' * indent)
out.write('}\n')
+ # Emit reset state function
+ # This function pushes the current context structure to the gpu
+ print()
+ print('/* Reset state */')
+ indent = 1
+ for offset in offsets:
+ (name, path, strides) = field_by_offset[offset]
+ # strides is a list of (stride,length) tuples
+ name = name.replace('.', '_')
+ recs = recs_by_offset[offset]
+
+ # build target state
+ target_state = name
+ target_state_sub = ', '.join(('{%i}' % (src_idx)) for src_idx,_ in enumerate(strides))
+ if target_state_sub:
+ target_state += '('+target_state_sub+')'
+
+ # build target field reference
+ target_field = name
+ # to sort destination state addresses in order, sort array indices by decreasing stride
+ dest_strides = sorted([(idx,stride,length) for idx,(stride,length) in enumerate(strides)], key=lambda x:-x[1])
+ for src_idx,stride,length in dest_strides:
+ target_field += '[{%i}]' % (src_idx)
+
+ fieldrefs = []
+ dirty_bits = set()
+ for rec in recs:
+ source_field = name
+ for idx,(stride,length) in enumerate(strides):
+ iname = '{%i}' % idx
+ if not iname in rec[1]: # if quantifier not already used in record name itself
+ source_field += '[' + iname + ']'
+ fieldrefs.append('%s%s%s' % (SRC_SPEC,rec[1],source_field))
+ dirty_bits.add(rec[2])
+
+ for src_idx,stride,length in dest_strides:
+ out.write(' ' * indent)
+ out.write('for(int {0}=0; {0}<{1}; ++{0})\n'.format(VARNAMES[src_idx], length))
+ out.write(' ' * indent)
+ out.write('{\n')
+ indent += 1
+
+ macro = 'EMIT_STATE'
+ if isinstance(path[-1].type, BaseType) and path[-1].type.kind == 'fixedp':
+ macro += '_FIXP'
+
+ out.write(' ' * indent)
+ out.write('/*%05X*/ %s(%s, %s);\n' % (
+ offset,
+ macro,
+ target_state.format(*VARNAMES),
+ target_field.format(*VARNAMES)))
+
+ for src_idx,stride,length in dest_strides:
+ indent -= 1
+ out.write(' ' * indent)
+ out.write('}\n')
+
if __name__ == '__main__':
main()