public void CopyMatchingNamedConstantsFrom( GpuProgramParameters source )
{
if ( this._namedConstants == null || source == null )
{
return;
}
var srcToDestNamedMap = new Dictionary<int, string>();
foreach ( var i in source._namedConstants.Map )
{
var paramName = i.Key;
var olddef = i.Value;
var newdef = FindNamedConstantDefinition( paramName, false );
if ( newdef == null )
{
continue;
}
// Copy data across, based on smallest common definition size
var srcsz = olddef.ElementSize*olddef.ArraySize;
var destsz = newdef.ElementSize*newdef.ArraySize;
var sz = Utility.Min( srcsz, destsz );
if ( newdef.IsFloat )
{
Memory.Copy( source.GetFloatPointer( olddef.PhysicalIndex ).Pointer,
GetFloatPointer( newdef.PhysicalIndex ).Pointer, sz*sizeof ( float ) );
}
else
{
Memory.Copy( source.GetIntPointer( olddef.PhysicalIndex ).Pointer, GetIntPointer( newdef.PhysicalIndex ).Pointer,
sz*sizeof ( int ) );
}
// we'll use this map to resolve autos later
// ignore the [0] aliases
if ( !paramName.EndsWith( "[0]" ) )
{
srcToDestNamedMap.Add( olddef.PhysicalIndex, paramName );
}
}
foreach ( var i in source.autoConstants )
{
var autoEntry = i;
// find dest physical index
if ( srcToDestNamedMap.ContainsKey( autoEntry.PhysicalIndex ) )
{
var miSecond = srcToDestNamedMap[ autoEntry.PhysicalIndex ];
if ( autoEntry.FData != 0 )
{
SetNamedAutoConstantReal( miSecond, autoEntry.Type, autoEntry.FData );
}
else
{
SetNamedAutoConstant( miSecond, autoEntry.Type, autoEntry.Data );
}
}
}
// Copy shared param sets
foreach ( var usage in source._sharedParamSets )
{
if ( !IsUsingSharedParameters( usage.Name ) )
{
AddSharedParameters( usage.SharedParameters );
}
}
}