forked from antonioginer/switchres
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcustom_video_adl.h
201 lines (169 loc) · 6.69 KB
/
custom_video_adl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/**************************************************************
custom_video_adl.h - ATI/AMD ADL library header
---------------------------------------------------------
Switchres Modeline generation engine for emulation
License GPL-2.0+
Copyright 2010-2021 Chris Kennedy, Antonio Giner,
Alexandre Wodarczyk, Gil Delescluse
**************************************************************/
#include <windows.h>
#include "custom_video.h"
#include "resync_windows.h"
// Constants and structures ported from AMD ADL SDK files
#define ADL_MAX_PATH 256
#define ADL_OK 0
#define ADL_ERR -1
//ADL_DETAILED_TIMING.sTimingFlags
#define ADL_DL_TIMINGFLAG_DOUBLE_SCAN 0x0001
#define ADL_DL_TIMINGFLAG_INTERLACED 0x0002
#define ADL_DL_TIMINGFLAG_H_SYNC_POLARITY 0x0004
#define ADL_DL_TIMINGFLAG_V_SYNC_POLARITY 0x0008
//ADL_DISPLAY_MODE_INFO.iTimingStandard
#define ADL_DL_MODETIMING_STANDARD_CVT 0x00000001 // CVT Standard
#define ADL_DL_MODETIMING_STANDARD_GTF 0x00000002 // GFT Standard
#define ADL_DL_MODETIMING_STANDARD_DMT 0x00000004 // DMT Standard
#define ADL_DL_MODETIMING_STANDARD_CUSTOM 0x00000008 // User-defined standard
#define ADL_DL_MODETIMING_STANDARD_DRIVER_DEFAULT 0x00000010 // Remove Mode from overriden list
#define ADL_DL_MODETIMING_STANDARD_CVT_RB 0x00000020 // CVT-RB Standard
typedef struct AdapterInfo
{
int iSize;
int iAdapterIndex;
char strUDID[ADL_MAX_PATH];
int iBusNumber;
int iDeviceNumber;
int iFunctionNumber;
int iVendorID;
char strAdapterName[ADL_MAX_PATH];
char strDisplayName[ADL_MAX_PATH];
int iPresent;
int iExist;
char strDriverPath[ADL_MAX_PATH];
char strDriverPathExt[ADL_MAX_PATH];
char strPNPString[ADL_MAX_PATH];
int iOSDisplayIndex;
} AdapterInfo, *LPAdapterInfo;
typedef struct ADLDisplayID
{
int iDisplayLogicalIndex;
int iDisplayPhysicalIndex;
int iDisplayLogicalAdapterIndex;
int iDisplayPhysicalAdapterIndex;
} ADLDisplayID, *LPADLDisplayID;
typedef struct ADLDisplayInfo
{
ADLDisplayID displayID;
int iDisplayControllerIndex;
char strDisplayName[ADL_MAX_PATH];
char strDisplayManufacturerName[ADL_MAX_PATH];
int iDisplayType;
int iDisplayOutputType;
int iDisplayConnector;
int iDisplayInfoMask;
int iDisplayInfoValue;
} ADLDisplayInfo, *LPADLDisplayInfo;
typedef struct ADLDisplayMode
{
int iPelsHeight;
int iPelsWidth;
int iBitsPerPel;
int iDisplayFrequency;
} ADLDisplayMode;
typedef struct ADLDetailedTiming
{
int iSize;
short sTimingFlags;
short sHTotal;
short sHDisplay;
short sHSyncStart;
short sHSyncWidth;
short sVTotal;
short sVDisplay;
short sVSyncStart;
short sVSyncWidth;
unsigned short sPixelClock;
short sHOverscanRight;
short sHOverscanLeft;
short sVOverscanBottom;
short sVOverscanTop;
short sOverscan8B;
short sOverscanGR;
} ADLDetailedTiming;
typedef struct ADLDisplayModeInfo
{
int iTimingStandard;
int iPossibleStandard;
int iRefreshRate;
int iPelsWidth;
int iPelsHeight;
ADLDetailedTiming sDetailedTiming;
} ADLDisplayModeInfo;
typedef struct AdapterList
{
int m_index;
int m_bus;
char m_name[ADL_MAX_PATH];
char m_display_name[ADL_MAX_PATH];
int m_num_of_displays;
ADLDisplayInfo *m_display_list;
} AdapterList, *LPAdapterList;
typedef void* ADL_CONTEXT_HANDLE;
typedef void* (__stdcall *ADL_MAIN_MALLOC_CALLBACK)(int);
typedef int (*ADL2_MAIN_CONTROL_CREATE)(ADL_MAIN_MALLOC_CALLBACK, int, ADL_CONTEXT_HANDLE *);
typedef int (*ADL2_MAIN_CONTROL_DESTROY)(ADL_CONTEXT_HANDLE);
typedef int (*ADL2_ADAPTER_NUMBEROFADAPTERS_GET) (ADL_CONTEXT_HANDLE, int*);
typedef int (*ADL2_ADAPTER_ADAPTERINFO_GET) (ADL_CONTEXT_HANDLE, LPAdapterInfo, int);
typedef int (*ADL2_DISPLAY_DISPLAYINFO_GET) (ADL_CONTEXT_HANDLE, int, int *, ADLDisplayInfo **, int);
typedef int (*ADL2_DISPLAY_MODETIMINGOVERRIDE_GET) (ADL_CONTEXT_HANDLE, int iAdapterIndex, int iDisplayIndex, ADLDisplayMode *lpModeIn, ADLDisplayModeInfo *lpModeInfoOut);
typedef int (*ADL2_DISPLAY_MODETIMINGOVERRIDE_SET) (ADL_CONTEXT_HANDLE, int iAdapterIndex, int iDisplayIndex, ADLDisplayModeInfo *lpMode, int iForceUpdate);
typedef int (*ADL2_DISPLAY_MODETIMINGOVERRIDELIST_GET) (ADL_CONTEXT_HANDLE, int iAdapterIndex, int iDisplayIndex, int iMaxNumOfOverrides, ADLDisplayModeInfo *lpModeInfoList, int *lpNumOfOverrides);
typedef int (*ADL2_FLUSH_DRIVER_DATA) (ADL_CONTEXT_HANDLE, int iAdapterIndex);
class adl_timing : public custom_video
{
public:
adl_timing(char *display_name, custom_video_settings *vs);
~adl_timing();
const char *api_name() { return "AMD ADL"; }
bool init();
void close();
int caps() { return allow_hardware_refresh()? CUSTOM_VIDEO_CAPS_UPDATE | CUSTOM_VIDEO_CAPS_ADD | CUSTOM_VIDEO_CAPS_DESKTOP_EDITABLE : is_patched? CUSTOM_VIDEO_CAPS_UPDATE : 0; }
bool add_mode(modeline *mode);
bool delete_mode(modeline *mode);
bool update_mode(modeline *mode);
bool get_timing(modeline *m);
bool set_timing(modeline *m);
bool process_modelist(std::vector<modeline *>);
private:
int open();
bool get_driver_version(char *device_key);
bool enum_displays();
bool get_device_mapping_from_display_name();
bool display_mode_info_to_modeline(ADLDisplayModeInfo *dmi, modeline *m);
bool get_timing_list();
bool get_timing_from_cache(modeline *m);
bool set_timing_override(modeline *m, int update_mode);
char m_display_name[32];
char m_device_key[128];
int m_adapter_index = 0;
int m_display_index = 0;
ADL2_ADAPTER_NUMBEROFADAPTERS_GET ADL2_Adapter_NumberOfAdapters_Get;
ADL2_ADAPTER_ADAPTERINFO_GET ADL2_Adapter_AdapterInfo_Get;
ADL2_DISPLAY_DISPLAYINFO_GET ADL2_Display_DisplayInfo_Get;
ADL2_DISPLAY_MODETIMINGOVERRIDE_GET ADL2_Display_ModeTimingOverride_Get;
ADL2_DISPLAY_MODETIMINGOVERRIDE_SET ADL2_Display_ModeTimingOverride_Set;
ADL2_DISPLAY_MODETIMINGOVERRIDELIST_GET ADL2_Display_ModeTimingOverrideList_Get;
ADL2_FLUSH_DRIVER_DATA ADL2_Flush_Driver_Data;
HINSTANCE hDLL;
LPAdapterInfo lpAdapterInfo = NULL;
LPAdapterList lpAdapter = NULL;;
int iNumberAdapters = 0;
int cat_version = 0;
int sub_version = 0;
bool is_patched = false;
ADL_CONTEXT_HANDLE m_adl = 0;
ADLDisplayModeInfo adl_mode[MAX_MODELINES];
int m_num_of_adl_modes = 0;
resync_handler m_resync;
int invert_pol(bool on_read) { return ((cat_version <= 12) || (cat_version >= 15 && on_read)); }
int interlace_factor(bool interlace, bool on_read) { return interlace && ((cat_version <= 12) || (cat_version >= 15 && on_read))? 2 : 1; }
};