internal void DetermineFSAASettings(Device d3D9Device,
int fsaa, string fsaaHint, Format d3DPixelFormat,
bool fullScreen, out MultisampleType outMultisampleType, out int outMultisampleQuality)
{
outMultisampleType = MultisampleType.None;
outMultisampleQuality = 0;
var ok = false;
var qualityHint = fsaaHint.Contains("Quality");
var origFSAA = fsaa;
var driverList = Direct3DDrivers;
var deviceDriver = _activeD3DDriver;
var device = _deviceManager.GetDeviceFromD3D9Device(d3D9Device);
foreach (var currDriver in driverList)
{
if ( currDriver.AdapterNumber != device.AdapterNumber )
continue;
deviceDriver = currDriver;
break;
}
var tryCsaa = false;
// NVIDIA, prefer CSAA if available for 8+
// it would be tempting to use getCapabilities()->getVendor() == GPU_NVIDIA but
// if this is the first window, caps will not be initialised yet
if (deviceDriver.AdapterIdentifier.VendorId == 0x10DE &&
fsaa >= 8)
{
tryCsaa = true;
}
while (!ok)
{
// Deal with special cases
if (tryCsaa)
{
// see http://developer.nvidia.com/object/coverage-sampled-aa.html
switch(fsaa)
{
case 8:
if (qualityHint)
{
outMultisampleType = MultisampleType.EightSamples;
outMultisampleQuality = 0;
}
else
{
outMultisampleType = MultisampleType.FourSamples;
outMultisampleQuality = 2;
}
break;
case 16:
if (qualityHint)
{
outMultisampleType = MultisampleType.EightSamples;
outMultisampleQuality = 2;
}
else
{
outMultisampleType = MultisampleType.FourSamples;
outMultisampleQuality = 4;
}
break;
}
}
else // !CSAA
{
outMultisampleType = (MultisampleType)fsaa;
outMultisampleQuality = 0;
}
int outQuality;
var hr = _pD3D.CheckDeviceMultisampleType(
deviceDriver.AdapterNumber, DeviceType.Hardware, d3DPixelFormat,
fullScreen, outMultisampleType, out outQuality );
if (hr && (!tryCsaa || outQuality > outMultisampleQuality))
{
ok = true;
}
else
{
// downgrade
if (tryCsaa && fsaa == 8)
{
// for CSAA, we'll try downgrading with quality mode at all samples.
// then try without quality, then drop CSAA
if (qualityHint)
{
// drop quality first
qualityHint = false;
}
else
{
// drop CSAA entirely
tryCsaa = false;
}
// return to original requested samples
fsaa = origFSAA;
}
else
{
// drop samples
--fsaa;
if (fsaa == 1)
{
// ran out of options, no FSAA
fsaa = 0;
ok = true;
}
}
}
} // while !ok
}