From b95e37292dde2d11b48b1d2e927d4ca2766be8de Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Mon, 16 Apr 2012 14:01:15 +0100 Subject: [PATCH] Improve tracing of ID3D11DeviceContext::CheckFeatureSupport. --- specs/d3d11.py | 18 +++++++++--------- specs/d3d9types.py | 24 ++++++------------------ specs/stdapi.py | 16 ++++++++++++---- wrappers/trace.py | 13 ++++++++++++- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/specs/d3d11.py b/specs/d3d11.py index 2381610..bbbf7fa 100644 --- a/specs/d3d11.py +++ b/specs/d3d11.py @@ -1020,14 +1020,6 @@ ID3D11CommandList.methods += [ StdMethod(UINT, "GetContextFlags", []), ] -D3D11_FEATURE = Enum("D3D11_FEATURE", [ - "D3D11_FEATURE_THREADING", - "D3D11_FEATURE_DOUBLES", - "D3D11_FEATURE_FORMAT_SUPPORT", - "D3D11_FEATURE_FORMAT_SUPPORT2", - "D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS", -]) - D3D11_FEATURE_DATA_THREADING = Struct("D3D11_FEATURE_DATA_THREADING", [ (BOOL, "DriverConcurrentCreates"), (BOOL, "DriverCommandLists"), @@ -1051,6 +1043,14 @@ D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS = Struct("D3D11_FEATURE_DATA_D3D10_X (BOOL, "ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x"), ]) +D3D11_FEATURE, D3D11_FEATURE_DATA = EnumPolymorphic("D3D11_FEATURE", "Feature", [ + ("D3D11_FEATURE_THREADING", Pointer(D3D11_FEATURE_DATA_THREADING)), + ("D3D11_FEATURE_DOUBLES", Pointer(D3D11_FEATURE_DATA_DOUBLES)), + ("D3D11_FEATURE_FORMAT_SUPPORT", Pointer(D3D11_FEATURE_DATA_FORMAT_SUPPORT)), + ("D3D11_FEATURE_FORMAT_SUPPORT2", Pointer(D3D11_FEATURE_DATA_FORMAT_SUPPORT2)), + ("D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS", Pointer(D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS)), +], Blob(Void, "FeatureSupportDataSize"), False) + ID3D11DeviceContext.methods += [ StdMethod(Void, "VSSetConstantBuffers", [(UINT, "StartSlot"), (UINT, "NumBuffers"), (Array(Const(ObjPointer(ID3D11Buffer)), "NumBuffers"), "ppConstantBuffers")]), StdMethod(Void, "PSSetShaderResources", [(UINT, "StartSlot"), (UINT, "NumViews"), (Array(Const(ObjPointer(ID3D11ShaderResourceView)), "NumViews"), "ppShaderResourceViews")]), @@ -1201,7 +1201,7 @@ ID3D11Device.methods += [ StdMethod(HRESULT, "CheckMultisampleQualityLevels", [(DXGI_FORMAT, "Format"), (UINT, "SampleCount"), Out(Pointer(UINT), "pNumQualityLevels")]), StdMethod(Void, "CheckCounterInfo", [Out(Pointer(D3D11_COUNTER_INFO), "pCounterInfo")]), StdMethod(HRESULT, "CheckCounter", [(Pointer(Const(D3D11_COUNTER_DESC)), "pDesc"), Out(Pointer(D3D11_COUNTER_TYPE), "pType"), Out(Pointer(UINT), "pActiveCounters"), Out(LPSTR, "szName"), Out(Pointer(UINT), "pNameLength"), Out(LPSTR, "szUnits"), Out(Pointer(UINT), "pUnitsLength"), Out(LPSTR, "szDescription"), Out(Pointer(UINT), "pDescriptionLength")]), - StdMethod(HRESULT, "CheckFeatureSupport", [(D3D11_FEATURE, "Feature"), Out(OpaqueBlob(Void, "FeatureSupportDataSize"), "pFeatureSupportData"), (UINT, "FeatureSupportDataSize")]), + StdMethod(HRESULT, "CheckFeatureSupport", [(D3D11_FEATURE, "Feature"), Out(D3D11_FEATURE_DATA, "pFeatureSupportData"), (UINT, "FeatureSupportDataSize")]), StdMethod(HRESULT, "GetPrivateData", [(REFGUID, "guid"), Out(Pointer(UINT), "pDataSize"), Out(OpaquePointer(Void), "pData")]), StdMethod(HRESULT, "SetPrivateData", [(REFGUID, "guid"), (UINT, "DataSize"), (OpaqueBlob(Const(Void), "DataSize"), "pData")]), StdMethod(HRESULT, "SetPrivateDataInterface", [(REFGUID, "guid"), (OpaquePointer(Const(IUnknown)), "pData")]), diff --git a/specs/d3d9types.py b/specs/d3d9types.py index 312eb2a..e836886 100644 --- a/specs/d3d9types.py +++ b/specs/d3d9types.py @@ -296,7 +296,7 @@ D3DDEBUGMONITORTOKENS = Enum("D3DDEBUGMONITORTOKENS", [ # TODO: Convert these to/from actual floats FLOAT_AS_DWORD = DWORD -D3DRENDERSTATEVALUE = Polymorphic(DWORD, "State", [ +D3DRENDERSTATETYPE, D3DRENDERSTATEVALUE = EnumPolymorphic("D3DRENDERSTATETYPE", "State", [ ("D3DRS_ZENABLE", D3DZBUFFERTYPE), ("D3DRS_FILLMODE", D3DFILLMODE), ("D3DRS_SHADEMODE", D3DSHADEMODE), @@ -402,11 +402,7 @@ D3DRENDERSTATEVALUE = Polymorphic(DWORD, "State", [ ("D3DRS_BLENDOPALPHA", D3DBLENDOP), # XXX: D3DRENDERSTATE_WRAPBIAS + n -]) - -D3DRENDERSTATETYPE = Enum("D3DRENDERSTATETYPE", [ - expr for expr, types in D3DRENDERSTATEVALUE.switchTypes -]) +], DWORD) D3DTSS_TCI = Flags(DWORD, [ #"D3DTSS_TCI_PASSTHRU", # 0 @@ -468,7 +464,7 @@ D3DTEXTURETRANSFORMFLAGS = Enum("D3DTEXTURETRANSFORMFLAGS", [ ]) -D3DTEXTURESTAGESTATEVALUE = Polymorphic(DWORD, "Type", [ +D3DTEXTURESTAGESTATETYPE, D3DTEXTURESTAGESTATEVALUE = EnumPolymorphic("D3DTEXTURESTAGESTATETYPE", "Type", [ ("D3DTSS_COLOROP", D3DTEXTUREOP), ("D3DTSS_COLORARG1", D3DTA), ("D3DTSS_COLORARG2", D3DTA), @@ -487,11 +483,7 @@ D3DTEXTURESTAGESTATEVALUE = Polymorphic(DWORD, "Type", [ ("D3DTSS_ALPHAARG0", D3DTA,), ("D3DTSS_RESULTARG", D3DTA,), ("D3DTSS_CONSTANT", D3DCOLOR), -]) - -D3DTEXTURESTAGESTATETYPE = Enum("D3DTEXTURESTAGESTATETYPE", [ - expr for expr, types in D3DTEXTURESTAGESTATEVALUE.switchTypes -]) +], DWORD) D3DTEXTUREFILTERTYPE = Enum("D3DTEXTUREFILTERTYPE", [ "D3DTEXF_NONE", @@ -503,7 +495,7 @@ D3DTEXTUREFILTERTYPE = Enum("D3DTEXTUREFILTERTYPE", [ "D3DTEXF_CONVOLUTIONMONO", ]) -D3DSAMPLERSTATEVALUE = Polymorphic(DWORD, "Type", [ +D3DSAMPLERSTATETYPE, D3DSAMPLERSTATEVALUE = EnumPolymorphic("D3DSAMPLERSTATETYPE", "Type", [ ("D3DSAMP_ADDRESSU", D3DTEXTUREADDRESS), ("D3DSAMP_ADDRESSV", D3DTEXTUREADDRESS), ("D3DSAMP_ADDRESSW", D3DTEXTUREADDRESS), @@ -517,11 +509,7 @@ D3DSAMPLERSTATEVALUE = Polymorphic(DWORD, "Type", [ ("D3DSAMP_SRGBTEXTURE", BOOL), ("D3DSAMP_ELEMENTINDEX", DWORD), ("D3DSAMP_DMAPOFFSET", DWORD), -]) - -D3DSAMPLERSTATETYPE = Enum("D3DSAMPLERSTATETYPE", [ - expr for expr, types in D3DSAMPLERSTATEVALUE.switchTypes -]) +], DWORD) D3DPV = Flags(DWORD, [ "D3DPV_DONOTCOPYDATA", diff --git a/specs/stdapi.py b/specs/stdapi.py index 745ea25..b099578 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -478,11 +478,12 @@ def OpaqueBlob(type, size): class Polymorphic(Type): - def __init__(self, defaultType, switchExpr, switchTypes): + def __init__(self, switchExpr, switchTypes, defaultType, contextLess=True): Type.__init__(self, defaultType.expr) - self.defaultType = defaultType self.switchExpr = switchExpr self.switchTypes = switchTypes + self.defaultType = defaultType + self.contextLess = contextLess def visit(self, visitor, *args, **kwargs): return visitor.visitPolymorphic(self, *args, **kwargs) @@ -504,6 +505,13 @@ class Polymorphic(Type): return zip(cases, types) +def EnumPolymorphic(enumName, switchExpr, switchTypes, defaultType, contextLess=True): + enumValues = [expr for expr, type in switchTypes] + enum = Enum(enumName, enumValues) + polymorphic = Polymorphic(switchExpr, switchTypes, defaultType, contextLess) + return enum, polymorphic + + class Visitor: '''Abstract visitor for the type hierarchy.''' @@ -675,10 +683,10 @@ class Rebuilder(Visitor): return interface def visitPolymorphic(self, polymorphic): - defaultType = self.visit(polymorphic.defaultType) switchExpr = polymorphic.switchExpr switchTypes = [(expr, self.visit(type)) for expr, type in polymorphic.switchTypes] - return Polymorphic(defaultType, switchExpr, switchTypes) + defaultType = self.visit(polymorphic.defaultType) + return Polymorphic(switchExpr, switchTypes, defaultType, polymorphic.contextLess) class MutableRebuilder(Rebuilder): diff --git a/wrappers/trace.py b/wrappers/trace.py index dd9fdd7..0064d86 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -136,6 +136,8 @@ class ComplexValueSerializer(stdapi.OnceVisitor): pass def visitPolymorphic(self, polymorphic): + if not polymorphic.contextLess: + return print 'static void _write__%s(int selector, const %s & value) {' % (polymorphic.tag, polymorphic.expr) print ' switch (selector) {' for cases, type in polymorphic.iterSwitch(): @@ -242,7 +244,16 @@ class ValueSerializer(stdapi.Visitor): assert False def visitPolymorphic(self, polymorphic, instance): - print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) + if polymorphic.contextLess: + print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) + else: + print ' switch (%s) {' % polymorphic.switchExpr + for cases, type in polymorphic.iterSwitch(): + for case in cases: + print ' %s:' % case + self.visit(type, 'static_cast<%s>(%s)' % (type, instance)) + print ' break;' + print ' }' class WrapDecider(stdapi.Traverser): -- 2.43.0