From: José Fonseca Date: Thu, 13 Oct 2011 08:52:52 +0000 (+0100) Subject: Allow basic specification of polymorphic types. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=16d46dde420c537783ac19821abc8dfc54451cef;p=apitrace Allow basic specification of polymorphic types. 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. --- diff --git a/specs/d3d9.py b/specs/d3d9.py index d1cceb3..cc39808 100644 --- a/specs/d3d9.py +++ b/specs/d3d9.py @@ -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")]), diff --git a/specs/d3d9types.py b/specs/d3d9types.py index 73011ee..6dc250c 100644 --- a/specs/d3d9types.py +++ b/specs/d3d9types.py @@ -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", diff --git a/specs/stdapi.py b/specs/stdapi.py index 53d874e..1b9bf58 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -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: diff --git a/trace.py b/trace.py index 59e1a83..2c31c92 100644 --- 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):