public static void EnsureValidTextureSize( this int sizeValue, HardwareDriverLevel driverLevel, string checkedVariableName, [CallerMemberName] string callerMethod = "") { if (string.IsNullOrEmpty(callerMethod)) { callerMethod = "Unknown"; } // Check for positive value if (sizeValue < 1) { throw new SeeingSharpCheckException(string.Format( "Texture Size value {0} within method {1} musst not be smaller that 1!", checkedVariableName, callerMethod)); } // Check for "power of 2" if (Math.Abs((double)sizeValue / 2) > EngineMath.TOLERANCE_DOUBLE_POSITIVE) { throw new SeeingSharpCheckException(string.Format( "Texture Size value {0} within method {1} musst be a power of 2!", checkedVariableName, callerMethod)); } // Check for maximum dimension // see https://msdn.microsoft.com/en-us/library/windows/desktop/ff476876(v=vs.85).aspx#Overview int maxDimension = 0; switch (driverLevel) { case HardwareDriverLevel.Direct3D9_1: case HardwareDriverLevel.Direct3D9_2: maxDimension = 2048; break; case HardwareDriverLevel.Direct3D9_3: maxDimension = 4096; break; case HardwareDriverLevel.Direct3D10: maxDimension = 8192; break; case HardwareDriverLevel.Direct3D11: case HardwareDriverLevel.Direct3D12: maxDimension = 16384; break; } if (sizeValue > maxDimension) { throw new SeeingSharpCheckException(string.Format( "Texture Size value {0} within method {1} can have a maximum of {2}!", checkedVariableName, callerMethod, maxDimension)); } }
/// <summary> /// Initializes a new instance of the <see cref="DeviceHandlerD3D11"/> class. /// </summary> /// <param name="dxgiAdapter">The tasrget adapter.</param> /// <param name="debugEnabled">Is debug mode enabled?</param> internal DeviceHandlerD3D11(DXGI.Adapter1 dxgiAdapter, bool debugEnabled) { m_dxgiAdapter = dxgiAdapter; // Define possible create flags D3D11.DeviceCreationFlags createFlagsBgra = D3D11.DeviceCreationFlags.BgraSupport; D3D11.DeviceCreationFlags createFlags = D3D11.DeviceCreationFlags.None; if (debugEnabled) { createFlagsBgra |= D3D11.DeviceCreationFlags.Debug; createFlags |= D3D11.DeviceCreationFlags.Debug; } // Define all steps on which we try to initialize Direct3D List <Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> > initParameterQueue = new List <Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> >(); // Define all trys for hardware initialization initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_11_1, createFlagsBgra, HardwareDriverLevel.Direct3D11)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_11_0, createFlagsBgra, HardwareDriverLevel.Direct3D11)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_10_0, createFlagsBgra, HardwareDriverLevel.Direct3D10)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_3, createFlagsBgra, HardwareDriverLevel.Direct3D9_3)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_2, createFlagsBgra, HardwareDriverLevel.Direct3D9_2)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_1, createFlagsBgra, HardwareDriverLevel.Direct3D9_1)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_10_0, createFlags, HardwareDriverLevel.Direct3D10)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_3, createFlags, HardwareDriverLevel.Direct3D9_3)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_2, createFlags, HardwareDriverLevel.Direct3D9_2)); initParameterQueue.Add(Tuple.Create( D3D.FeatureLevel.Level_9_1, createFlags, HardwareDriverLevel.Direct3D9_1)); // Try to create the device, each defined configuration step by step foreach (Tuple <D3D.FeatureLevel, D3D11.DeviceCreationFlags, HardwareDriverLevel> actInitParameters in initParameterQueue) { D3D.FeatureLevel featureLevel = actInitParameters.Item1; D3D11.DeviceCreationFlags direct3D11Flags = actInitParameters.Item2; HardwareDriverLevel actDriverLevel = actInitParameters.Item3; try { // Try to create the device using current parameters using (D3D11.Device device = new D3D11.Device(dxgiAdapter, direct3D11Flags, featureLevel)) { m_device1 = device.QueryInterface <D3D11.Device1>(); m_device3 = CommonTools.TryExecute(() => m_device1.QueryInterface <D3D11.Device3>()); if (m_device3 != null) { m_immediateContext3 = m_device3.ImmediateContext3; } } // Device successfully created, save all parameters and break this loop m_featureLevel = featureLevel; m_creationFlags = direct3D11Flags; m_driverLevel = actDriverLevel; break; } catch (Exception) { } } // Throw exception on failure if (m_device1 == null) { throw new SeeingSharpGraphicsException("Unable to initialize d3d11 device!"); } // Get immediate context from the device m_immediateContext = m_device1.ImmediateContext; }