public static bool CheckAdapterMeetsRequirements(int adapter, GraphicsDevice3DRequirements requirements)
        {
            // check formats against device type
            foreach (Format format in requirements.RtFormats)
            {
                if (!Manager.CheckDeviceType(adapter, requirements.DeviceType, requirements.DisplayFormat,
                                             format, requirements.Windowed))
                {
                    return(false);
                }
            }
            // multisample
            if (!Manager.CheckDeviceMultiSampleType(adapter, requirements.DeviceType, requirements.RtFormats[0],
                                                    requirements.Windowed, requirements.MultiSample))
            {
                return(false);
            }
            // depthstencil formats
            foreach (DepthFormat format in requirements.DepthFormats)
            {
                if (!Manager.CheckDepthStencilMatch(adapter, requirements.DeviceType, requirements.DisplayFormat,
                                                    requirements.RtFormats[0], format))
                {
                    return(false);
                }
            }

            // rts
            Caps caps = Manager.GetDeviceCaps(0, requirements.DeviceType);

            if (caps.NumberSimultaneousRts < requirements.NumRTs)
            {
                return(false);
            }

            // shaders
            if (requirements.PixelShader != null && requirements.PixelShader.CompareTo(caps.PixelShaderVersion) > 0)
            {
                return(false);
            }
            if (requirements.VertexShader != null && requirements.VertexShader.CompareTo(caps.VertexShaderVersion) > 0)
            {
                return(false);
            }

            if (requirements.Pure && !caps.DeviceCaps.SupportsPureDevice)
            {
                return(false);
            }
            if (requirements.HardwareTnL && !caps.DeviceCaps.SupportsHardwareTransformAndLight)
            {
                return(false);
            }

            return(true);
        }
        private static GraphicsDevice3DRequirements CheckReqs(int adapter, GraphicsDevice3DRequirements minReqs,
                                                              GraphicsDevice3DRequirements maxReqs)
        {
            DeviceType devType = minReqs.DeviceType;

            if (Manager.CheckDeviceType(adapter, maxReqs.DeviceType, minReqs.DisplayFormat, minReqs.RtFormats[0], maxReqs.Windowed))
            {
                devType = maxReqs.DeviceType;
            }

            Format[] rtFormats = minReqs.RtFormats;
            bool     useMax    = true;

            foreach (Format format in maxReqs.RtFormats)
            {
                if (!Manager.CheckDeviceType(adapter, devType, minReqs.DisplayFormat,
                                             format, minReqs.Windowed))
                {
                    useMax = false;
                    break;
                }
            }
            if (useMax)
            {
                rtFormats = maxReqs.RtFormats;
            }

            MultiSampleType ms = minReqs.MultiSample;

            if (Manager.CheckDeviceMultiSampleType(adapter, devType, rtFormats[0],
                                                   minReqs.Windowed, maxReqs.MultiSample))
            {
                ms = maxReqs.MultiSample;
            }

            Caps caps = Manager.GetDeviceCaps(adapter, devType);
            bool pure = minReqs.Pure;

            if (maxReqs.Pure && caps.DeviceCaps.SupportsPureDevice)
            {
                pure = true;
            }
            bool tnl = minReqs.HardwareTnL;

            if (maxReqs.HardwareTnL && caps.DeviceCaps.SupportsHardwareTransformAndLight)
            {
                tnl = true;
            }

            return(new GraphicsDevice3DRequirements(ms, devType, rtFormats, minReqs.NumRTs, minReqs.Windowed, minReqs.DepthFormats, pure, tnl, null, null, Format.Unknown));
        }
        public static GraphicsDevice3DOutputDescription CreateOutputDescription(int adapter,
                                                                                GraphicsDevice3DRequirements minReqs,
                                                                                GraphicsDevice3DRequirements maxReqs)
        {
            GraphicsDevice3DRequirements requirements = CheckReqs(adapter, minReqs, maxReqs);

            CreateFlags cFlags;
            if (requirements.Pure)
                cFlags = CreateFlags.PureDevice;
            else if (requirements.HardwareTnL)
                cFlags = CreateFlags.HardwareVertexProcessing;
            else
                cFlags = CreateFlags.SoftwareVertexProcessing;
            return new GraphicsDevice3DOutputDescription(adapter, requirements.Windowed, requirements.DeviceType,
                                                         requirements.RtFormats[0], requirements.MultiSample,
                                                         requirements.DepthFormats[0], cFlags);
        }
        public static bool CheckAdapterMeetsRequirements(int adapter, GraphicsDevice3DRequirements requirements)
        {
            // check formats against device type
            foreach (Format format in requirements.RtFormats)
            {
                if (!Manager.CheckDeviceType(adapter, requirements.DeviceType, requirements.DisplayFormat,
                                             format, requirements.Windowed))
                {
                    return false;
                }
            }
            // multisample
            if (!Manager.CheckDeviceMultiSampleType(adapter, requirements.DeviceType, requirements.RtFormats[0],
                                                    requirements.Windowed, requirements.MultiSample))
            {
                return false;
            }
            // depthstencil formats
            foreach (DepthFormat format in requirements.DepthFormats)
            {
                if (!Manager.CheckDepthStencilMatch(adapter, requirements.DeviceType, requirements.DisplayFormat,
                                                    requirements.RtFormats[0], format))
                {
                    return false;
                }
            }

            // rts
            Caps caps = Manager.GetDeviceCaps(0, requirements.DeviceType);
            if (caps.NumberSimultaneousRts < requirements.NumRTs)
                return false;

            // shaders
            if (requirements.PixelShader != null && requirements.PixelShader.CompareTo(caps.PixelShaderVersion) > 0)
                return false;
            if (requirements.VertexShader != null && requirements.VertexShader.CompareTo(caps.VertexShaderVersion) > 0)
                return false;

            if (requirements.Pure && !caps.DeviceCaps.SupportsPureDevice)
                return false;
            if (requirements.HardwareTnL && !caps.DeviceCaps.SupportsHardwareTransformAndLight)
                return false;

            return true;
        }
Esempio n. 5
0
        internal ABRenderViewControl(bool delayCreateDx)
        {
            InitializeComponent();

            minReqs = new GraphicsDevice3DRequirements(MultiSampleType.None, DeviceType.Hardware,
                                                       new Format[] { Format.X8R8G8B8 }, 1, true,
                                                       new DepthFormat[] { DepthFormat.D16 },
                                                       false, false, null, null, Format.X8R8G8B8);
            desiredReqs = new GraphicsDevice3DRequirements(MultiSampleType.FourSamples, DeviceType.Hardware,
                                                           new Format[] { Format.X8R8G8B8 }, 1, true,
                                                           new DepthFormat[] { DepthFormat.D16 },
                                                           false, true, null, null, Format.X8R8G8B8);

            if (!delayCreateDx)
            {
                CreateDxDevice();
            }
        }
        private static GraphicsDevice3DRequirements CheckReqs(int adapter, GraphicsDevice3DRequirements minReqs,
                                                              GraphicsDevice3DRequirements maxReqs)
        {
            DeviceType devType = minReqs.DeviceType;
            if (Manager.CheckDeviceType(adapter, maxReqs.DeviceType, minReqs.DisplayFormat, minReqs.RtFormats[0], maxReqs.Windowed))
                devType = maxReqs.DeviceType;

            Format[] rtFormats = minReqs.RtFormats;
            bool useMax = true;
            foreach (Format format in maxReqs.RtFormats)
            {
                if (!Manager.CheckDeviceType(adapter, devType, minReqs.DisplayFormat,
                                             format, minReqs.Windowed))
                {
                    useMax = false;
                    break;
                }
            }
            if (useMax)
                rtFormats = maxReqs.RtFormats;

            MultiSampleType ms = minReqs.MultiSample;
            if (Manager.CheckDeviceMultiSampleType(adapter, devType, rtFormats[0],
                                                    minReqs.Windowed, maxReqs.MultiSample))
                ms = maxReqs.MultiSample;

            Caps caps = Manager.GetDeviceCaps(adapter, devType);
            bool pure = minReqs.Pure;
            if (maxReqs.Pure && caps.DeviceCaps.SupportsPureDevice)
                pure = true;
            bool tnl = minReqs.HardwareTnL;
            if (maxReqs.HardwareTnL && caps.DeviceCaps.SupportsHardwareTransformAndLight)
                tnl = true;

            return new GraphicsDevice3DRequirements(ms, devType, rtFormats, minReqs.NumRTs, minReqs.Windowed, minReqs.DepthFormats, pure, tnl, null, null, Format.Unknown);
        }
        public static GraphicsDevice3DOutputDescription CreateOutputDescription(int adapter,
                                                                                GraphicsDevice3DRequirements minReqs,
                                                                                GraphicsDevice3DRequirements maxReqs)
        {
            GraphicsDevice3DRequirements requirements = CheckReqs(adapter, minReqs, maxReqs);

            CreateFlags cFlags;

            if (requirements.Pure)
            {
                cFlags = CreateFlags.PureDevice;
            }
            else if (requirements.HardwareTnL)
            {
                cFlags = CreateFlags.HardwareVertexProcessing;
            }
            else
            {
                cFlags = CreateFlags.SoftwareVertexProcessing;
            }
            return(new GraphicsDevice3DOutputDescription(adapter, requirements.Windowed, requirements.DeviceType,
                                                         requirements.RtFormats[0], requirements.MultiSample,
                                                         requirements.DepthFormats[0], cFlags));
        }