summaryrefslogtreecommitdiff
path: root/devtools/bin/playback_getstate.pl
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/bin/playback_getstate.pl')
-rw-r--r--devtools/bin/playback_getstate.pl169
1 files changed, 169 insertions, 0 deletions
diff --git a/devtools/bin/playback_getstate.pl b/devtools/bin/playback_getstate.pl
new file mode 100644
index 0000000..0796e4e
--- /dev/null
+++ b/devtools/bin/playback_getstate.pl
@@ -0,0 +1,169 @@
+# getfinalstate.pl blah.txt line
+# note: the state is *before* the line that you specify
+die "Usage: playback_getstate.pl blah.txt cmd\n" if scalar( @ARGV ) != 2;
+
+open INPUT, shift || die;
+$desiredcmd = shift;
+$line = 0;
+
+sub PadNumber
+{
+ local( $str ) = shift;
+ local( $desiredLen ) = shift;
+ local( $len ) = length $str;
+ while( $len < $desiredLen )
+ {
+ $str = "0" . $str;
+ $len++;
+ }
+ return $str;
+}
+
+
+while( <INPUT> )
+{
+ m/^cmd: (\d+) /;
+ $cmdnum = $1;
+# print "$cmdnum\n";
+ if( $cmdnum == $desiredcmd )
+ {
+ print "$_";
+ last;
+ }
+ if( /Dx8SetTextureStageState:\s*stage:\s*(\d+)\s*state:\s*(\S+)\s*,\s*value:\s*(\S+)/ )
+ {
+ $texturestate{"$2 $1"} = $3;
+# print "$1 $2 $3\n";
+ }
+# elsif( /Dx8SetTextureStageState/i )
+# {
+# die "$_";
+# }
+
+ if( /Dx8SetRenderState:\s*(\S+)\s+(\S+.*)*$/ )
+ {
+ $renderstate{$1} = $2;
+ }
+# elsif( /Dx8SetRenderState/i )
+# {
+# die "$_";
+# }
+
+ if( /Dx8SetVertexShaderConstant:\s*reg:\s*(\d+)\s*numvecs:\s*(\d+)\s*val:\s*(.*)$/ )
+ {
+ local( $reg ) = $1;
+ local( $count ) = $2;
+ local( $val ) = $3;
+ local( $i );
+ for( $i = 0; $i < $count; $i++, $reg++ )
+ {
+ $val =~ s/^\s*(\[\s*\S+\s+\S+\s+\S+\s+\S+\s*\])(.*$)/$2/;
+ $vertconst{ "vshconst " . &PadNumber( $reg, 2 ) } = $1;
+ }
+ }
+# elsif( /Dx8SetVertexShaderConstant/i )
+# {
+# die "$_";
+# }
+
+ if( /Dx8SetPixelShaderConstant:\s*reg:\s*(\d+)\s*numvecs:\s*(\d+)\s*val:\s*(.*)$/ )
+ {
+ local( $reg ) = $1;
+ local( $count ) = $2;
+ local( $val ) = $3;
+ local( $i );
+ for( $i = 0; $i < $count; $i++, $reg++ )
+ {
+ $val =~ s/^\s*(\[\s*\S+\s+\S+\s+\S+\s+\S+\s*\])(.*$)/$2/;
+ $pixelconst{ "pshconst " . &PadNumber( $reg, 2 ) } = $1;
+ }
+ }
+# elsif( /Dx8SetPixelShaderConstant/i )
+# {
+# die "$_";
+# }
+
+ if( /Dx8SetStreamSource:\s*vertexBufferID:\s*(\d+)\s*streamID:\s*(\d+)\s*vertexSize:\s*(\d+)\s*$/ )
+ {
+ $streamsrc{$2} = "vertexBufferID: $1 vertexSize: $3";
+ }
+# elsif( /Dx8SetStreamSource/i )
+# {
+# die "$_";
+# }
+
+ if( /Dx8CreateVertexShader:\s*id:\s*(\d+)\s+dwDecl:\s*(.*)$/ )
+ {
+ $vshdecl{$1} = $2;
+ }
+ elsif( /Dx8CreateVertexShader/i )
+ {
+ die "$_";
+ }
+
+ if( /Dx8SetVertexShader:\s*vertexShader:\s*(\d+)\s*$/ )
+ {
+ $currentVertexShader = $1;
+ }
+ elsif( /Dx8SetVertexShader:/i )
+ {
+ die "$_";
+ }
+
+ if( /Dx8SetPixelShader:\s*pixelShader:\s*(\d+)\s*$/ )
+ {
+ $currentPixelShader = $1;
+ }
+ elsif( /Dx8SetPixelShader:/i )
+ {
+ die "$_";
+ }
+
+ if( /Dx8SetVertexBufferFormat:\s*id:\s*(\d+)\s*vertexFormat:\s*(.*)$/ )
+ {
+ $vbformat{$1} = $2;
+ }
+ elsif( /Dx8SetVertexBufferFormat/i )
+ {
+ die "$_";
+ }
+}
+close INPUT;
+
+foreach $state ( sort( keys( %texturestate ) ) )
+{
+ print "$state = $texturestate{$state}\n";
+}
+
+foreach $state ( sort( keys( %renderstate ) ) )
+{
+ print "$state = $renderstate{$state}\n";
+}
+
+foreach $state ( sort( keys( %vertconst ) ) )
+{
+ print "$state = $vertconst{$state}\n";
+}
+
+foreach $state ( sort( keys( %pixelconst ) ) )
+{
+ print "$state = $pixelconst{$state}\n";
+}
+
+foreach $state ( sort( keys( %streamsrc ) ) )
+{
+ $streamsrc{$state} =~ m/vertexBufferID:\s*(\d+)\s+/;
+ local( $vertbufid ) = $1;
+ print "stream $state = $streamsrc{$state} vbformat: $vbformat{$vertbufid}\n";
+}
+
+#foreach $state ( sort( keys( %vbformat ) ) )
+#{
+# print "vbformat $state = $vbformat{$state}\n";
+#}
+
+print "current vsh: $currentVertexShader vshdecl: $vshdecl{$currentVertexShader}\n";
+print "current psh: $currentPixelShader\n";
+
+
+