]> git.cworth.org Git - apitrace/commitdiff
Allow basic specification of polymorphic types.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 13 Oct 2011 08:52:52 +0000 (09:52 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 13 Oct 2011 08:52:52 +0000 (09:52 +0100)
Unfortunately quite common in GL/D3D APIs.  And this will help hanlding
better without less hand written code.

Just D3D9 for now as guinea pig.

specs/d3d9.py
specs/d3d9types.py
specs/stdapi.py
trace.py

index d1cceb3d161c857032a53a99a0b956b70ff25134..cc398088f0b26664f6149546497acff5e7dcd392 100644 (file)
@@ -225,8 +225,8 @@ IDirect3DDevice9.methods += [
     Method(HRESULT, "GetLightEnable", [(DWORD, "Index"), Out(Pointer(BOOL), "pEnable")]),
     Method(HRESULT, "SetClipPlane", [(DWORD, "Index"), (ConstPointer(Float), "pPlane")]),
     Method(HRESULT, "GetClipPlane", [(DWORD, "Index"), Out(Pointer(Float), "pPlane")]),
-    Method(HRESULT, "SetRenderState", [(D3DRENDERSTATETYPE, "State"), (DWORD, "Value")]),
-    Method(HRESULT, "GetRenderState", [(D3DRENDERSTATETYPE, "State"), Out(Pointer(DWORD), "pValue")]),
+    Method(HRESULT, "SetRenderState", [(D3DRENDERSTATETYPE, "State"), (D3DRENDERSTATEVALUE, "Value")]),
+    Method(HRESULT, "GetRenderState", [(D3DRENDERSTATETYPE, "State"), Out(Pointer(D3DRENDERSTATEVALUE), "pValue")]),
     Method(HRESULT, "CreateStateBlock", [(D3DSTATEBLOCKTYPE, "Type"), Out(Pointer(PDIRECT3DSTATEBLOCK9), "ppSB")]),
     Method(HRESULT, "BeginStateBlock", []),
     Method(HRESULT, "EndStateBlock", [Out(Pointer(PDIRECT3DSTATEBLOCK9), "ppSB")]),
index 73011ee36f5945aef4d2e691f1819ddce9e59b52..6dc250c81733dd0d0a1a0f4905402a44932e294d 100644 (file)
@@ -62,7 +62,7 @@ D3DVIEWPORT9 = Struct("D3DVIEWPORT9", [
     (Float, "MaxZ"),
 ])
 
-D3DCLIP = Flags(DWORD, [
+D3DCLIPPLANE = Flags(DWORD, [
     "D3DCLIPPLANE0",
     "D3DCLIPPLANE1",
     "D3DCLIPPLANE2",
@@ -246,124 +246,12 @@ D3DTS = Flags(DWORD, [
     "D3DTS_WORLD3",
 ])
 
-D3DRENDERSTATETYPE = Enum("D3DRENDERSTATETYPE", [
-    "D3DRS_ZENABLE",
-    "D3DRS_FILLMODE",
-    "D3DRS_SHADEMODE",
-    "D3DRS_ZWRITEENABLE",
-    "D3DRS_ALPHATESTENABLE",
-    "D3DRS_LASTPIXEL",
-    "D3DRS_SRCBLEND",
-    "D3DRS_DESTBLEND",
-    "D3DRS_CULLMODE",
-    "D3DRS_ZFUNC",
-    "D3DRS_ALPHAREF",
-    "D3DRS_ALPHAFUNC",
-    "D3DRS_DITHERENABLE",
-    "D3DRS_ALPHABLENDENABLE",
-    "D3DRS_FOGENABLE",
-    "D3DRS_SPECULARENABLE",
-    "D3DRS_FOGCOLOR",
-    "D3DRS_FOGTABLEMODE",
-    "D3DRS_FOGSTART",
-    "D3DRS_FOGEND",
-    "D3DRS_FOGDENSITY",
-    "D3DRS_RANGEFOGENABLE",
-    "D3DRS_STENCILENABLE",
-    "D3DRS_STENCILFAIL",
-    "D3DRS_STENCILZFAIL",
-    "D3DRS_STENCILPASS",
-    "D3DRS_STENCILFUNC",
-    "D3DRS_STENCILREF",
-    "D3DRS_STENCILMASK",
-    "D3DRS_STENCILWRITEMASK",
-    "D3DRS_TEXTUREFACTOR",
-    "D3DRS_WRAP0",
-    "D3DRS_WRAP1",
-    "D3DRS_WRAP2",
-    "D3DRS_WRAP3",
-    "D3DRS_WRAP4",
-    "D3DRS_WRAP5",
-    "D3DRS_WRAP6",
-    "D3DRS_WRAP7",
-    "D3DRS_CLIPPING",
-    "D3DRS_LIGHTING",
-    "D3DRS_AMBIENT",
-    "D3DRS_FOGVERTEXMODE",
-    "D3DRS_COLORVERTEX",
-    "D3DRS_LOCALVIEWER",
-    "D3DRS_NORMALIZENORMALS",
-    "D3DRS_DIFFUSEMATERIALSOURCE",
-    "D3DRS_SPECULARMATERIALSOURCE",
-    "D3DRS_AMBIENTMATERIALSOURCE",
-    "D3DRS_EMISSIVEMATERIALSOURCE",
-    "D3DRS_VERTEXBLEND",
-    "D3DRS_CLIPPLANEENABLE",
-    "D3DRS_POINTSIZE",
-    "D3DRS_POINTSIZE_MIN",
-    "D3DRS_POINTSPRITEENABLE",
-    "D3DRS_POINTSCALEENABLE",
-    "D3DRS_POINTSCALE_A",
-    "D3DRS_POINTSCALE_B",
-    "D3DRS_POINTSCALE_C",
-    "D3DRS_MULTISAMPLEANTIALIAS",
-    "D3DRS_MULTISAMPLEMASK",
-    "D3DRS_PATCHEDGESTYLE",
-    "D3DRS_DEBUGMONITORTOKEN",
-    "D3DRS_POINTSIZE_MAX",
-    "D3DRS_INDEXEDVERTEXBLENDENABLE",
-    "D3DRS_COLORWRITEENABLE",
-    "D3DRS_TWEENFACTOR",
-    "D3DRS_BLENDOP",
-    "D3DRS_POSITIONDEGREE",
-    "D3DRS_NORMALDEGREE",
-    "D3DRS_SCISSORTESTENABLE",
-    "D3DRS_SLOPESCALEDEPTHBIAS",
-    "D3DRS_ANTIALIASEDLINEENABLE",
-    "D3DRS_MINTESSELLATIONLEVEL",
-    "D3DRS_MAXTESSELLATIONLEVEL",
-    "D3DRS_ADAPTIVETESS_X",
-    "D3DRS_ADAPTIVETESS_Y",
-    "D3DRS_ADAPTIVETESS_Z",
-    "D3DRS_ADAPTIVETESS_W",
-    "D3DRS_ENABLEADAPTIVETESSELLATION",
-    "D3DRS_TWOSIDEDSTENCILMODE",
-    "D3DRS_CCW_STENCILFAIL",
-    "D3DRS_CCW_STENCILZFAIL",
-    "D3DRS_CCW_STENCILPASS",
-    "D3DRS_CCW_STENCILFUNC",
-    "D3DRS_COLORWRITEENABLE1",
-    "D3DRS_COLORWRITEENABLE2",
-    "D3DRS_COLORWRITEENABLE3",
-    "D3DRS_BLENDFACTOR",
-    "D3DRS_SRGBWRITEENABLE",
-    "D3DRS_DEPTHBIAS",
-    "D3DRS_WRAP8",
-    "D3DRS_WRAP9",
-    "D3DRS_WRAP10",
-    "D3DRS_WRAP11",
-    "D3DRS_WRAP12",
-    "D3DRS_WRAP13",
-    "D3DRS_WRAP14",
-    "D3DRS_WRAP15",
-    "D3DRS_SEPARATEALPHABLENDENABLE",
-    "D3DRS_SRCBLENDALPHA",
-    "D3DRS_DESTBLENDALPHA",
-    "D3DRS_BLENDOPALPHA",
-])
-
 D3DMATERIALCOLORSOURCE = Enum("D3DMATERIALCOLORSOURCE", [
     "D3DMCS_MATERIAL",
     "D3DMCS_COLOR1",
     "D3DMCS_COLOR2",
 ])
 
-D3DWRAP = Flags(DWORD, [
-    "D3DWRAP_U",
-    "D3DWRAP_V",
-    "D3DWRAP_W",
-])
-
 D3DWRAPCOORD = Flags(DWORD, [
     "D3DWRAPCOORD_0",
     "D3DWRAPCOORD_1",
@@ -378,6 +266,147 @@ D3DCOLORWRITEENABLE = Flags(DWORD, [
     "D3DCOLORWRITEENABLE_ALPHA",
 ])
 
+D3DDEGREETYPE = Enum("D3DDEGREETYPE", [
+    "D3DDEGREE_LINEAR",
+    "D3DDEGREE_QUADRATIC",
+    "D3DDEGREE_CUBIC",
+    "D3DDEGREE_QUINTIC",
+])
+
+D3DPATCHEDGESTYLE = Enum("D3DPATCHEDGESTYLE", [
+    "D3DPATCHEDGE_DISCRETE",
+    "D3DPATCHEDGE_CONTINUOUS",
+])
+
+D3DVERTEXBLENDFLAGS = Enum("D3DVERTEXBLENDFLAGS", [
+    "D3DVBF_DISABLE",
+    "D3DVBF_1WEIGHTS",
+    "D3DVBF_2WEIGHTS",
+    "D3DVBF_3WEIGHTS",
+    "D3DVBF_TWEENING",
+    "D3DVBF_0WEIGHTS",
+])
+
+D3DDEBUGMONITORTOKENS = Enum("D3DDEBUGMONITORTOKENS", [
+    "D3DDMT_ENABLE",
+    "D3DDMT_DISABLE",
+])
+
+# TODO: Convert these to/from actual floats
+FLOAT_AS_DWORD = DWORD
+
+D3DRENDERSTATEVALUE = Polymorphic(DWORD, "State", [
+    ("D3DRS_ZENABLE", D3DZBUFFERTYPE),
+    ("D3DRS_FILLMODE", D3DFILLMODE),
+    ("D3DRS_SHADEMODE", D3DSHADEMODE),
+    ("D3DRS_ZWRITEENABLE", BOOL),
+    ("D3DRS_ALPHATESTENABLE", BOOL),
+    ("D3DRS_LASTPIXEL", BOOL),
+    ("D3DRS_SRCBLEND", D3DBLEND),
+    ("D3DRS_DESTBLEND", D3DBLEND),
+    ("D3DRS_CULLMODE", D3DCULL),
+    ("D3DRS_ZFUNC", D3DCMPFUNC),
+    ("D3DRS_ALPHAREF", DWORD),
+    ("D3DRS_ALPHAFUNC", D3DCMPFUNC),
+    ("D3DRS_DITHERENABLE", BOOL),
+    ("D3DRS_ALPHABLENDENABLE", BOOL),
+    ("D3DRS_FOGENABLE", BOOL),
+    ("D3DRS_SPECULARENABLE", BOOL),
+    ("D3DRS_FOGCOLOR", D3DCOLOR),
+    ("D3DRS_FOGTABLEMODE", D3DFOGMODE),
+    ("D3DRS_FOGSTART", FLOAT_AS_DWORD),
+    ("D3DRS_FOGEND", FLOAT_AS_DWORD),
+    ("D3DRS_FOGDENSITY", FLOAT_AS_DWORD),
+    ("D3DRS_RANGEFOGENABLE", BOOL),
+    ("D3DRS_STENCILENABLE", BOOL),
+    ("D3DRS_STENCILFAIL", D3DSTENCILOP),
+    ("D3DRS_STENCILZFAIL", D3DSTENCILOP),
+    ("D3DRS_STENCILPASS", D3DSTENCILOP),
+    ("D3DRS_STENCILFUNC", D3DCMPFUNC),
+    ("D3DRS_STENCILREF", DWORD),
+    ("D3DRS_STENCILMASK", DWORD),
+    ("D3DRS_STENCILWRITEMASK", DWORD),
+    ("D3DRS_TEXTUREFACTOR", D3DCOLOR),
+    ("D3DRS_WRAP0", D3DWRAPCOORD),
+    ("D3DRS_WRAP1", D3DWRAPCOORD),
+    ("D3DRS_WRAP2", D3DWRAPCOORD),
+    ("D3DRS_WRAP3", D3DWRAPCOORD),
+    ("D3DRS_WRAP4", D3DWRAPCOORD),
+    ("D3DRS_WRAP5", D3DWRAPCOORD),
+    ("D3DRS_WRAP6", D3DWRAPCOORD),
+    ("D3DRS_WRAP7", D3DWRAPCOORD),
+    ("D3DRS_CLIPPING", BOOL),
+    ("D3DRS_LIGHTING", BOOL),
+    ("D3DRS_AMBIENT", D3DCOLOR),
+    ("D3DRS_FOGVERTEXMODE", D3DFOGMODE),
+    ("D3DRS_COLORVERTEX", BOOL),
+    ("D3DRS_LOCALVIEWER", BOOL),
+    ("D3DRS_NORMALIZENORMALS", BOOL),
+    ("D3DRS_DIFFUSEMATERIALSOURCE", D3DMATERIALCOLORSOURCE),
+    ("D3DRS_SPECULARMATERIALSOURCE", D3DMATERIALCOLORSOURCE),
+    ("D3DRS_AMBIENTMATERIALSOURCE", D3DMATERIALCOLORSOURCE),
+    ("D3DRS_EMISSIVEMATERIALSOURCE", D3DMATERIALCOLORSOURCE),
+    ("D3DRS_VERTEXBLEND", D3DVERTEXBLENDFLAGS),
+    ("D3DRS_CLIPPLANEENABLE", D3DCLIPPLANE),
+    ("D3DRS_POINTSIZE", FLOAT_AS_DWORD),
+    ("D3DRS_POINTSIZE_MIN", FLOAT_AS_DWORD),
+    ("D3DRS_POINTSPRITEENABLE", BOOL),
+    ("D3DRS_POINTSCALEENABLE", BOOL),
+    ("D3DRS_POINTSCALE_A", FLOAT_AS_DWORD),
+    ("D3DRS_POINTSCALE_B", FLOAT_AS_DWORD),
+    ("D3DRS_POINTSCALE_C", FLOAT_AS_DWORD),
+    ("D3DRS_MULTISAMPLEANTIALIAS", BOOL),
+    ("D3DRS_MULTISAMPLEMASK", DWORD),
+    ("D3DRS_PATCHEDGESTYLE", D3DPATCHEDGESTYLE),
+    ("D3DRS_DEBUGMONITORTOKEN", D3DDEBUGMONITORTOKENS),
+    ("D3DRS_POINTSIZE_MAX", FLOAT_AS_DWORD),
+    ("D3DRS_INDEXEDVERTEXBLENDENABLE", BOOL),
+    ("D3DRS_COLORWRITEENABLE", DWORD),
+    ("D3DRS_TWEENFACTOR", FLOAT_AS_DWORD),
+    ("D3DRS_BLENDOP", D3DBLENDOP),
+    ("D3DRS_POSITIONDEGREE", D3DDEGREETYPE),
+    ("D3DRS_NORMALDEGREE", D3DDEGREETYPE),
+    ("D3DRS_SCISSORTESTENABLE", BOOL),
+    ("D3DRS_SLOPESCALEDEPTHBIAS", FLOAT_AS_DWORD),
+    ("D3DRS_ANTIALIASEDLINEENABLE", BOOL),
+    ("D3DRS_MINTESSELLATIONLEVEL", FLOAT_AS_DWORD),
+    ("D3DRS_MAXTESSELLATIONLEVEL", FLOAT_AS_DWORD),
+    ("D3DRS_ADAPTIVETESS_X", FLOAT_AS_DWORD),
+    ("D3DRS_ADAPTIVETESS_Y", FLOAT_AS_DWORD),
+    ("D3DRS_ADAPTIVETESS_Z", FLOAT_AS_DWORD),
+    ("D3DRS_ADAPTIVETESS_W", FLOAT_AS_DWORD),
+    ("D3DRS_ENABLEADAPTIVETESSELLATION", BOOL),
+    ("D3DRS_TWOSIDEDSTENCILMODE", BOOL),
+    ("D3DRS_CCW_STENCILFAIL", D3DSTENCILOP),
+    ("D3DRS_CCW_STENCILZFAIL", D3DSTENCILOP),
+    ("D3DRS_CCW_STENCILPASS", D3DSTENCILOP),
+    ("D3DRS_CCW_STENCILFUNC", D3DCMPFUNC),
+    ("D3DRS_COLORWRITEENABLE1", D3DCOLORWRITEENABLE),
+    ("D3DRS_COLORWRITEENABLE2", D3DCOLORWRITEENABLE),
+    ("D3DRS_COLORWRITEENABLE3", D3DCOLORWRITEENABLE),
+    ("D3DRS_BLENDFACTOR", D3DCOLOR),
+    ("D3DRS_SRGBWRITEENABLE", BOOL),
+    ("D3DRS_DEPTHBIAS", FLOAT_AS_DWORD),
+    ("D3DRS_WRAP8", D3DWRAPCOORD),
+    ("D3DRS_WRAP9", D3DWRAPCOORD),
+    ("D3DRS_WRAP10", D3DWRAPCOORD),
+    ("D3DRS_WRAP11", D3DWRAPCOORD),
+    ("D3DRS_WRAP12", D3DWRAPCOORD),
+    ("D3DRS_WRAP13", D3DWRAPCOORD),
+    ("D3DRS_WRAP14", D3DWRAPCOORD),
+    ("D3DRS_WRAP15", D3DWRAPCOORD),
+    ("D3DRS_SEPARATEALPHABLENDENABLE", BOOL),
+    ("D3DRS_SRCBLENDALPHA", D3DBLEND),
+    ("D3DRS_DESTBLENDALPHA", D3DBLEND),
+    ("D3DRS_BLENDOPALPHA", D3DBLENDOP),
+
+    # XXX: D3DRENDERSTATE_WRAPBIAS + n
+])
+
+D3DRENDERSTATETYPE = Enum("D3DRENDERSTATETYPE",
+    [expr for expr, types in D3DRENDERSTATEVALUE.switch_types]
+)
+
 D3DTEXTURESTAGESTATETYPE = Enum("D3DTEXTURESTAGESTATETYPE", [
     "D3DTSS_COLOROP",
     "D3DTSS_COLORARG1",
@@ -800,33 +829,12 @@ D3DBASISTYPE = Enum("D3DBASISTYPE", [
     "D3DBASIS_CATMULL_ROM",
 ])
 
-D3DDEGREETYPE = Enum("D3DDEGREETYPE", [
-    "D3DDEGREE_LINEAR",
-    "D3DDEGREE_QUADRATIC",
-    "D3DDEGREE_CUBIC",
-    "D3DDEGREE_QUINTIC",
-])
-
-D3DPATCHEDGESTYLE = Enum("D3DPATCHEDGESTYLE", [
-    "D3DPATCHEDGE_DISCRETE",
-    "D3DPATCHEDGE_CONTINUOUS",
-])
-
 D3DSTATEBLOCKTYPE = Enum("D3DSTATEBLOCKTYPE", [
     "D3DSBT_ALL",
     "D3DSBT_PIXELSTATE",
     "D3DSBT_VERTEXSTATE",
 ])
 
-D3DVERTEXBLENDFLAGS = Enum("D3DVERTEXBLENDFLAGS", [
-    "D3DVBF_DISABLE",
-    "D3DVBF_1WEIGHTS",
-    "D3DVBF_2WEIGHTS",
-    "D3DVBF_3WEIGHTS",
-    "D3DVBF_TWEENING",
-    "D3DVBF_0WEIGHTS",
-])
-
 D3DTEXTURETRANSFORMFLAGS = Enum("D3DTEXTURETRANSFORMFLAGS", [
     "D3DTTFF_DISABLE",
     "D3DTTFF_COUNT1",
@@ -1159,11 +1167,6 @@ D3DRASTER_STATUS = Struct("D3DRASTER_STATUS", [
     (UINT, "ScanLine"),
 ])
 
-D3DDEBUGMONITORTOKENS = Enum("D3DDEBUGMONITORTOKENS", [
-    "D3DDMT_ENABLE",
-    "D3DDMT_DISABLE",
-])
-
 D3DQUERYTYPE = Enum("D3DQUERYTYPE", [
     "D3DQUERYTYPE_VCACHE",
     "D3DQUERYTYPE_RESOURCEMANAGER",
index 53d874ee9cafc7225e716c08462a08368ce6754f..1b9bf58ad5f5ab0f4b6cb57f5f6f275048e3f628 100644 (file)
@@ -338,6 +338,18 @@ def OpaqueBlob(type, size):
     return Opaque(type.expr + ' *')
 
 
+class Polymorphic(Type):
+
+    def __init__(self, default_type, switch_expr, switch_types):
+        Type.__init__(self, default_type.expr)
+        self.default_type = default_type
+        self.switch_expr = switch_expr
+        self.switch_types = switch_types
+
+    def visit(self, visitor, *args, **kwargs):
+        return visitor.visit_polymorphic(self, *args, **kwargs)
+
+
 class Visitor:
 
     def visit(self, type, *args, **kwargs):
@@ -385,6 +397,10 @@ class Visitor:
     def visit_interface(self, interface, *args, **kwargs):
         raise NotImplementedError
 
+    def visit_polymorphic(self, polymorphic, *args, **kwargs):
+        raise NotImplementedError
+        #return self.visit(polymorphic.default_type, *args, **kwargs)
+
 
 class OnceVisitor(Visitor):
 
@@ -446,6 +462,12 @@ class Rebuilder(Visitor):
     def visit_opaque(self, opaque):
         return opaque
 
+    def visit_polymorphic(self, polymorphic):
+        default_type = self.visit(polymorphic.default_type)
+        switch_expr = polymorphic.switch_expr
+        switch_types = [(expr, self.visit(type)) for expr, type in polymorphic.switch_types]
+        return Polymorphic(default_type, switch_expr, switch_types)
+
 
 class Collector(Visitor):
     '''Collect.'''
@@ -509,6 +531,11 @@ class Collector(Visitor):
                 self.visit(arg.type)
             self.visit(method.type)
 
+    def visit_polymorphic(self, polymorphic):
+        self.visit(polymorphic.default_type)
+        for expr, type in polymorphic.switch_types:
+            self.visit(type)
+
 
 class API:
 
index 59e1a831e8cb084fad5f3a794676b22f462a6ba4..2c31c92073ee1db29eca5fc665e2a2ccf4283706 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -135,6 +135,9 @@ class DumpDeclarator(stdapi.OnceVisitor):
         print "};"
         print
 
+    def visit_polymorphic(self, polymorphic):
+        pass
+
 
 class DumpImplementer(stdapi.Visitor):
     '''Dump an instance.'''
@@ -202,6 +205,17 @@ class DumpImplementer(stdapi.Visitor):
     def visit_interface(self, interface, instance):
         print '    Trace::localWriter.writeOpaque((const void *)&%s);' % instance
 
+    def visit_polymorphic(self, polymorphic, instance):
+        print '    switch (%s) {' % polymorphic.switch_expr
+        for expr, type in polymorphic.switch_types:
+            print '    case %s:' % expr
+            self.visit(type, 'static_cast<%s>(%s)' % (type, instance));
+            print '        break;'
+        print '    default:'
+        self.visit(polymorphic.default_type, instance);
+        print '        break;'
+        print '    }'
+
 
 dump_instance = DumpImplementer().visit
 
@@ -259,6 +273,10 @@ class Wrapper(stdapi.Visitor):
         print "    if (%s) {" % instance
         print "        %s = new %s(%s);" % (instance, interface_wrap_name(interface), instance)
         print "    }"
+    
+    def visit_polymorphic(self, type, instance):
+        # XXX: There might be polymorphic values that need wrapping in the future
+        pass
 
 
 class Unwrapper(Wrapper):