October3d55/Matain/ViveOpenXR/Source/ViveOpenXRDisplayRefreshRate/Private/ViveOpenXRDisplayRefreshRat...

117 lines
4.7 KiB
C++

// Copyright HTC Corporation. All Rights Reserved.
#include "ViveOpenXRDisplayRefreshRateModule.h"
#include "OpenXRCore.h"
#include "ViveOpenXRDelegates.h"
#include "Misc/ConfigCacheIni.h"
#include "Modules/ModuleManager.h"
DEFINE_LOG_CATEGORY(LogViveOpenXRDisplayRefreshRate);
void FViveOpenXRDisplayRefreshRate::StartupModule()
{
check(GConfig && GConfig->IsReadyForUse());
FString modeName;
if (GConfig->GetString(TEXT("/Script/ViveOpenXRRuntimeSettings.ViveOpenXRRuntimeSettings"), TEXT("bEnableDisplayRefreshRate"), modeName, GEngineIni))
{
if (modeName.Equals("False"))
{
m_bEnableDisplayRefreshRate = false;
}
else if (modeName.Equals("True"))
{
m_bEnableDisplayRefreshRate = true;
}
}
if (m_bEnableDisplayRefreshRate)
{
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("Enable DisplayRefreshRate."));
}
else
{
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("Disable DisplayRefreshRate."));
return;
}
RegisterOpenXRExtensionModularFeature();
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("StartupModule() Finished."));
}
bool FViveOpenXRDisplayRefreshRate::GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions)
{
if (m_bEnableDisplayRefreshRate)
{
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("GetRequiredExtensions() Add DisplayRefreshRate Extension Name %s."), ANSI_TO_TCHAR(XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME));
OutExtensions.Add(XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME);
}
return true;
}
void FViveOpenXRDisplayRefreshRate::OnEvent(XrSession InSession, const XrEventDataBaseHeader* InHeader)
{
if (InHeader->type == XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) {
const XrEventDataDisplayRefreshRateChangedFB& EventDataDisplayRefreshRateChanged = *reinterpret_cast<const XrEventDataDisplayRefreshRateChangedFB*>(InHeader);
FViveOpenXRDelegates::DisplayRefreshRateChanged.Broadcast(EventDataDisplayRefreshRateChanged.fromDisplayRefreshRate, EventDataDisplayRefreshRateChanged.toDisplayRefreshRate);
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("OnEvent XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB from: %f to %f"), EventDataDisplayRefreshRateChanged.fromDisplayRefreshRate , EventDataDisplayRefreshRateChanged.toDisplayRefreshRate);
}
}
const void* FViveOpenXRDisplayRefreshRate::OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext)
{
if (!m_bEnableDisplayRefreshRate) return InNext;
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("Entry DisplayRefreshRate OnCreateSession."));
XR_ENSURE(xrGetInstanceProcAddr(InInstance, "xrEnumerateDisplayRefreshRatesFB", (PFN_xrVoidFunction*)&xrEnumerateDisplayRefreshRatesFB));
XR_ENSURE(xrGetInstanceProcAddr(InInstance, "xrGetDisplayRefreshRateFB", (PFN_xrVoidFunction*)&xrGetDisplayRefreshRateFB));
XR_ENSURE(xrGetInstanceProcAddr(InInstance, "xrRequestDisplayRefreshRateFB", (PFN_xrVoidFunction*)&xrRequestDisplayRefreshRateFB));
return InNext;
}
void FViveOpenXRDisplayRefreshRate::PostCreateSession(XrSession InSession)
{
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("Entry DisplayRefreshRate PostCreateSession InSession %llu."), InSession);
m_Session = InSession;
}
bool FViveOpenXRDisplayRefreshRate::EnumerateDisplayRefreshRates(TArray<float>& OutDisplayRefreshRates)
{
if (!m_bEnableDisplayRefreshRate || xrEnumerateDisplayRefreshRatesFB == nullptr) return false;
if (m_DisplayRefreshRates.Num() == 0)
{
uint32_t DisplayRefreshRateCount = 0;
XR_ENSURE(xrEnumerateDisplayRefreshRatesFB(m_Session, 0, &DisplayRefreshRateCount, nullptr));
if (DisplayRefreshRateCount > 0)
{
m_DisplayRefreshRates.Init(0.0f, DisplayRefreshRateCount);
XR_ENSURE(xrEnumerateDisplayRefreshRatesFB(m_Session, DisplayRefreshRateCount, &DisplayRefreshRateCount, m_DisplayRefreshRates.GetData()));
for (size_t x = 0; x < m_DisplayRefreshRates.Num(); x++) {
UE_LOG(LogViveOpenXRDisplayRefreshRate, Log, TEXT("DisplayRefreshRates index %d is %f"), x, m_DisplayRefreshRates[x]);
}
}
else
{
UE_LOG(LogViveOpenXRDisplayRefreshRate, Warning, TEXT("DisplayRefreshRateCount is zero"));
return false;
}
}
OutDisplayRefreshRates = m_DisplayRefreshRates;
return !OutDisplayRefreshRates.IsEmpty();
}
bool FViveOpenXRDisplayRefreshRate::GetDisplayRefreshRate(float& OutDisplayRefreshRate)
{
if (!m_bEnableDisplayRefreshRate || xrGetDisplayRefreshRateFB == nullptr) return false;
return XR_ENSURE(xrGetDisplayRefreshRateFB(m_Session, &OutDisplayRefreshRate));
}
bool FViveOpenXRDisplayRefreshRate::RequestDisplayRefreshRate(float InDisplayRefreshRate)
{
if (!m_bEnableDisplayRefreshRate || xrRequestDisplayRefreshRateFB == nullptr) return false;
return XR_ENSURE(xrRequestDisplayRefreshRateFB(m_Session, InDisplayRefreshRate));
}
IMPLEMENT_MODULE(FViveOpenXRDisplayRefreshRate, ViveOpenXRDisplayRefreshRate)