В настоящее время я пытаюсь создать цепочку подкачки для CoreWindow, используя последнюю версию SharpDX в качестве оболочки DirectX и UWP в качестве базовой структуры проекта.

Документация по этому поводу настолько скудна, что это невероятно. Тем не менее я смог найти фрагмент, который выглядел многообещающим. Первоначально я всегда получал сообщение об ошибке E_INVALIDCALL . Теперь "только" E_ACCESSDENIED .

Пока что я сделал это, чтобы настроить цепочку:

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.Result.CheckError () SharpDX.DXGI.Factory2.CreateSwapChainForCoreWindow (ComObject deviceRef, ComObject windowRef, SwapChainDescription1 & descRef, выход restrictToOutputRef, SwapChain1 swapChainOut) SharpDX.DXGI.SwapChain1..ctor (Factory2 завод, ComObject устройство, ComObject coreWindow, SwapChainDescription1 & описание , Вывод restrictToOutput) RobInspect.Visualizer.Rendering.RenderingPanel.InitializeSizeDependentResources () RobInspect.Visualizer.Rendering.RenderingPanel.InitializeDevice ()

«HRESULT: [0x80070005], модуль: [General], ApiCode: [E_ACCESSDENIED / общая ошибка отказа в доступе], сообщение: доступ запрещен».

Кто-нибудь может мне объяснить, почему? «Доступ запрещен» - довольно широкое утверждение, и я не слишком разбираюсь во внутренностях DirectX.

Дополнительная информация: Код выполняется в основном (UI) потоке. Поэтому я полагаю, что могу исключить, что ссылка на CoreWindow недоступна. Поскольку это первоначальная инициализация, я также исключаю возможность того, что объекты DirectX не будут освобождены должным образом перед созданием цепочки подкачки.

ИЗМЕНИТЬ : Это код для создания устройства. В то время как флаги установлены на DeviceCreationFlags.BgraSuuport и DeviceCreationFlags.Debug . Установлены уровни от FeatureLevel.Level_11_1 до FeatureLevel.Level_9_1 .

using (var device = new Device(DriverType.Hardware, flags, levels))
{
    _device = device.QueryInterface<Device1>();
    _context = _device.ImmediateContext1;
}
1
SharpShade 26 Фев 2018 в 17:42

1 ответ

Лучший ответ

Решение этой проблемы состоит в том, что термины WinRT Core и WinRT XAML вводят в заблуждение. Поскольку UWP основан на CoreWindow и оба поддерживают и используют их, непонятно, где что использовать.

DirectX предоставляет два метода для WinRT и один для Desktop . Один - это Factory2.CreateSwapChainForCoreWindow(...), а другой - Factory2.CreateSwapChainForComposition(...). Разница в том, что один принимает CoreWindow как параметр, а другой нет. И вот в какую ловушку я попал.

Core обозначает схему проектирования, в которой используются только IFrameworkView и IFrameworkViewSource (см. здесь для примера с SharpDX), тогда как XAML обозначает традиционную схему, в которой у вас есть класс Windows.UI.Xaml.Application.

При использовании Core-модели вы должны вызвать метод ...ForCoreWindow(...), чтобы создать цепочку подкачки. При использовании подхода на основе XAML вам понадобится цепочка подкачки композиции. Я сам для себя уже пробовал это, но потерпел неудачу, потому что я забыл включить (совет: сделайте это, если еще не сделано) встроенную отладку, поэтому уровень отладки DirectX фактически показал мне важную информацию, которая могла бы сэкономить мне часы, если не дни проб и ошибок.

Проблема здесь в том, что и композиция, и цепочки обмена CoreWindow требуют специальных настроек в SwapChainDescription1. Я оставлю вам документация MSDN. Более того, если включена собственная отладка и уровень отладки, DirectX сообщит вам, какой именно параметр является недопустимым.

2
SharpShade 27 Фев 2018 в 18:21