C# DirectX 11初始化“;作品“;并且仅在渲染时失败

C# DirectX 11初始化“;作品“;并且仅在渲染时失败,c#,compatibility,directx-11,C#,Compatibility,Directx 11,有人知道为什么使用DirectX11创建设备是可行的,即使硬件不支持它吗?我有以下简化的代码(这使用SlimDx,但我想语言在这里是第二重要的: var form = frm; form.Resize += form_Resize; var desc = new SwapChainDescription() { BufferCount = 1, ModeDescription = new ModeDescription(form.ClientSize.Width, form.Cl

有人知道为什么使用DirectX11创建设备是可行的,即使硬件不支持它吗?我有以下简化的代码(这使用SlimDx,但我想语言在这里是第二重要的:

var form = frm;
form.Resize += form_Resize;
var desc = new SwapChainDescription()
{
    BufferCount = 1,
    ModeDescription = new ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
        IsWindowed = true,
        OutputHandle = form.Handle,
        SampleDescription = new SampleDescription(1, 0),
        SwapEffect = SwapEffect.Discard,
        Usage = Usage.RenderTargetOutput
        };

    Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, desc, out device, out swapChain);
    device.Factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAll);
    Resize(form.ClientSize);

    sprite = new SpriteRendererSlimDx(device, m_lock);
    var textBlock = new TextBlockRendererSlimDx(sprite, "Arial", FontWeight.Bold, SlimDX.DirectWrite.FontStyle.Normal, FontStretch.Normal, 16);

    MessagePump.Run(form, () =>
    {
        device.ImmediateContext.ClearRenderTargetView(renderView, Color.DarkBlue);
        textBlock.DrawString("Hello World", Vector2.Zero, Color.Red);
        sprite.Flush();
        swapChain.Present(0, PresentFlags.None);
    });
该代码打开一个窗口并绘制一些文本。它在支持功能级别11.0的图形卡上运行良好,但如果我在老化的ATI Radeon HD 4550(仅支持功能级别10.1)上运行相同的代码,设备驱动程序将锁定,windows将重新启动显示驱动程序

问题不在于(在未显示的示例中)文本渲染,而在于渲染三角形。调试表明锁定发生在swapChain.Present()调用上

这表明我可能在使用着色器级别5(我正在尝试使用)时遇到问题,但通常我的问题是:如果不支持某些操作,为什么我不会收到一条普通错误消息?驱动程序不应该尝试编译着色器级别5,如果卡无法编译,应该吗

更新
如果我只使用着色器级别4,错误似乎也会发生。

如果Windows重置显示驱动程序,这可能是一个驱动程序错误,与您的代码无关,特别是如果它在其他硬件上工作正常。@MooseBoys:我并不真的担心它不工作(因为gfx卡确实有点旧),我最困惑的是为什么没有得到定义的错误消息。如果驱动程序被重置,错误条件应该暴露在的返回值中,而您当前忽略了该值。返回的
结果。code
应该是其中之一。好吧,我稍后会收到一个关于已移除设备的错误(在出现后的下一次调用中),但我更希望在驱动程序进入需要重置的条件之前得到一个错误。设备删除错误,特别是驱动程序内部错误(如图所示)通常无法预测,因此在驱动程序需要重置之前,无法知道发生了什么不好的事情。从系统的角度来看,一切正常,直到突然不正常。系统会在知道后立即向应用程序报告,应用程序会调用能够返回错误代码的API。通常这是
Present
因为出于性能原因,GPU从CPU异步运行,
Present
是需要刷新的少数几次之一。