diff --git a/src/add-ons/accelerants/radeon/GetAccelerantHook.c b/src/add-ons/accelerants/radeon/GetAccelerantHook.c index 1c58ce9ad8..7744f65e3c 100644 --- a/src/add-ons/accelerants/radeon/GetAccelerantHook.c +++ b/src/add-ons/accelerants/radeon/GetAccelerantHook.c @@ -61,6 +61,8 @@ initialization process. HOOK(SET_INDEXED_COLORS); //HOOK(GET_TIMING_CONSTRAINTS); #ifdef __HAIKU__ + case B_GET_PREFERRED_DISPLAY_MODE: + return (void*)radeon_get_preferred_display_mode; case B_GET_EDID_INFO: return (void*)radeon_get_edid_info; #endif diff --git a/src/add-ons/accelerants/radeon/GetModeInfo.c b/src/add-ons/accelerants/radeon/GetModeInfo.c index 7ffded799f..5177f3a08e 100644 --- a/src/add-ons/accelerants/radeon/GetModeInfo.c +++ b/src/add-ons/accelerants/radeon/GetModeInfo.c @@ -65,6 +65,37 @@ GET_PIXEL_CLOCK_LIMITS(display_mode *dm, uint32 *low, uint32 *high) #ifdef __HAIKU__ +status_t +radeon_get_preferred_display_mode(display_mode* mode) +{ + fp_info *fpInfo = &ai->si->flatpanels[0]; + disp_entity* routes = &ai->si->routing; + uint32 i; + + if (routes->port_info[0].edid_valid || routes->port_info[1].edid_valid) { + // prefer EDID data in this case + return B_ERROR; + } + + if ((ai->vc->connected_displays & (dd_dvi | dd_dvi_ext | dd_lvds)) == 0) + return B_NOT_SUPPORTED; + + // Mode has already been added by addFPMode(), just return it + + for (i = 0; i < ai->si->mode_count; ++i) { + if (ai->mode_list[i].timing.h_display == fpInfo->panel_xres + && ai->mode_list[i].timing.v_display == fpInfo->panel_yres + && ai->mode_list[i].virtual_width == fpInfo->panel_xres + && ai->mode_list[i].virtual_height == fpInfo->panel_yres) { + memcpy(mode, &ai->mode_list[i], sizeof(display_mode)); + return B_OK; + } + } + + return B_ERROR; +} + + status_t radeon_get_edid_info(void* info, size_t size, uint32* _version) { diff --git a/src/add-ons/accelerants/radeon/generic.h b/src/add-ons/accelerants/radeon/generic.h index 51ce54e0ff..1dc55fbaad 100644 --- a/src/add-ons/accelerants/radeon/generic.h +++ b/src/add-ons/accelerants/radeon/generic.h @@ -27,6 +27,7 @@ status_t GET_PIXEL_CLOCK_LIMITS(display_mode *dm, uint32 *low, uint32 *high); status_t MOVE_DISPLAY(uint16 h_display_start, uint16 v_display_start); status_t GET_TIMING_CONSTRAINTS(display_timing_constraints *dtc); void SET_INDEXED_COLORS(uint count, uint8 first, uint8 *color_data, uint32 flags); +status_t radeon_get_preferred_display_mode(display_mode *mode); status_t radeon_get_edid_info(void* info, size_t size, uint32* _version); uint32 DPMS_CAPABILITIES(void);