Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6.39 KB | None | 0 0
  1. use String::CRC32;
  2. BEGIN {use File::Basename; push @INC, dirname($0); }
  3. require "valve_perl_helpers.pl";
  4.  
  5. $dynamic_compile = defined $ENV{"dynamic_shaders"} && $ENV{"dynamic_shaders"} != 0;
  6.  
  7. $depnum = 0;
  8. $baseSourceDir = ".";
  9.  
  10. my %dep;
  11.  
  12. sub GetAsmShaderDependencies_R
  13. {
  14.     local( $shadername ) = shift;
  15.     local( *SHADER );
  16.    
  17.     open SHADER, "<$shadername";
  18.     while( <SHADER> )
  19.     {
  20.         if( m/^\s*\#\s*include\s+\"(.*)\"/ )
  21.         {
  22.             # make sure it isn't in there already.
  23.             if( !defined( $dep{$1} ) )
  24.             {
  25.                 $dep{$1} = 1;
  26.                 GetAsmShaderDependencies_R( $1 );
  27.             }
  28.         }
  29.     }
  30.     close SHADER;
  31. }
  32.  
  33. sub GetAsmShaderDependencies
  34. {
  35.     local( $shadername ) = shift;
  36.     undef %dep;
  37.     GetAsmShaderDependencies_R( $shadername );
  38. #   local( $i );
  39. #   foreach $i ( keys( %dep ) )
  40. #   {
  41. #       print "$shadername depends on $i\n";
  42. #   }
  43.     return keys( %dep );
  44. }
  45.  
  46. sub GetShaderType
  47. {
  48.     my $shadername = shift;
  49.     my $shadertype;
  50.     if( $shadername =~ m/\.vsh/i )
  51.     {
  52.         $shadertype = "vsh";
  53.     }
  54.     elsif( $shadername =~ m/\.psh/i )
  55.     {
  56.         $shadertype = "psh";
  57.     }
  58.     elsif( $shadername =~ m/\.fxc/i )
  59.     {
  60.         $shadertype = "fxc";
  61.     }
  62.     else
  63.     {
  64.         die;
  65.     }
  66.     return $shadertype;
  67. }
  68.  
  69. sub GetShaderSrc
  70. {
  71.     my $shadername = shift;
  72.     if ( $shadername =~ m/^(.*)-----/i )
  73.     {
  74.         return $1;
  75.     }
  76.     else
  77.     {
  78.         return $shadername;
  79.     }
  80. }
  81.  
  82. sub GetShaderBase
  83. {
  84.     my $shadername = shift;
  85.     if ( $shadername =~ m/-----(.*)$/i )
  86.     {
  87.         return $1;
  88.     }
  89.     else
  90.     {
  91.         my $shadertype = &GetShaderType( $shadername );
  92.         $shadername =~ s/\.$shadertype//i;
  93.         return $shadername;
  94.     }
  95. }
  96.  
  97. sub DoAsmShader
  98. {
  99.     my $argstring = shift;
  100.     my $shadername = &GetShaderSrc( $argstring );
  101.     my $shaderbase = &GetShaderBase( $argstring );
  102.     my $shadertype = &GetShaderType( $argstring );
  103.     my $incfile = "";
  104.     if( $shadertype eq "fxc" || $shadertype eq "vsh" )
  105.     {
  106.         $incfile = $shadertype . "tmp9" . $g_tmpfolder . "\\$shaderbase.inc ";
  107.     }
  108.  
  109.     my $vcsfile = $shaderbase . $g_vcsext;
  110.     my $bWillCompileVcs = 1;
  111.     if( ( $shadertype eq "fxc") && $dynamic_compile )
  112.     {
  113.         $bWillCompileVcs = 0;
  114.     }
  115.     if( $shadercrcpass{$argstring} )
  116.     {
  117.         $bWillCompileVcs = 0;
  118.     }
  119.  
  120.     if( $bWillCompileVcs )
  121.     {
  122.         &output_makefile_line( $incfile . "shaders\\$shadertype\\$vcsfile: $shadername @dep\n") ;
  123.     }
  124.     else
  125.     {
  126.         # psh files don't need a rule at this point since they don't have inc files and we aren't compiling a vcs.
  127.         if( $shadertype eq "fxc" || $shadertype eq "vsh" )
  128.         {
  129.             &output_makefile_line( $incfile . ":  $shadername @dep\n") ;
  130.         }
  131.     }
  132.    
  133.  
  134.     my $x360switch = "";
  135.     my $moreswitches = "";
  136.     if( !$bWillCompileVcs && $shadertype eq "fxc" )
  137.     {
  138.         $moreswitches .= "-novcs ";
  139.     }
  140.     if( $g_x360 )
  141.     {
  142.         $x360switch = "-x360";
  143.        
  144.         if( $bWillCompileVcs && ( $shaderbase =~ m/_ps20$/i ) )
  145.         {
  146.             $moreswitches .= "-novcs ";
  147.             $bWillCompileVcs = 0;
  148.         }
  149.     }
  150.  
  151.     # if we are psh and we are compiling the vcs, we don't need this rule.
  152.     if( !( $shadertype eq "psh" && !$bWillCompileVcs ) )
  153.     {
  154.         &output_makefile_line( "\tperl $g_SourceDir\\devtools\\bin\\" . $shadertype . "_prep.pl $moreswitches $x360switch -source \"$g_SourceDir\" $argstring\n") ;
  155.     }
  156.  
  157.     if( $bWillCompileVcs )
  158.     {
  159.         &output_makefile_line( "\techo $shadername>> filestocopy.txt\n") ;
  160.         my $dep;
  161.         foreach $dep( @dep )
  162.         {
  163.             &output_makefile_line( "\techo $dep>> filestocopy.txt\n") ;
  164.         }
  165.     }
  166.     &output_makefile_line( "\n") ;
  167. }
  168.  
  169. if( scalar( @ARGV ) == 0 )
  170. {
  171.     die "Usage updateshaders.pl shaderprojectbasename\n\tie: updateshaders.pl stdshaders_dx6\n";
  172. }
  173.  
  174. $g_x360         = 0;
  175. $g_tmpfolder    = "_tmp";
  176. $g_vcsext       = ".vcs";
  177.  
  178. while( 1 )
  179. {
  180.     $inputbase = shift;
  181.  
  182.     if( $inputbase =~ m/-source/ )
  183.     {
  184.         $g_SourceDir = shift;
  185.     }
  186.     elsif( $inputbase =~ m/-x360/ )
  187.     {
  188.         $g_x360 = 1;
  189.         $g_tmpfolder = "_360_tmp";
  190.         $g_vcsext = ".360.vcs";
  191.     }
  192.     elsif( $inputbase =~ m/-execute/ )
  193.     {
  194.         $g_execute = 1;
  195.     }
  196.     elsif( $inputbase =~ m/-nv3x/ )
  197.     {
  198.         $nv3x = 1;
  199.     }
  200.     else
  201.     {
  202.         last;
  203.     }
  204. }
  205.  
  206. my @srcfiles = &LoadShaderListFile( $inputbase );
  207.  
  208. open MAKEFILE, ">makefile\.$inputbase";
  209. open COPYFILE, ">makefile\.$inputbase\.copy";
  210. open INCLIST, ">inclist.txt";
  211. open VCSLIST, ">vcslist.txt";
  212.  
  213. # make a default dependency that depends on all of the shaders.
  214. &output_makefile_line( "default: ") ;
  215. foreach $shader ( @srcfiles )
  216. {
  217.     my $shadertype = &GetShaderType( $shader );
  218.     my $shaderbase = &GetShaderBase( $shader );
  219.     my $shadersrc = &GetShaderSrc( $shader );
  220.     if( $shadertype eq "fxc" || $shadertype eq "vsh" )
  221.     {
  222.         # We only generate inc files for fxc and vsh files.
  223.         my $incFileName = "$shadertype" . "tmp9" . $g_tmpfolder . "\\" . $shaderbase . "\.inc";
  224.         &output_makefile_line( " $incFileName" );
  225.         &output_inclist_line( "$incFileName\n" );  
  226.     }
  227.  
  228.     my $vcsfile = $shaderbase . $g_vcsext;
  229.  
  230.     my $compilevcs = 1;
  231.     if( $shadertype eq "fxc" && $dynamic_compile )
  232.     {
  233.         $compilevcs = 0;
  234.     }
  235.     if( $g_x360 && ( $shaderbase =~ m/_ps20$/i ) )
  236.     {
  237.         $compilevcs = 0;
  238.     }
  239.     if( $compilevcs )
  240.     {
  241.         my $vcsFileName = "..\\..\\..\\game\\hl2\\shaders\\$shadertype\\$shaderbase" . $g_vcsext;
  242.         # We want to check for perforce operations even if the crc matches in the event that a file has been manually reverted and needs to be checked out again.
  243.         &output_vcslist_line( "$vcsFileName\n" );  
  244.         $shadercrcpass{$shader} = &CheckCRCAgainstTarget( $shadersrc, $vcsFileName, 0 );
  245.         if( $shadercrcpass{$shader} )
  246.         {
  247.             $compilevcs = 0;
  248.         }
  249.     }
  250.     if( $compilevcs )
  251.     {
  252.         &output_makefile_line( " shaders\\$shadertype\\$vcsfile" );
  253.         # emit a list of vcs files to copy to the target since we want to build them.
  254.         &output_copyfile_line( GetShaderSrc($shader) . "-----" . GetShaderBase($shader) . "\n" );
  255.     }
  256. }
  257. &output_makefile_line( "\n\n") ;
  258.  
  259. # Insert all of our vertex shaders and depencencies
  260. $lastshader = "";
  261. foreach $shader ( @srcfiles )
  262. {
  263.     my $currentshader = &GetShaderSrc( $shader );
  264.     if ( $lastshader ne $currentshader )
  265.     {
  266.         $lastshader = $currentshader;
  267.         @dep = &GetAsmShaderDependencies( $lastshader );
  268.     }
  269.     &DoAsmShader( $shader );
  270. }
  271. close VCSLIST;
  272. close INCLIST;
  273. close COPYFILE;
  274. close MAKEFILE;
  275.  
  276. # nuke the copyfile if it is zero length
  277. if( ( stat "makefile\.$inputbase\.copy" )[7] == 0 )
  278. {
  279.     unlink "makefile\.$inputbase\.copy";
  280. }
  281.  
  282. sub output_makefile_line
  283. {
  284.     local ($_)=@_;
  285.     print MAKEFILE $_;
  286. }
  287.  
  288. sub output_copyfile_line
  289. {
  290.     local ($_)=@_;
  291.     print COPYFILE $_;
  292. }
  293.  
  294. sub output_vcslist_line
  295. {
  296.     local ($_)=@_;
  297.     print VCSLIST $_;
  298. }
  299.  
  300. sub output_inclist_line
  301. {
  302.     local ($_)=@_;
  303.     print INCLIST $_;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement