summaryrefslogtreecommitdiff
path: root/retrace/dxgistate_so.py
diff options
context:
space:
mode:
Diffstat (limited to 'retrace/dxgistate_so.py')
-rw-r--r--retrace/dxgistate_so.py275
1 files changed, 275 insertions, 0 deletions
diff --git a/retrace/dxgistate_so.py b/retrace/dxgistate_so.py
new file mode 100644
index 00000000..86f6db57
--- /dev/null
+++ b/retrace/dxgistate_so.py
@@ -0,0 +1,275 @@
+##########################################################################
+#
+# Copyright 2008-2015 VMware, Inc.
+# All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+##########################################################################/
+
+"""Common code generation."""
+
+
+# Adjust path
+import os.path
+import sys
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
+
+from specs import stdapi
+from specs import winapi
+from specs import dxgi
+from specs import d3d10
+from specs import d3d11
+from specs import d3d11
+
+
+class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin):
+ '''Visitor which generates code to dump any type.
+ '''
+
+ # TODO: Don't dump all types inline -- do like trace.py's ComplexValueDumper
+
+
+ def visitLiteral(self, literal, instance):
+ if literal.kind in ('SInt', 'UInt'):
+ print ' writer.writeInt(%s);' % (instance)
+ elif literal.kind in ('Float',):
+ print ' writer.writeFloat(%s);' % (instance)
+ else:
+ raise NotImplementedError
+
+ def visitString(self, string, instance):
+ if not string.wide:
+ cast = 'const char *'
+ suffix = 'String'
+ else:
+ assert False
+ cast = 'const wchar_t *'
+ suffix = 'WString'
+ if cast != string.expr:
+ # reinterpret_cast is necessary for GLubyte * <=> char *
+ instance = 'reinterpret_cast<%s>(%s)' % (cast, instance)
+ assert string.length is None
+ print ' writer.write%s(%s);' % (suffix, instance)
+
+ def visitConst(self, const, instance):
+ self.visit(const.type, instance)
+
+ def visitStruct(self, struct, instance):
+ print ' writer.beginObject();'
+ for member in struct.members:
+ memberType, memberName = member
+ if memberName is not None:
+ print ' writer.beginMember("%s");' % memberName
+ self.visitMember(member, instance)
+ if memberName is not None:
+ print ' writer.endMember(); // %s' % memberName
+ print ' writer.endObject();'
+
+ def visitArray(self, array, instance):
+ length = '_c' + array.type.tag
+ index = '_i' + array.type.tag
+ array_length = self.expand(array.length)
+ print ' if (%s) {' % instance
+ print ' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length)
+ print ' writer.beginArray();'
+ print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index)
+ self.visitElement(index, array.type, '(%s)[%s]' % (instance, index))
+ print ' }'
+ print ' writer.endArray();'
+ print ' } else {'
+ print ' writer.writeNull();'
+ print ' }'
+
+ def visitAttribArray(self, array, instance):
+ raise NotImplementedError
+
+ def visitBlob(self, blob, instance):
+ raise NotImplementedError
+
+ def visitEnum(self, enum, instance):
+ print ' switch (%s) {' % instance
+ for value in enum.values:
+ print ' case %s:' % value
+ print ' writer.writeString("%s");' % value
+ print ' break;'
+ print ' default:'
+ print ' writer.writeInt(%s);' % instance
+ print ' break;'
+ print ' }'
+
+ def visitBitmask(self, bitmask, instance):
+ # TODO
+ self.visit(bitmask.type, instance)
+
+ def visitPointer(self, pointer, instance):
+ print ' if (%s) {' % instance
+ print ' writer.beginArray();'
+ self.visit(pointer.type, "*" + instance)
+ print ' writer.endArray();'
+ print ' } else {'
+ print ' writer.writeNull();'
+ print ' }'
+
+ def visitIntPointer(self, pointer, instance):
+ print ' writer.writeInt((uintptr_t)%s);' % instance
+
+ def visitObjPointer(self, pointer, instance):
+ print ' writer.writeInt((uintptr_t)%s);' % instance
+
+ def visitLinearPointer(self, pointer, instance):
+ print ' writer.writeInt((uintptr_t)%s);' % instance
+
+ def visitReference(self, reference, instance):
+ self.visit(reference.type, instance)
+
+ def visitHandle(self, handle, instance):
+ self.visit(handle.type, instance)
+
+ def visitAlias(self, alias, instance):
+ self.visit(alias.type, instance)
+
+ def visitOpaque(self, opaque, instance):
+ print ' writer.writeInt((uintptr_t)%s);' % instance
+
+ def visitInterface(self, interface, instance):
+ assert False
+
+ def visitPolymorphic(self, polymorphic, instance):
+ switchExpr = self.expand(polymorphic.switchExpr)
+ print ' switch (static_cast<int>(%s)) {' % switchExpr
+ for cases, type in polymorphic.iterSwitch():
+ for case in cases:
+ print ' %s:' % case
+ caseInstance = instance
+ if type.expr is not None:
+ caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance)
+ self.visit(type, caseInstance)
+ print ' break;'
+ print ' }'
+
+
+class Dumper:
+ '''Base class to orchestrate the code generation of state object dumpers.'''
+
+ def __init__(self, api, types):
+ self.api = api
+ self.types = types
+
+ def dumperFactory(self):
+ '''Create a dumper.
+
+ Can be overriden by derived classes to inject their own dumper visitor.
+ '''
+
+ return ValueDumper()
+
+ def dump(self):
+
+ self.header()
+
+ # Includes
+ for module in api.modules:
+ for header in module.headers:
+ print header
+ print
+
+ # Generate the dumper functions
+ types = api.getAllTypes()
+ for type in self.types:
+ self.dumpType(type)
+
+ def dumpType(self, type):
+ print r'void'
+ print r'dumpStateObject(StateWriter &writer, const %s & so)' % type
+ print r'{'
+ visitor = self.dumperFactory()
+ visitor.visit(type, 'so')
+ print r'}'
+ print
+
+ def header(self):
+ pass
+
+ def footer(self):
+ pass
+
+
+if __name__ == '__main__':
+ print r'#include "dxgistate_so.hpp"'
+ print
+ print r'#include "state_writer.hpp"'
+ print
+
+ api = stdapi.API()
+ api.addModule(dxgi.dxgi)
+ api.addModule(d3d10.d3d10)
+ api.addModule(d3d10.d3d10_1)
+ api.addModule(d3d11.d3d11)
+
+ types = [
+ winapi.RECT,
+ dxgi.DXGI_FORMAT,
+ d3d10.D3D10_BLEND_DESC,
+ d3d10.D3D10_BUFFER_DESC,
+ d3d10.D3D10_COUNTER_DESC,
+ d3d10.D3D10_DEPTH_STENCIL_DESC,
+ d3d10.D3D10_DEPTH_STENCILOP_DESC,
+ d3d10.D3D10_DEPTH_STENCIL_VIEW_DESC,
+ d3d10.D3D10_INPUT_ELEMENT_DESC,
+ # FIXME: aliases to D3D_PRIMITIVE_TOPOLOGY clashing with D3D11_PRIMITIVE_TOPOLOGY
+ #d3d10.D3D10_PRIMITIVE_TOPOLOGY,
+ d3d10.D3D10_QUERY_DESC,
+ d3d10.D3D10_RASTERIZER_DESC,
+ d3d10.D3D10_RENDER_TARGET_VIEW_DESC,
+ d3d10.D3D10_SAMPLER_DESC,
+ d3d10.D3D10_SHADER_RESOURCE_VIEW_DESC,
+ d3d10.D3D10_TEXTURE1D_DESC,
+ d3d10.D3D10_TEXTURE2D_DESC,
+ d3d10.D3D10_TEXTURE3D_DESC,
+ d3d10.D3D10_VIEWPORT,
+ d3d10.D3D10_BLEND_DESC1,
+ d3d10.D3D10_SHADER_RESOURCE_VIEW_DESC1,
+ d3d11.D3D11_BLEND_DESC,
+ d3d11.D3D11_BLEND_DESC1,
+ d3d11.D3D11_BUFFER_DESC,
+ d3d11.D3D11_CLASS_INSTANCE_DESC,
+ d3d11.D3D11_COUNTER_DESC,
+ d3d11.D3D11_DEPTH_STENCIL_DESC,
+ d3d11.D3D11_DEPTH_STENCILOP_DESC,
+ d3d11.D3D11_DEPTH_STENCIL_VIEW_DESC,
+ d3d11.D3D11_INPUT_ELEMENT_DESC,
+ d3d11.D3D11_PACKED_MIP_DESC,
+ d3d11.D3D11_PRIMITIVE_TOPOLOGY,
+ d3d11.D3D11_QUERY_DESC,
+ d3d11.D3D11_RASTERIZER_DESC,
+ d3d11.D3D11_RASTERIZER_DESC1,
+ d3d11.D3D11_RENDER_TARGET_BLEND_DESC,
+ d3d11.D3D11_RENDER_TARGET_VIEW_DESC,
+ d3d11.D3D11_SAMPLER_DESC,
+ d3d11.D3D11_SHADER_RESOURCE_VIEW_DESC,
+ d3d11.D3D11_TEXTURE1D_DESC,
+ d3d11.D3D11_TEXTURE2D_DESC,
+ d3d11.D3D11_TEXTURE3D_DESC,
+ d3d11.D3D11_UNORDERED_ACCESS_VIEW_DESC,
+ d3d11.D3D11_VIEWPORT,
+ ]
+
+ dumper = Dumper(api, types)
+ dumper.dump()