代码之家  ›  专栏  ›  技术社区  ›  SharpShade

DirectX-为CoreWindow创建交换链时拒绝访问

  •  2
  • SharpShade  · 技术社区  · 8 年前

    我目前正在尝试使用最新的SharpDX作为DirectX包装器,UWP作为项目基础框架,为CoreWindow创建swapchain。

    这方面的文档太少了,令人难以置信。尽管如此,我还是能找到一个看起来很有希望的片段。一开始我总是 E\u INVALIDCALL 错误消息。现在是“唯一” E\u访问被拒绝 .

    到目前为止,我已经完成了以下步骤来建立链:

    var description = new SwapChainDescription1
    {
        BufferCount = 2,
        Flags = SwapChainFlags.None,
        SampleDescription = new SampleDescription(1, 0),
        SwapEffect = SwapEffect.FlipSequential,
        Usage = Usage.RenderTargetOutput,
        Width = 0,
        Height = 0,
        Scaling = Scaling.None,
        Format = Format.B8G8R8A8_UNorm,
        Stereo = false
    };
    
    CoreWindow window = CoreWindow.GetForCurrentThread();
    if (window == null)
    {
        Logging.Error("Could not retrieve core window for swap chain.");
        throw new Exception("Invalid core window.");
    }
    
    using (var device = _device.QueryInterface<SharpDX.DXGI.Device2>())
    {
        device.MaximumFrameLatency = 1;
        using (Adapter adapter = device.Adapter)
        {
            using (ComObject coreWindow = new ComObject(window))
            {
                using (Factory2 factory = adapter.GetParent<Factory2>())
                    _swapChain = new SwapChain1(factory, _device, coreWindow, ref description);
            }
        }
    }
    

    的构造函数 SwapChain1 引发SharpDX异常:

    SharpDX。后果CheckError() SharpDX。DXGI。工厂2。创建SwapChainForCoreWindow(ComObject deviceRef、ComObject windowRef、SwapChainDescription1&descRef、Output restrictToOutputRef、SwapChain1 swapChainOut) SharpDX。DXGI。SwapChain1。。ctor(Factory2工厂、ComObject设备、ComObject coreWindow、SwapChainDescription1&description、Output restrictToOutput) RobInspect公司。可视化工具。翻译渲染面板。InitializeSizeDependentResources() RobInspect公司。可视化工具。翻译渲染面板。InitializeDevice()

    “HRESULT:[0x80070005],模块:[常规],ApiCode:[E\u ACCESSDENIED/General access denied error],消息:访问被拒绝。 "

    谁能解释一下为什么?“拒绝访问”是一个相当宽泛的说法,我对DirectX的内部结构没有太多经验。

    进一步信息:代码正在主(UI)线程上执行。所以我想我可以排除CoreWindow引用不可访问的情况。由于这是第一次初始化,我还排除了在创建交换链之前DirectX对象不能正确释放的可能性。

    编辑 : 这是创建设备的代码。而标志设置为 DeviceCreationFlags。BgraSuuport公司 DeviceCreationFlags。调试 . 级别设置为 功能级别。级别\u 11\u 1 下至 功能级别。级别\u 9\u 1 .

    using (var device = new Device(DriverType.Hardware, flags, levels))
    {
        _device = device.QueryInterface<Device1>();
        _context = _device.ImmediateContext1;
    }
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   SharpShade    8 年前

    解决这个问题的办法是 WinRT核心 WinRT XAML 是相当误导的。因为UWP基于 CoreWindow 两者都支持并使用它们,但不清楚在哪里使用什么。

    DirectX公开了以下两种方法: 商在最新的 一个用于 桌面 . 一个是 Factory2.CreateSwapChainForCoreWindow(...) 还有一个 Factory2.CreateSwapChainForComposition(...) . 不同之处在于 CoreWindow 作为参数,一个不作为参数。这是我掉进的陷阱。

    果心 代表仅使用的设计方案 IFrameworkView IFrameworkViewSource (参见 here 以SharpDX为例),鉴于 XAML 代表传统方案 Windows.UI.Xaml.Application

    使用核心模型时,必须调用 ...ForCoreWindow(...) 方法创建交换链。在使用基于XAML的方法时,您需要一个合成交换链。我自己已经尝试过了,但失败了,因为我忘记启用本机调试(提示:如果尚未启用,请执行此操作),因此DirectX调试层实际上向我显示了基本信息,如果不是几天的尝试和错误,这些信息本可以为我节省数小时。

    这里的问题是,组合和CoreWindow交换链都需要在 SwapChainDescription1 . 我给你留下 MSDN documentation . 此外,如果启用了本机调试和调试层,DirectX将准确地告诉您什么设置无效。