diff --git a/src/add-ons/accelerants/via/GetModeInfo.c b/src/add-ons/accelerants/via/GetModeInfo.c new file mode 100644 index 0000000000..3f0c2d54c1 --- /dev/null +++ b/src/add-ons/accelerants/via/GetModeInfo.c @@ -0,0 +1,161 @@ +/* + Copyright 1999, Be Incorporated. All Rights Reserved. + This file may be used under the terms of the Be Sample Code License. + + Other authors: + Mark Watson + Rudolf Cornelissen 9/2002-5/2003 +*/ + +#define MODULE_BIT 0x02000000 + +#include "acc_std.h" + +/* + Return the current display mode. The only time you might return an + error is if a mode hasn't been set. Or if the system hands you a NULL pointer. +*/ +status_t GET_DISPLAY_MODE(display_mode *current_mode) +{ + /* check for NULL pointer */ + if (current_mode == NULL) return B_ERROR; + + *current_mode = si->dm; + return B_OK; +} + +/* Return the frame buffer configuration information. */ +status_t GET_FRAME_BUFFER_CONFIG(frame_buffer_config *afb) +{ + /* check for NULL pointer */ + if (afb == NULL) return B_ERROR; + + *afb = si->fbc; + return B_OK; +} + +/* Return the maximum and minium pixelclock limits for the specified mode. */ +/* NOTE: + * Due to BeOS constraints output for all heads will be limited to the head with + * the least capabilities. */ +status_t GET_PIXEL_CLOCK_LIMITS(display_mode *dm, uint32 *low, uint32 *high) +{ + uint32 max_pclk = 0; + uint32 min_pclk = 0; + + /* check for NULL pointers */ + if ((dm == NULL) || (low == NULL) || (high == NULL)) return B_ERROR; + + /* specify requested info */ + if (dm->flags & DUALHEAD_BITS) + { + /* dualhead mode */ + /* find min. value */ + switch (si->ps.card_type) + { + default: + *low = ((si->ps.min_video_vco * 1000) / 16); + break; + } + /* find max. value: + * using decondary DAC specs because they could be narrower (twinview) */ + switch (dm->space) + { + case B_CMAP8: + max_pclk = si->ps.max_dac2_clock_8; + break; + case B_RGB15_LITTLE: + case B_RGB16_LITTLE: + max_pclk = si->ps.max_dac2_clock_16; + break; + case B_RGB24_LITTLE: + max_pclk = si->ps.max_dac2_clock_24; + break; + case B_RGB32_LITTLE: + /* specially noted because of RAM speed constraints! */ + max_pclk = si->ps.max_dac2_clock_32dh; + break; + default: + /* use fail-safe value */ + max_pclk = si->ps.max_dac2_clock_32dh; + break; + } + /* return values in kHz */ + *high = max_pclk * 1000; + } + else + { + /* singlehead mode */ + /* find min. value */ + switch (si->ps.card_type) + { + default: + *low = ((si->ps.min_pixel_vco * 1000) / 16); + break; + } + /* find max. value: depends on which head is used as primary head */ + if (!si->ps.crtc2_prim) + { + switch (dm->space) + { + case B_CMAP8: + max_pclk = si->ps.max_dac1_clock_8; + break; + case B_RGB15_LITTLE: + case B_RGB16_LITTLE: + max_pclk = si->ps.max_dac1_clock_16; + break; + case B_RGB24_LITTLE: + max_pclk = si->ps.max_dac1_clock_24; + break; + case B_RGB32_LITTLE: + max_pclk = si->ps.max_dac1_clock_32; + break; + default: + /* use fail-safe value */ + max_pclk = si->ps.max_dac1_clock_32; + break; + } + } + else + { + switch (dm->space) + { + case B_CMAP8: + max_pclk = si->ps.max_dac2_clock_8; + break; + case B_RGB15_LITTLE: + case B_RGB16_LITTLE: + max_pclk = si->ps.max_dac2_clock_16; + break; + case B_RGB24_LITTLE: + max_pclk = si->ps.max_dac2_clock_24; + break; + case B_RGB32_LITTLE: + max_pclk = si->ps.max_dac2_clock_32; + break; + default: + /* use fail-safe value */ + max_pclk = si->ps.max_dac2_clock_32; + break; + } + } + /* return values in kHz */ + *high = max_pclk * 1000; + } + + /* clamp lower limit to 48Hz vertical refresh for now. + * Apparantly the BeOS screenprefs app does limit the upper refreshrate to 90Hz, + * while it does not limit the lower refreshrate. */ + min_pclk = ((uint32)dm->timing.h_total * (uint32)dm->timing.v_total * 48) / 1000; + if (min_pclk > *low) *low = min_pclk; + + return B_OK; +} + +/* Return the semaphore id that will be used to signal a vertical sync occured. */ +sem_id ACCELERANT_RETRACE_SEMAPHORE(void) +{ +// return si->vblank; +return B_ERROR; +}