Author:
Rudolf Cornelissen 7/2004-08/2009
*/
#define MODULE_BIT 0x04000000
#include "acc_std.h"
status_t GET_ACCELERANT_DEVICE_INFO(accelerant_device_info * adi)
{
LOG(4,("GET_ACCELERANT_DEVICE_INFO: returning info\n"));
adi->version = 1;
strcpy(adi->name, si->adi.name);
strcpy(adi->chipset, si->adi.chipset);
strcpy(adi->serial_no, "unknown");
adi->memory = si->ps.memory_size;
adi->dac_speed = si->ps.max_dac1_clock;
return B_OK;
}
#ifdef __HAIKU__
status_t GET_EDID_INFO(void* info, size_t size, uint32* _version)
{
if (!si->ps.crtc1_screen.have_full_edid && !si->ps.crtc2_screen.have_full_edid) {
LOG(4,("GET_EDID_INFO: EDID info not available\n"));
return B_ERROR;
}
if (size < sizeof(struct edid1_info)) {
LOG(4,("GET_EDID_INFO: not enough memory available\n"));
return B_BUFFER_OVERFLOW;
}
LOG(4,("GET_EDID_INFO: returning info\n"));
if (si->ps.crtc1_screen.have_full_edid && si->ps.crtc2_screen.have_full_edid) {
* NOTE:
* allow 0.10 difference so 4:3 and 5:4 aspect screens are regarded as being the same. */
if (si->ps.crtc1_screen.aspect < (si->ps.crtc2_screen.aspect - 0.10)) {
memcpy(info, &si->ps.crtc1_screen.full_edid, sizeof(struct edid1_info));
} else {
if (si->ps.crtc1_screen.aspect > (si->ps.crtc2_screen.aspect + 0.10)) {
memcpy(info, &si->ps.crtc2_screen.full_edid, sizeof(struct edid1_info));
} else {
* the lowest native resolution */
if (si->ps.crtc1_screen.timing.h_display < si->ps.crtc2_screen.timing.h_display)
memcpy(info, &si->ps.crtc1_screen.full_edid, sizeof(struct edid1_info));
if (si->ps.crtc1_screen.timing.h_display > si->ps.crtc2_screen.timing.h_display)
memcpy(info, &si->ps.crtc2_screen.full_edid, sizeof(struct edid1_info));
* one used as main screen */
if (si->ps.crtc1_screen.timing.h_display == si->ps.crtc2_screen.timing.h_display) {
if (si->ps.crtc2_prim)
memcpy(info, &si->ps.crtc2_screen.full_edid, sizeof(struct edid1_info));
else
memcpy(info, &si->ps.crtc1_screen.full_edid, sizeof(struct edid1_info));
}
}
}
} else {
if (si->ps.crtc1_screen.have_full_edid)
memcpy(info, &si->ps.crtc1_screen.full_edid, sizeof(struct edid1_info));
else
memcpy(info, &si->ps.crtc2_screen.full_edid, sizeof(struct edid1_info));
}
*_version = EDID_VERSION_1;
return B_OK;
}
status_t GET_PREFERRED_DISPLAY_MODE(display_mode* preferredMode)
{
if (si->ps.crtc1_screen.have_full_edid || si->ps.crtc2_screen.have_full_edid) {
LOG(4,("GET_PREFERRED_DISPLAY_MODE: full EDID known, aborting (fetch EDID instead).\n"));
return B_ERROR;
}
if (!si->ps.crtc1_screen.have_native_edid && !si->ps.crtc2_screen.have_native_edid) {
LOG(4,("GET_PREFERRED_DISPLAY_MODE: native mode(s) not known\n"));
return B_ERROR;
}
* for another reason as well. */
LOG(4,("GET_PREFERRED_DISPLAY_MODE: returning mode\n"));
if (si->ps.crtc1_screen.have_native_edid && si->ps.crtc2_screen.have_native_edid) {
* NOTE:
* allow 0.10 difference so 4:3 and 5:4 aspect screens are regarded as being the same. */
if (si->ps.crtc1_screen.aspect < (si->ps.crtc2_screen.aspect - 0.10)) {
get_crtc1_screen_native_mode(preferredMode);
} else {
if (si->ps.crtc1_screen.aspect > (si->ps.crtc2_screen.aspect + 0.10)) {
get_crtc2_screen_native_mode(preferredMode);
} else {
* the lowest native resolution */
if (si->ps.crtc1_screen.timing.h_display < si->ps.crtc2_screen.timing.h_display)
get_crtc1_screen_native_mode(preferredMode);
if (si->ps.crtc1_screen.timing.h_display > si->ps.crtc2_screen.timing.h_display)
get_crtc2_screen_native_mode(preferredMode);
* one used as main screen */
if (si->ps.crtc1_screen.timing.h_display == si->ps.crtc2_screen.timing.h_display) {
if (si->ps.crtc2_prim)
get_crtc2_screen_native_mode(preferredMode);
else
get_crtc1_screen_native_mode(preferredMode);
}
}
}
} else {
if (si->ps.crtc1_screen.have_native_edid)
get_crtc1_screen_native_mode(preferredMode);
else
get_crtc2_screen_native_mode(preferredMode);
}
return B_OK;
}
#endif