Monado OpenXR Runtime
Loading...
Searching...
No Matches
d3d_winrt_helpers.cpp File Reference

Helpers for Windows 10+ direct mode code. More...

#include "d3d_winrt_helpers.hpp"
#include <dxgiformat.h>
#include <winrt/base.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Foundation.Metadata.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Devices.Display.Core.h>
#include <winrt/Windows.Graphics.DirectX.h>
#include <windows.devices.display.core.interop.h>
#include <d3d11_1.h>
#include <d3d11_4.h>
#include <wil/com.h>
#include <wil/resource.h>
#include <wil/result_macros.h>
#include <array>
#include <tuple>
#include <algorithm>
#include <utility>
#include <winrt/impl/Windows.Devices.Display.Core.0.h>
#include <winrt/impl/Windows.Devices.Display.Core.2.h>
Include dependency graph for d3d_winrt_helpers.cpp:

Functions

static std::tuple< bool, uint16_t, DXGI_FORMAT > xrt::auxiliary::d3d::winrt::lookupFormat (DirectXPixelFormat format)
 
static std::pair< uint16_t, float > xrt::auxiliary::d3d::winrt::makeModeKey (const winrtWDDC::DisplayModeInfo &modeInfo)
 Make something sortable out of a display mode.
 
bool xrt::auxiliary::d3d::winrt::isModeAcceptable (const ::winrt::Windows::Devices::Display::Core::DisplayModeInfo &modeInfo)
 
bool xrt::auxiliary::d3d::winrt::modeComparison (const ::winrt::Windows::Devices::Display::Core::DisplayModeInfo &lhs, const ::winrt::Windows::Devices::Display::Core::DisplayModeInfo &rhs)
 A comparison function (like std::less) for comparing display modes, such as for sorting or finding the "best" one.
 
void xrt::auxiliary::d3d::winrt::sortModes (std::vector<::winrt::Windows::Devices::Display::Core::DisplayModeInfo > &acceptableModes)
 
static bool xrt::auxiliary::d3d::winrt::checkForBasicAPI ()
 
static bool xrt::auxiliary::d3d::winrt::checkForEnhancedApi ()
 
::winrt::Windows::Devices::Display::Core::DisplayScanout xrt::auxiliary::d3d::winrt::createScanout (SystemApiCapability const &capability, int maxAttempts, ::winrt::Windows::Devices::Display::Core::DisplayDevice const &device, ::winrt::Windows::Devices::Display::Core::DisplaySource const &source, ::winrt::Windows::Devices::Display::Core::DisplaySurface const &primary, uint32_t subResourceIndex, bool allowTearing)
 Create a "scanout" object for scanning out a surface to a direct mode display.
 

Detailed Description

Helpers for Windows 10+ direct mode code.

Has to implement comp_target instead of comp_target_swapchain because we don't get a VkSurfaceKHR, etc: we manually import images instead.

Author
Rylie Pavlik rylie.nosp@m..pav.nosp@m.lik@c.nosp@m.olla.nosp@m.bora..nosp@m.com

Function Documentation

◆ createScanout()

winrt::Windows::Devices::Display::Core::DisplayScanout xrt::auxiliary::d3d::winrt::createScanout ( SystemApiCapability const &  capability,
int  maxAttempts,
::winrt::Windows::Devices::Display::Core::DisplayDevice const &  device,
::winrt::Windows::Devices::Display::Core::DisplaySource const &  source,
::winrt::Windows::Devices::Display::Core::DisplaySurface const &  primary,
uint32_t  subResourceIndex,
bool  allowTearing 
)

Create a "scanout" object for scanning out a surface to a direct mode display.

The underlying function CreateSimpleScanout is prone to spurious IllegalArgument failures, so this wrapper tries twice.

See https://github.com/MicrosoftDocs/winrt-api/issues/1942

Parameters
capabilityA populated SystemApiCapability describing the features available and allowed for use.
maxAttemptsThe maximum number of times to try creating a scanout: consider at least 2, since this is prone to spurious failure
deviceDisplay device
sourceDisplay source
primaryPrimary display surface
subResourceIndexas in CreateSimpleScanout. Usually 0 unless you are using hardware stereo (like 3D TV)
allowTearingdetermines the sync interval value in Win10 and Win11, and the flags to create the scanout in Win11.
Returns
::winrt::Windows::Devices::Display::Core::DisplayScanout

References xrt::auxiliary::d3d::winrt::createScanout(), and xrt::auxiliary::d3d::winrt::SystemApiCapability::supportsScanoutOptionsAndTryExecuteTask.

Referenced by xrt::auxiliary::d3d::winrt::createScanout().

◆ makeModeKey()

static std::pair< uint16_t, float > xrt::auxiliary::d3d::winrt::makeModeKey ( const winrtWDDC::DisplayModeInfo &  modeInfo)
inlinestatic

◆ modeComparison()

bool xrt::auxiliary::d3d::winrt::modeComparison ( const ::winrt::Windows::Devices::Display::Core::DisplayModeInfo &  lhs,
const ::winrt::Windows::Devices::Display::Core::DisplayModeInfo &  rhs 
)

A comparison function (like std::less) for comparing display modes, such as for sorting or finding the "best" one.

This sorts with SRGB modes first, and refresh rate in decreasing order.

References xrt::auxiliary::d3d::winrt::makeModeKey(), and xrt::auxiliary::d3d::winrt::modeComparison().

Referenced by xrt::auxiliary::d3d::winrt::modeComparison().