Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use String::CRC32;
- BEGIN {use File::Basename; push @INC, dirname($0); }
- require "valve_perl_helpers.pl";
- $dynamic_compile = defined $ENV{"dynamic_shaders"} && $ENV{"dynamic_shaders"} != 0;
- $depnum = 0;
- $baseSourceDir = ".";
- my %dep;
- sub GetAsmShaderDependencies_R
- {
- local( $shadername ) = shift;
- local( *SHADER );
- open SHADER, "<$shadername";
- while( <SHADER> )
- {
- if( m/^\s*\#\s*include\s+\"(.*)\"/ )
- {
- # make sure it isn't in there already.
- if( !defined( $dep{$1} ) )
- {
- $dep{$1} = 1;
- GetAsmShaderDependencies_R( $1 );
- }
- }
- }
- close SHADER;
- }
- sub GetAsmShaderDependencies
- {
- local( $shadername ) = shift;
- undef %dep;
- GetAsmShaderDependencies_R( $shadername );
- # local( $i );
- # foreach $i ( keys( %dep ) )
- # {
- # print "$shadername depends on $i\n";
- # }
- return keys( %dep );
- }
- sub GetShaderType
- {
- my $shadername = shift;
- my $shadertype;
- if( $shadername =~ m/\.vsh/i )
- {
- $shadertype = "vsh";
- }
- elsif( $shadername =~ m/\.psh/i )
- {
- $shadertype = "psh";
- }
- elsif( $shadername =~ m/\.fxc/i )
- {
- $shadertype = "fxc";
- }
- else
- {
- die;
- }
- return $shadertype;
- }
- sub GetShaderSrc
- {
- my $shadername = shift;
- if ( $shadername =~ m/^(.*)-----/i )
- {
- return $1;
- }
- else
- {
- return $shadername;
- }
- }
- sub GetShaderBase
- {
- my $shadername = shift;
- if ( $shadername =~ m/-----(.*)$/i )
- {
- return $1;
- }
- else
- {
- my $shadertype = &GetShaderType( $shadername );
- $shadername =~ s/\.$shadertype//i;
- return $shadername;
- }
- }
- sub DoAsmShader
- {
- my $argstring = shift;
- my $shadername = &GetShaderSrc( $argstring );
- my $shaderbase = &GetShaderBase( $argstring );
- my $shadertype = &GetShaderType( $argstring );
- my $incfile = "";
- if( $shadertype eq "fxc" || $shadertype eq "vsh" )
- {
- $incfile = $shadertype . "tmp9" . $g_tmpfolder . "\\$shaderbase.inc ";
- }
- my $vcsfile = $shaderbase . $g_vcsext;
- my $bWillCompileVcs = 1;
- if( ( $shadertype eq "fxc") && $dynamic_compile )
- {
- $bWillCompileVcs = 0;
- }
- if( $shadercrcpass{$argstring} )
- {
- $bWillCompileVcs = 0;
- }
- if( $bWillCompileVcs )
- {
- &output_makefile_line( $incfile . "shaders\\$shadertype\\$vcsfile: $shadername @dep\n") ;
- }
- else
- {
- # psh files don't need a rule at this point since they don't have inc files and we aren't compiling a vcs.
- if( $shadertype eq "fxc" || $shadertype eq "vsh" )
- {
- &output_makefile_line( $incfile . ": $shadername @dep\n") ;
- }
- }
- my $x360switch = "";
- my $moreswitches = "";
- if( !$bWillCompileVcs && $shadertype eq "fxc" )
- {
- $moreswitches .= "-novcs ";
- }
- if( $g_x360 )
- {
- $x360switch = "-x360";
- if( $bWillCompileVcs && ( $shaderbase =~ m/_ps20$/i ) )
- {
- $moreswitches .= "-novcs ";
- $bWillCompileVcs = 0;
- }
- }
- # if we are psh and we are compiling the vcs, we don't need this rule.
- if( !( $shadertype eq "psh" && !$bWillCompileVcs ) )
- {
- &output_makefile_line( "\tperl $g_SourceDir\\devtools\\bin\\" . $shadertype . "_prep.pl $moreswitches $x360switch -source \"$g_SourceDir\" $argstring\n") ;
- }
- if( $bWillCompileVcs )
- {
- &output_makefile_line( "\techo $shadername>> filestocopy.txt\n") ;
- my $dep;
- foreach $dep( @dep )
- {
- &output_makefile_line( "\techo $dep>> filestocopy.txt\n") ;
- }
- }
- &output_makefile_line( "\n") ;
- }
- if( scalar( @ARGV ) == 0 )
- {
- die "Usage updateshaders.pl shaderprojectbasename\n\tie: updateshaders.pl stdshaders_dx6\n";
- }
- $g_x360 = 0;
- $g_tmpfolder = "_tmp";
- $g_vcsext = ".vcs";
- while( 1 )
- {
- $inputbase = shift;
- if( $inputbase =~ m/-source/ )
- {
- $g_SourceDir = shift;
- }
- elsif( $inputbase =~ m/-x360/ )
- {
- $g_x360 = 1;
- $g_tmpfolder = "_360_tmp";
- $g_vcsext = ".360.vcs";
- }
- elsif( $inputbase =~ m/-execute/ )
- {
- $g_execute = 1;
- }
- elsif( $inputbase =~ m/-nv3x/ )
- {
- $nv3x = 1;
- }
- else
- {
- last;
- }
- }
- my @srcfiles = &LoadShaderListFile( $inputbase );
- open MAKEFILE, ">makefile\.$inputbase";
- open COPYFILE, ">makefile\.$inputbase\.copy";
- open INCLIST, ">inclist.txt";
- open VCSLIST, ">vcslist.txt";
- # make a default dependency that depends on all of the shaders.
- &output_makefile_line( "default: ") ;
- foreach $shader ( @srcfiles )
- {
- my $shadertype = &GetShaderType( $shader );
- my $shaderbase = &GetShaderBase( $shader );
- my $shadersrc = &GetShaderSrc( $shader );
- if( $shadertype eq "fxc" || $shadertype eq "vsh" )
- {
- # We only generate inc files for fxc and vsh files.
- my $incFileName = "$shadertype" . "tmp9" . $g_tmpfolder . "\\" . $shaderbase . "\.inc";
- &output_makefile_line( " $incFileName" );
- &output_inclist_line( "$incFileName\n" );
- }
- my $vcsfile = $shaderbase . $g_vcsext;
- my $compilevcs = 1;
- if( $shadertype eq "fxc" && $dynamic_compile )
- {
- $compilevcs = 0;
- }
- if( $g_x360 && ( $shaderbase =~ m/_ps20$/i ) )
- {
- $compilevcs = 0;
- }
- if( $compilevcs )
- {
- my $vcsFileName = "..\\..\\..\\game\\hl2\\shaders\\$shadertype\\$shaderbase" . $g_vcsext;
- # 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.
- &output_vcslist_line( "$vcsFileName\n" );
- $shadercrcpass{$shader} = &CheckCRCAgainstTarget( $shadersrc, $vcsFileName, 0 );
- if( $shadercrcpass{$shader} )
- {
- $compilevcs = 0;
- }
- }
- if( $compilevcs )
- {
- &output_makefile_line( " shaders\\$shadertype\\$vcsfile" );
- # emit a list of vcs files to copy to the target since we want to build them.
- &output_copyfile_line( GetShaderSrc($shader) . "-----" . GetShaderBase($shader) . "\n" );
- }
- }
- &output_makefile_line( "\n\n") ;
- # Insert all of our vertex shaders and depencencies
- $lastshader = "";
- foreach $shader ( @srcfiles )
- {
- my $currentshader = &GetShaderSrc( $shader );
- if ( $lastshader ne $currentshader )
- {
- $lastshader = $currentshader;
- @dep = &GetAsmShaderDependencies( $lastshader );
- }
- &DoAsmShader( $shader );
- }
- close VCSLIST;
- close INCLIST;
- close COPYFILE;
- close MAKEFILE;
- # nuke the copyfile if it is zero length
- if( ( stat "makefile\.$inputbase\.copy" )[7] == 0 )
- {
- unlink "makefile\.$inputbase\.copy";
- }
- sub output_makefile_line
- {
- local ($_)=@_;
- print MAKEFILE $_;
- }
- sub output_copyfile_line
- {
- local ($_)=@_;
- print COPYFILE $_;
- }
- sub output_vcslist_line
- {
- local ($_)=@_;
- print VCSLIST $_;
- }
- sub output_inclist_line
- {
- local ($_)=@_;
- print INCLIST $_;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement