⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxc_prep.pl

📁 hl2 source code. Do not use it illegal.
💻 PL
📖 第 1 页 / 共 2 页
字号:
	elsif( $shadername =~ m/vs11/i )
	{
		return "vs_1_1";
	}
	else
	{
		die;
	}
}

sub CalcNumCombos
{
	local( $i, $numCombos );
	$numCombos = 1;
	for( $i = 0; $i < scalar( @dynamicDefineNames ); $i++ )
	{
		$numCombos *= $dynamicDefineMax[$i] - $dynamicDefineMin[$i] + 1;
	}
	for( $i = 0; $i < scalar( @staticDefineNames ); $i++ )
	{
		$numCombos *= $staticDefineMax[$i] - $staticDefineMin[$i] + 1;
	}
	return $numCombos;
}

sub CalcNumDynamicCombos
{
	local( $i, $numCombos );
	$numCombos = 1;
	for( $i = 0; $i < scalar( @dynamicDefineNames ); $i++ )
	{
		$numCombos *= $dynamicDefineMax[$i] - $dynamicDefineMin[$i] + 1;
	}
	return $numCombos;
}

print "--------\n";

if( $g_dx9 )
{
	if( $nvidia )
	{
		if( $ps2a )
		{
			$fxctmp = "fxctmp9_nv3x";
		}
		else
		{
			$fxctmp = "fxctmp9_nv3x_ps20";
		}
	}
	else
	{
		$fxctmp = "fxctmp9";
	}
}
else
{
	$fxctmp = "fxctmp8";
}

if( !stat $fxctmp )
{
	mkdir $fxctmp, 0777 || die $!;
}

open FXC, "<$fxc_filename";
# READ THE TOP OF THE FILE TO FIND SHADER COMBOS
while( <FXC> )
{
	next if( m/^\s*$/ );
	last if( !m,^//, );
	s,^//\s*,,;
	if( m/\s*STATIC\s*\:\s*\"(.*)\"\s+\"(\d+)\.\.(\d+)\"/ )
	{
		local( $name, $min, $max );
		$name = $1;
		$min = $2;
		$max = $3;
		print "\"$name\" \"$min..$max\"\n";
		push @staticDefineNames, $name;
		push @staticDefineMin, $min;
		push @staticDefineMax, $max;
	}
	elsif( m/\s*DYNAMIC\s*\:\s*\"(.*)\"\s+\"(\d+)\.\.(\d+)\"/ )
	{
		local( $name, $min, $max );
		$name = $1;
		$min = $2;
		$max = $3;
		print "\"$name\" \"$min..$max\"\n";
		push @dynamicDefineNames, $name;
		push @dynamicDefineMin, $min;
		push @dynamicDefineMax, $max;
	}
}
seek FXC, 0, 0;
# READ THE WHOLE FILE AND FIND SKIP STATEMENTS
while( <FXC> )
{
	if( m/^\s*\/\/\s*SKIP\s*\:\s*(.*)$/ )
	{
		$perlskipcode .= "(" . $1 . ")||";
		push @perlskipcodeindividual, $1;
	}	
}
if( defined $perlskipcode )
{
	$perlskipcode .= "0";
	$perlskipcode =~ s/\n//g;
}
seek FXC, 0, 0;
# READ THE WHOLE FILE AND FIND CENTROID STATEMENTS
while( <FXC> )
{
	if( m/^\s*\/\/\s*CENTROID\s*\:\s*TEXCOORD(\d+)\s*$/ )
	{
		$centroidEnable{$1} = 1;
#		print "CENTROID: $1\n";
	}
}
close FXC;

# Go ahead an compute the mask of samplers that need to be centroid sampled
$centroidMask = 0;
foreach $centroidRegNum ( keys( %centroidEnable ) )
{
#	print "THING: $samplerName $centroidRegNum\n";
	$centroidMask += 1 << $centroidRegNum;
}

#printf "0x%x\n", $centroidMask;

#print "\$perlskipcode: $perlskipcode\n";

$numCombos = &CalcNumCombos();
print "$numCombos combos\n";

# Write out the C++ helper class for picking shader combos
&WriteHelperClasses();

push @outputHeader, "#ifdef DEFINE_SHADERS\n";

for( $i = 0; $i < $numCombos; $i++ )
{
	&SetPerlVarsForCombo( $i );
	local( $compileFailed );
	if( !defined $perlskipcode )
	{
		$ret = 0;
	}
	else
	{
		$ret = eval $perlskipcode;
	}
#	$ret = 0;
#	print "\$ret = $ret\n";
	if( !defined $ret )
	{
		die "$@\n";
	}
	if( $ret )
	{
		# skip this combo!
#		print "$i/$numCombos: SKIP\n";
		$compileFailed = 1;
		$numSkipped++;
	}
	else
	{
		local( $cmd );
		if( $fxc_filename =~ /_vs/i )
		{
			#$cmd = "..\\..\\devtools\\bin\\oldfxc.exe ";
			$cmd = "..\\..\\devtools\\bin\\fxc.exe ";
		}
		else
		{
			$cmd = "..\\..\\devtools\\bin\\fxc.exe ";
		}
		$cmd .= &BuildDefineOptions( $i );
		$cmd .= &RenameMain( $fxc_filename, $i );
		$cmd .= "/T" . &GetShaderType( $fxc_filename ) . " ";
		if( $debug )
		{
			$cmd .= "/Od "; # disable optimizations
			$cmd .= "/Zi "; # enable debug info
		}
		$cmd .= "/nologo ";
	#	$cmd .= "/Gp ";  # predication
		if( $fxc_filename =~ /ps20/i && $forcehalf )
		{
			$cmd .= "/Gpp "; # use half everywhere
		}
		$cmd .= "/Fhtmpshader.h ";
		$cmd .= "$fxc_filename";
		print $i . "/" . $numCombos . " " . $cmd . "\n";

		# GROSS!!  Have to suppress stderr output by redirecting to a file. . has to be a better way.
	#	@out = `$cmd 1<&2`;
		system "$cmd > shit.txt 2>&1";
		@out = `type shit.txt`;
		print @out;
		
		local( *FILE );
		if( !open FILE, "<tmpshader.h" )
		{
			$compileFailed = 1;
			die "compile failed\n";
		}
		else
		{
			$compileFailed = 0;

			@header = <FILE>;
			close FILE;
			unlink "tmpshader.h";
		}
	}

#	print "compileFailed: $compileFailed\n";

	if( !$compileFailed )
	{
#		print @header;

		local( $name ) = $fxc_filename;
		$name =~ s/\.fxc//gi;
		local( $line );
		foreach $line( @header )
		{
			if( $line =~ m/g_.*\[\]/ )
			{
				$line = "static unsigned int pixelShader_" . $name . "_" . $i . "[] =\n";
				$line =~ s/\./_/g;
			}
			push @outputHeader, $line;
		}
	}
	else
	{
		local( $name ) = $fxc_filename;
		$name =~ s/\.fxc//gi;

		push @outputHeader, "\n// Invalid material\n";
		push @outputHeader, "static unsigned int pixelShader_" . $name . "_" . $i . "[] =\n";
		push @outputHeader, "{\n";
		push @outputHeader, "\t0x00000000\n";
		push @outputHeader, "};\n\n";
	}
}

print "$numSkipped/$numCombos skipped\n";

local( $name ) = $fxc_filename;
$name =~ s/\.fxc//gi;
push @outputHeader, "static PrecompiledShaderByteCode_t " . $name . "_pixel_shaders[" . $numCombos . "] = \n";
push @outputHeader, "{\n";
local( $j );
for( $j = 0; $j < $numCombos; $j++ )
{
	local( $thing ) = "pixelShader_" . $name . "_" . $j;
	push @outputHeader, "\t{ " . "$thing, sizeof( $thing ) },\n";
}
push @outputHeader, "};\n";

push @outputHeader, "struct $name" . "PixelShader_t : public PrecompiledShader_t\n";
push @outputHeader, "{\n";
push @outputHeader, "\t$name" . "PixelShader_t()\n";
push @outputHeader, "\t{\n";
push @outputHeader, "\t\tm_nFlags = SHADER_CUSTOM_ENUMERATION;\n";
push @outputHeader, sprintf "\t\tm_nCentroidMask = 0x%x;\n", $centroidMask;
push @outputHeader, "\t\tm_pByteCode = " . $name . "_pixel_shaders;\n";
push @outputHeader, "\t\tm_nShaderCount = $numCombos;\n";
push @outputHeader, "\t\tm_pName = \"$name\";\n";
push @outputHeader, "\t\tm_nDynamicCombos = " . &CalcNumDynamicCombos . ";\n";
if( $name =~ /vs\d\d/ ) # hack
{
	push @outputHeader, "\t\tGetShaderDLL()->InsertPrecompiledShader( PRECOMPILED_VERTEX_SHADER, this );\n";
}
else
{
	push @outputHeader, "\t\tGetShaderDLL()->InsertPrecompiledShader( PRECOMPILED_PIXEL_SHADER, this );\n";
}
push @outputHeader, "\t}\n";
push @outputHeader, "};\n";

push @outputHeader, "static $name" . "PixelShader_t $name" . "_PixelShaderInstance;\n";

push @outputHeader, "#endif // DEFINE_SHADERS\n";

printf "writing $fxctmp/$name" . ".inc\n";

local( *FILE );
if( !open FILE, ">$fxctmp/$name" . ".inc" )
{
	die;
}
print FILE @outputHeader;
close FILE;
undef @outputHeader;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -