@@ -169,6 +169,69 @@ typedef REASON_CONTEXT POWER_REQUEST_CONTEXT, *PPOWER_REQUEST_CONTEXT, *LPPOWER_
169169#define MIN_WIDTH 320
170170#define MIN_HEIGHT 240
171171
172+ #ifdef HAVE_D3DKMT
173+ static d3dkmt_adapter_t d3dkmt_adapter ;
174+
175+ static void d3dkmt_init (void )
176+ {
177+ if (!pD3DKMTOpenAdapterFromHdc )
178+ {
179+ unsigned d3dkmt_adapter_hAdapter = 0 ;
180+ unsigned d3dkmt_adapter_VidPnSourceId = 0 ;
181+ unsigned adapter_index = 0 ;
182+ DISPLAY_DEVICE add ;
183+
184+ add .cb = sizeof (add );
185+
186+ pD3DKMTOpenAdapterFromHdc = (D3DKMTOPENADAPTERFROMHDC )
187+ GetProcAddress (GetModuleHandle ("gdi32.dll" ), "D3DKMTOpenAdapterFromHdc" );
188+ pD3DKMTGetScanLine = (D3DKMTGETSCANLINE )
189+ GetProcAddress (GetModuleHandle ("gdi32.dll" ), "D3DKMTGetScanLine" );
190+
191+ while (EnumDisplayDevices (NULL , adapter_index , & add , 0 ))
192+ {
193+ HDC hdc = CreateDC (NULL , add .DeviceName , NULL , NULL );
194+ if (hdc != NULL )
195+ {
196+ D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0 };
197+ OpenAdapterData .hDc = hdc ;
198+ if (pD3DKMTOpenAdapterFromHdc (& OpenAdapterData ) == STATUS_SUCCESS )
199+ {
200+ d3dkmt_adapter_hAdapter = OpenAdapterData .hAdapter ;
201+ d3dkmt_adapter_VidPnSourceId = OpenAdapterData .VidPnSourceId ;
202+ }
203+ DeleteDC (hdc );
204+
205+ if (d3dkmt_adapter_hAdapter )
206+ break ;
207+ }
208+ adapter_index ++ ;
209+ }
210+
211+ memset (& d3dkmt_adapter , 0 , sizeof (d3dkmt_adapter_t ));
212+
213+ if (pD3DKMTGetScanLine )
214+ {
215+ D3DKMT_GETSCANLINE sl = {0 };
216+ sl .hAdapter = d3dkmt_adapter_hAdapter ;
217+ sl .VidPnSourceId = d3dkmt_adapter_VidPnSourceId ;
218+ d3dkmt_adapter .sl = sl ;
219+ }
220+ }
221+
222+ video_driver_scanline_init ();
223+ }
224+
225+ unsigned d3dkmt_scanline_get (void )
226+ {
227+ if (pD3DKMTGetScanLine )
228+ {
229+ if (pD3DKMTGetScanLine (& d3dkmt_adapter .sl ) == STATUS_SUCCESS )
230+ return d3dkmt_adapter .sl .ScanLine ;
231+ }
232+ return 0 ;
233+ }
234+ #endif /* HAVE_D3DKMT */
172235
173236typedef struct win32_common_state
174237{
@@ -1992,6 +2055,10 @@ bool win32_window_init(WNDCLASSEX *wndclass,
19922055 if (class_name )
19932056 wndclass -> style |= CS_CLASSDC ;
19942057
2058+ #ifdef HAVE_D3DKMT
2059+ d3dkmt_init ();
2060+ #endif
2061+
19952062 return RegisterClassEx (wndclass );
19962063}
19972064
@@ -2099,3 +2166,4 @@ HACCEL win32_resources_get_accelerator(void)
20992166 return s_accel_table ;
21002167}
21012168#endif /* !__WINRT__ */
2169+
0 commit comments