#define Vec4Swizzle(Target, Source, XTerm, YTerm, ZTerm, WTerm) Target.x = Source.XTerm; Target.y = Source.YTerm; Target.z = Source.ZTerm; Target.w = Source.WTerm;
struct InstructionToken
{
InstructionToken() {}
InstructionToken(DWORD _W)
{
W = _W;
}
__forceinline D3DSHADER_INSTRUCTION_OPCODE_TYPE OpCode() const
{
return D3DSHADER_INSTRUCTION_OPCODE_TYPE(GetInteger(W, 0, 15));
}
__forceinline UINT Size() const
{
return GetInteger(W, 24, 27);
}
__forceinline bool Predicated() const
{
return (GetBit(W, 28) == 1);
}
String ToString();
DWORD W;
};
struct SourceParameterToken
{
SourceParameterToken() {}
SourceParameterToken(DWORD _W)
{
W = _W;
}
__forceinline UINT RegisterOffset()
{
return GetInteger(W, 0, 10);
}
__forceinline D3DSHADER_PARAM_REGISTER_TYPE RegisterType()
{
UINT Value = (GetBit(W, 28) << 0) +
(GetBit(W, 29) << 1) +
(GetBit(W, 30) << 2) +
(GetBit(W, 11) << 3) +
(GetBit(W, 12) << 4);
Assert(Value <= D3DSPR_PREDICATE, "Invalid register type");
return D3DSHADER_PARAM_REGISTER_TYPE(Value);
}
__forceinline D3DSHADER_PARAM_SRCMOD_TYPE SourceModifier()
{
return D3DSHADER_PARAM_SRCMOD_TYPE(W & D3DSP_SRCMOD_MASK);
}
__forceinline D3DSHADER_ADDRESSMODE_TYPE AddressMode()
{
return D3DSHADER_ADDRESSMODE_TYPE(W & D3DSHADER_ADDRESSMODE_MASK);
}
__forceinline D3DSHADER_SWIZZLE_CHANNEL SwizzleChannels(UINT ChannelIndex)
{
Assert(ChannelIndex < 4, "Invalid channel index");
return D3DSHADER_SWIZZLE_CHANNEL((GetBit(W, 16 + ChannelIndex * 2 + 0) << 0) +
(GetBit(W, 16 + ChannelIndex * 2 + 1) << 1));
}
__forceinline bool IdentitySwizzle()
{
return (SwizzleChannels(0) == D3DSWC_X &&
SwizzleChannels(1) == D3DSWC_Y &&
SwizzleChannels(2) == D3DSWC_Z &&
SwizzleChannels(3) == D3DSWC_W);
}
String ToString(SourceParameterToken RelativeToken);
String ToString()
{
return ToString(0);
}
DWORD W;
};
struct DestinationParameterToken
{
DestinationParameterToken() {}
DestinationParameterToken(DWORD _W)
{
W = _W;
}
__forceinline UINT RegisterOffset()
{
return GetInteger(W, 0, 10);
}
__forceinline D3DSHADER_PARAM_REGISTER_TYPE RegisterType()
{
UINT Value = (GetBit(W, 28) << 0) +
(GetBit(W, 29) << 1) +
(GetBit(W, 30) << 2) +
(GetBit(W, 11) << 3) +
(GetBit(W, 12) << 4);
Assert(Value <= D3DSPR_PREDICATE, "Invalid register type");
return D3DSHADER_PARAM_REGISTER_TYPE(Value);
}
__forceinline UINT WriteMask(UINT ComponentIndex)
{
return GetBit(W, 16 + ComponentIndex);
}
__forceinline D3DSHADER_ADDRESSMODE_TYPE AddressMode()
{
return D3DSHADER_ADDRESSMODE_TYPE(W & D3DSHADER_ADDRESSMODE_MASK);
}
String ToString();
DWORD W;
};
const UINT MaxParameterTokens = 8;
struct ShaderInstruction
{
String ToString();
__forceinline DestinationParameterToken GetDestinationParameterToken()
{
return DestinationParameterToken(_ParamaterTokens[0]);
}
__forceinline DestinationParameterToken GetRelativeDestinationParameterToken()
{
return DestinationParameterToken(_ParamaterTokens[1]);
}
SourceParameterToken GetSourceParameterToken(UINT Index)
{
UINT ActualTokensProcessed = 0;
for(UINT i = 0; i < MaxParameterTokens; i++)
{
if(ActualTokensProcessed == Index + 1)
{
return SourceParameterToken(_ParamaterTokens[i]);
}
if(SourceParameterToken(_ParamaterTokens[i]).AddressMode() == D3DSHADER_ADDRMODE_RELATIVE)
{
i++;
}
ActualTokensProcessed++;
}
return SourceParameterToken(0);
}
SourceParameterToken GetRelativeSourceParameterToken(UINT Index)
{
UINT ActualTokensProcessed = 0;
for(UINT i = 0; i < MaxParameterTokens; i++)
{
if(ActualTokensProcessed == Index + 1)
{
return SourceParameterToken(_ParamaterTokens[i + 1]);
}
if(SourceParameterToken(_ParamaterTokens[i]).AddressMode() == D3DSHADER_ADDRMODE_RELATIVE)
{
i++;
}
ActualTokensProcessed++;
}
return SourceParameterToken(0);
}
InstructionToken _InstructionToken;
DWORD _ParamaterTokens[MaxParameterTokens];
};
struct CompleteShaderInstruction
{
String ToString();
String Comment;
ShaderInstruction _Instruction;
};