steam-deck-tools/PowerControl/Helpers/AMD/ModeTiming.cs
Kamil Trzciński df9924b9cb X3
2023-02-08 23:41:14 +01:00

72 lines
2.4 KiB
C#

using System.Runtime.InteropServices;
namespace PowerControl.Helpers.AMD
{
internal class ModeTiming
{
internal static bool AddAndSetTiming(ADLDisplayModeX2 displayMode)
{
return AddTiming(displayMode) && SetTiming(displayMode);
}
internal static bool AddTiming(ADLDisplayModeX2 displayMode)
{
return Helpers.AMD.ADLContext.WithSafe((context) =>
{
var displays = context.DisplayInfos.ToArray();
if (displays.Count() < 0)
return false;
int res = ADL.ADL2_Display_ModeTimingOverrideX3_Get(
context.Context,
Helpers.AMD.ADL.ADL_DEFAULT_ADAPTER,
displays[0].DisplayID,
ref displayMode, out var modeInfOut);
if (res == 0)
{
res = ADL.ADL2_Display_ModeTimingOverrideX2_Set(
context.Context,
Helpers.AMD.ADL.ADL_DEFAULT_ADAPTER,
displays[0].DisplayID.DisplayLogicalIndex,
ref modeInfOut,
1
);
}
return res == 0;
});
}
internal static bool SetTiming(ADLDisplayModeX2 displayMode)
{
return Helpers.AMD.ADLContext.WithSafe((context) =>
{
int res = ADL.ADL2_Display_Modes_Get(context.Context,
Helpers.AMD.ADL.ADL_DEFAULT_ADAPTER,
0, out var modeCount, out var modesArray);
try
{
if (res != 0 || modeCount < 1)
return false;
var mode = Marshal.PtrToStructure<ADLMode>(modesArray);
mode.iXRes = displayMode.PelsWidth;
mode.iYRes = displayMode.PelsHeight;
mode.fRefreshRate = (float)displayMode.RefreshRate;
res = ADL.ADL2_Display_Modes_Set(context.Context,
Helpers.AMD.ADL.ADL_DEFAULT_ADAPTER,
0, 1, ref mode);
return res == 0;
}
finally
{
ADL.ADL_Main_Memory_Free(modesArray);
}
});
}
}
}