Add refresh rate polling to Win32 >= Windows 7.

This commit is contained in:
Brandon Wright 2018-04-15 19:33:38 -05:00
parent 20d87347f7
commit e049605359
10 changed files with 49 additions and 8 deletions

View File

@ -281,6 +281,45 @@ void win32_monitor_get_info(void)
win32_change_display_settings(current_mon.szDevice, NULL, 0);
}
float win32_get_refresh_rate(void *data)
{
float refresh_rate = 0.0f;
#if _WIN32_WINNT >= 0x0601 || _WIN32_WINDOWS >= 0x0601 /* Win 7 */
unsigned int NumPathArrayElements;
unsigned int NumModeInfoArrayElements;
DISPLAYCONFIG_PATH_INFO *PathInfoArray;
DISPLAYCONFIG_MODE_INFO *ModeInfoArray;
DISPLAYCONFIG_TOPOLOGY_ID TopologyID;
int result;
GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT,
&NumPathArrayElements,
&NumModeInfoArrayElements);
PathInfoArray = (DISPLAYCONFIG_PATH_INFO *)
malloc(sizeof (DISPLAYCONFIG_PATH_INFO) * NumPathArrayElements);
ModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)
malloc(sizeof (DISPLAYCONFIG_MODE_INFO) * NumModeInfoArrayElements);
result = QueryDisplayConfig(QDC_DATABASE_CURRENT,
&NumPathArrayElements,
PathInfoArray,
&NumModeInfoArrayElements,
ModeInfoArray,
&TopologyID);
if (result == ERROR_SUCCESS && NumPathArrayElements >= 1)
{
refresh_rate = (float) PathInfoArray[0].targetInfo.refreshRate.Numerator /
PathInfoArray[0].targetInfo.refreshRate.Denominator;
}
free(ModeInfoArray);
free(PathInfoArray);
#endif
return refresh_rate;
}
void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id)
{
unsigned i;

View File

@ -128,6 +128,8 @@ bool win32_taskbar_is_created(void);
void win32_set_taskbar_created(bool created);
float win32_get_refresh_rate(void *data);
#if defined(HAVE_D3D8) || defined(HAVE_D3D9) || defined (HAVE_D3D10) || defined (HAVE_D3D11) || defined (HAVE_D3D12)
LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam);

View File

@ -557,7 +557,7 @@ static const video_poke_interface_t d3d10_poke_interface = {
NULL, /* load_texture */
NULL, /* unload_texture */
NULL, /* set_video_mode */
NULL, /* get_refresh_rate */
win32_get_refresh_rate,
d3d10_set_filtering,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */

View File

@ -1589,7 +1589,7 @@ static const video_poke_interface_t d3d11_poke_interface = {
d3d11_gfx_load_texture,
d3d11_gfx_unload_texture,
NULL, /* set_video_mode */
NULL, /* get_refresh_rate */
win32_get_refresh_rate,
d3d11_set_filtering,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */

View File

@ -1752,7 +1752,7 @@ static const video_poke_interface_t d3d12_poke_interface = {
d3d12_gfx_load_texture,
d3d12_gfx_unload_texture,
NULL, /* set_video_mode */
NULL, /* get_refresh_rate */
win32_get_refresh_rate,
d3d12_set_filtering,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */

View File

@ -1866,7 +1866,7 @@ static const video_poke_interface_t d3d_poke_interface = {
d3d8_load_texture,
d3d8_unload_texture,
d3d8_set_video_mode,
NULL,
win32_get_refresh_rate,
NULL,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */

View File

@ -1890,7 +1890,7 @@ static const video_poke_interface_t d3d9_poke_interface = {
d3d9_load_texture,
d3d9_unload_texture,
d3d9_set_video_mode,
NULL,
win32_get_refresh_rate,
NULL,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */

View File

@ -538,7 +538,7 @@ static const video_poke_interface_t gdi_poke_interface = {
NULL,
NULL,
gdi_set_video_mode,
NULL, /* get_refresh_rate */
win32_get_refresh_rate,
NULL,
gdi_get_video_output_size,
gdi_get_video_output_prev,

View File

@ -760,7 +760,7 @@ const gfx_ctx_driver_t gfx_ctx_wgl = {
gfx_ctx_wgl_swap_interval,
gfx_ctx_wgl_set_video_mode,
gfx_ctx_wgl_get_video_size,
NULL, /* get_refresh_rate */
win32_get_refresh_rate,
gfx_ctx_wgl_get_video_output_size,
gfx_ctx_wgl_get_video_output_prev,
gfx_ctx_wgl_get_video_output_next,

View File

@ -1159,7 +1159,7 @@ static void
setting_get_string_representation_st_float_video_refresh_rate_polled(
void *data, char *s, size_t len)
{
snprintf(s, len, "%.5f Hz", video_driver_get_refresh_rate());
snprintf(s, len, "%.3f Hz", video_driver_get_refresh_rate());
}
static void