diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-07-18 21:57:55 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-07-19 09:31:57 +0200 |
commit | 1c2b29597ec0a208ffe214d68f6af4a0ab2cb556 (patch) | |
tree | 67535ff4dc224be23f24fbdfd671313953647c76 /tools | |
parent | 073dbceac48241e27b775ccafd3ea4e7b40ffbb4 (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-x | tools/gen_weave_state.py | 61 |
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() |