В настоящее время я пытаюсь создать цепочку подкачки для 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;
}
using (var device = new SharpDX.Direct3D11.Device(Hardware, flags, levels))
, а затем запрашиваюDevice1
(не уверен - обновлю это примерно через час, когда буду на работе). Уровни установлены от 11_1 до 9_3. Для флагов установлено значение BgraSupport и Debug. - person SharpShade   schedule 27.02.2018CoreWindow
. Я использую пакет DevExpress, в котором я обнаружил, что они, кажется, используют SharpDX или DirectX для внутреннего рендеринга определенных вещей. По крайней мере, я нашел похожие классы. Может быть, это блокировка? Но обычно все-таки можно создать и назначить несколько цепочек подкачки. - person SharpShade   schedule 27.02.2018