@@ -1992,6 +1992,10 @@ bool win32_window_init(WNDCLASSEX *wndclass,
19921992 if (class_name )
19931993 wndclass -> style |= CS_CLASSDC ;
19941994
1995+ #ifdef HAVE_D3DKMT
1996+ d3dkmt_init ();
1997+ #endif
1998+
19951999 return RegisterClassEx (wndclass );
19962000}
19972001
@@ -2099,3 +2103,65 @@ HACCEL win32_resources_get_accelerator(void)
20992103 return s_accel_table ;
21002104}
21012105#endif /* !__WINRT__ */
2106+
2107+ #ifdef HAVE_D3DKMT
2108+ void d3dkmt_init (void )
2109+ {
2110+ if (!pD3DKMTOpenAdapterFromHdc )
2111+ {
2112+ unsigned d3dkmt_adapter_hAdapter = 0 ;
2113+ unsigned d3dkmt_adapter_VidPnSourceId = 0 ;
2114+ unsigned adapter_index = 0 ;
2115+ DISPLAY_DEVICE add ;
2116+
2117+ add .cb = sizeof (add );
2118+
2119+ pD3DKMTOpenAdapterFromHdc = (D3DKMTOPENADAPTERFROMHDC )
2120+ GetProcAddress (GetModuleHandle ("gdi32.dll" ), "D3DKMTOpenAdapterFromHdc" );
2121+ pD3DKMTGetScanLine = (D3DKMTGETSCANLINE )
2122+ GetProcAddress (GetModuleHandle ("gdi32.dll" ), "D3DKMTGetScanLine" );
2123+
2124+ while (EnumDisplayDevices (NULL , adapter_index , & add , 0 ))
2125+ {
2126+ HDC hdc = CreateDC (NULL , add .DeviceName , NULL , NULL );
2127+ if (hdc != NULL )
2128+ {
2129+ D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0 };
2130+ OpenAdapterData .hDc = hdc ;
2131+ if (pD3DKMTOpenAdapterFromHdc (& OpenAdapterData ) == STATUS_SUCCESS )
2132+ {
2133+ d3dkmt_adapter_hAdapter = OpenAdapterData .hAdapter ;
2134+ d3dkmt_adapter_VidPnSourceId = OpenAdapterData .VidPnSourceId ;
2135+ }
2136+ DeleteDC (hdc );
2137+
2138+ if (d3dkmt_adapter_hAdapter )
2139+ break ;
2140+ }
2141+ adapter_index ++ ;
2142+ }
2143+
2144+ memset (& d3dkmt_adapter , 0 , sizeof (d3dkmt_adapter_t ));
2145+
2146+ if (pD3DKMTGetScanLine )
2147+ {
2148+ D3DKMT_GETSCANLINE sl = {0 };
2149+ sl .hAdapter = d3dkmt_adapter_hAdapter ;
2150+ sl .VidPnSourceId = d3dkmt_adapter_VidPnSourceId ;
2151+ d3dkmt_adapter .sl = sl ;
2152+ }
2153+ }
2154+
2155+ video_driver_scanline_init ();
2156+ }
2157+
2158+ INLINE unsigned d3dkmt_scanline_get (void )
2159+ {
2160+ if (pD3DKMTGetScanLine )
2161+ {
2162+ if (pD3DKMTGetScanLine (& d3dkmt_adapter .sl ) == STATUS_SUCCESS )
2163+ return d3dkmt_adapter .sl .ScanLine ;
2164+ }
2165+ return 0 ;
2166+ }
2167+ #endif /* HAVE_D3DKMT */
0 commit comments