diff --git a/src/add-ons/accelerants/via/GetAccelerantHook.c b/src/add-ons/accelerants/via/GetAccelerantHook.c index e19ad43861..dcd777eba1 100644 --- a/src/add-ons/accelerants/via/GetAccelerantHook.c +++ b/src/add-ons/accelerants/via/GetAccelerantHook.c @@ -90,15 +90,15 @@ void * get_accelerant_hook(uint32 feature, void *data) */ /* only export video overlay functions if card is capable of it */ -// CHKO(OVERLAY_COUNT); -// CHKO(OVERLAY_SUPPORTED_SPACES); -// CHKO(OVERLAY_SUPPORTED_FEATURES); -// CHKO(ALLOCATE_OVERLAY_BUFFER); -// CHKO(RELEASE_OVERLAY_BUFFER); -// CHKO(GET_OVERLAY_CONSTRAINTS); -// CHKO(ALLOCATE_OVERLAY); -// CHKO(RELEASE_OVERLAY); -// CHKO(CONFIGURE_OVERLAY); + CHKO(OVERLAY_COUNT); + CHKO(OVERLAY_SUPPORTED_SPACES); + CHKO(OVERLAY_SUPPORTED_FEATURES); + CHKO(ALLOCATE_OVERLAY_BUFFER); + CHKO(RELEASE_OVERLAY_BUFFER); + CHKO(GET_OVERLAY_CONSTRAINTS); + CHKO(ALLOCATE_OVERLAY); + CHKO(RELEASE_OVERLAY); + CHKO(CONFIGURE_OVERLAY); /* When requesting an acceleration hook, the calling application provides a @@ -170,8 +170,11 @@ status_t check_overlay_capability(uint32 feature) break; } - /* all supported cards have a bes */ - LOG(4, ("Overlay: Exporting hook %s.\n", msg)); + /* all supported cards have a bes, but it can't always be used... */ + if (eng_bes_chk_bandwidth()) + LOG(4, ("Overlay: Exporting hook %s.\n", msg)); + else + LOG(4, ("Overlay: Not exporting hook %s.\n", msg)); return B_OK; } diff --git a/src/add-ons/accelerants/via/engine/bes.c b/src/add-ons/accelerants/via/engine/bes.c index b0fe8cf442..5244ab93f8 100644 --- a/src/add-ons/accelerants/via/engine/bes.c +++ b/src/add-ons/accelerants/via/engine/bes.c @@ -19,6 +19,64 @@ struct move_overlay_info static void eng_bes_calc_move_overlay(move_overlay_info *moi); static void eng_bes_program_move_overlay(move_overlay_info moi); +/* returns true if the current displaymode leaves enough bandwidth for overlay + * support, false if not. */ +bool eng_bes_chk_bandwidth() +{ + float refresh, bandwidth; + uint8 depth; + + switch(si->dm.space) + { + case B_CMAP8: depth = 8; break; + case B_RGB15_LITTLE: depth = 16; break; + case B_RGB16_LITTLE: depth = 16; break; + case B_RGB32_LITTLE: depth = 32; break; + default: + LOG(8,("Overlay: Invalid colour depth 0x%08x\n", si->dm.space)); + return false; + } + + refresh = + (si->dm.timing.pixel_clock * 1000) / + (si->dm.timing.h_total * si->dm.timing.v_total); + bandwidth = + si->dm.timing.h_display * si->dm.timing.v_display * refresh * depth; + LOG(8,("Overlay: Current mode's refreshrate is %.2fHz, bandwidth is %.0f\n", + refresh, bandwidth)); + + switch (((CRTCR(MEMCLK)) & 0x70) >> 4) + { + case 0: /* SDR 66 */ + case 1: /* SDR 100 */ + case 2: /* SDR 133 */ + /* memory is too slow, sorry. */ + return false; + break; + case 3: /* DDR 100 */ + /* DDR100's basic limit... */ + if (bandwidth > 921600000.0) return false; + /* ... but we have constraints at higher than 800x600 */ + if (si->dm.timing.h_display > 800) + { + if (depth != 8) return false; + if (si->dm.timing.v_display > 768) return false; + if (refresh > 60.2) return false; + } + break; + case 4: /* DDR 133 */ + if (bandwidth > 4045440000.0) return false; + break; + default: /* not (yet?) used */ + return false; + break; + } + +//fixme: temporary (implement overlay first) +// return true; + return false; +} + /* move the overlay output window in virtualscreens */ /* Note: * si->dm.h_display_start and si->dm.v_display_start determine where the new diff --git a/src/add-ons/accelerants/via/engine/proto.h b/src/add-ons/accelerants/via/engine/proto.h index 117001a122..c4d990abae 100644 --- a/src/add-ons/accelerants/via/engine/proto.h +++ b/src/add-ons/accelerants/via/engine/proto.h @@ -115,6 +115,7 @@ status_t eng_acc_wait_idle(void); /* backend scaler functions */ status_t check_overlay_capability(uint32 feature); +bool eng_bes_chk_bandwidth(void); void eng_bes_move_overlay(void); status_t eng_bes_to_crtc(bool crtc); status_t eng_bes_init(void);