@ -410,6 +410,7 @@ int DrmDisplayCompositor::Init(DrmResources *drm, int display) {
pthread_cond_init ( & composite_queue_cond_ , NULL ) ;
pthread_cond_init ( & composite_queue_cond_ , NULL ) ;
forceOverscan_ = property_get_bool ( " vendor.hwc.force_overscan " , false ) ;
vop_bw_fd_ = open ( VOP_BW_PATH , O_WRONLY ) ;
vop_bw_fd_ = open ( VOP_BW_PATH , O_WRONLY ) ;
if ( vop_bw_fd_ < 0 )
if ( vop_bw_fd_ < 0 )
@ -1069,6 +1070,48 @@ static const char *RotatingToString(uint64_t rotating) {
}
}
}
}
int DrmDisplayCompositor : : CheckOverscan ( drmModeAtomicReqPtr pset , DrmCrtc * crtc , int display ,
bool reset , const char * UniqueName )
{
int ret = 0 ;
int left_margin = 100 , right_margin = 100 , top_margin = 100 , bottom_margin = 100 ;
if ( ! reset ) {
char overscan_value [ PROPERTY_VALUE_MAX ] = { 0 } ;
char overscan_pro [ PROPERTY_VALUE_MAX ] = { 0 } ;
snprintf ( overscan_pro , PROPERTY_VALUE_MAX , " persist.vendor.overscan.%s " , UniqueName ) ;
ret = property_get ( overscan_pro , overscan_value , " " ) ;
if ( ! ret ) {
return 0 ;
}
sscanf ( overscan_value , " overscan %d,%d,%d,%d " , & left_margin , & top_margin ,
& right_margin , & bottom_margin ) ;
ALOGD_IF ( log_level ( DBG_VERBOSE ) , " display=%d, %s " , display , overscan_value ) ;
if ( left_margin < OVERSCAN_MIN_VALUE ) left_margin = OVERSCAN_MIN_VALUE ;
if ( top_margin < OVERSCAN_MIN_VALUE ) top_margin = OVERSCAN_MIN_VALUE ;
if ( right_margin < OVERSCAN_MIN_VALUE ) right_margin = OVERSCAN_MIN_VALUE ;
if ( bottom_margin < OVERSCAN_MIN_VALUE ) bottom_margin = OVERSCAN_MIN_VALUE ;
if ( left_margin > OVERSCAN_MAX_VALUE ) left_margin = OVERSCAN_MAX_VALUE ;
if ( top_margin > OVERSCAN_MAX_VALUE ) top_margin = OVERSCAN_MAX_VALUE ;
if ( right_margin > OVERSCAN_MAX_VALUE ) right_margin = OVERSCAN_MAX_VALUE ;
if ( bottom_margin > OVERSCAN_MAX_VALUE ) bottom_margin = OVERSCAN_MAX_VALUE ;
}
uint32_t crtc_id = crtc - > id ( ) ;
ret = drmModeAtomicAddProperty ( pset , crtc_id , crtc - > left_margin_property ( ) . id ( ) , left_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc_id , crtc - > right_margin_property ( ) . id ( ) , right_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc_id , crtc - > top_margin_property ( ) . id ( ) , top_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc_id , crtc - > bottom_margin_property ( ) . id ( ) , bottom_margin ) < 0 ;
if ( ret ) {
ALOGE ( " Failed to add overscan to pset " ) ;
}
return ret ;
}
int DrmDisplayCompositor : : CommitFrame ( DrmDisplayComposition * display_comp ,
int DrmDisplayCompositor : : CommitFrame ( DrmDisplayComposition * display_comp ,
bool test_only ) {
bool test_only ) {
ATRACE_CALL ( ) ;
ATRACE_CALL ( ) ;
@ -1094,67 +1137,22 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
return - ENOMEM ;
return - ENOMEM ;
}
}
if ( crtc - > can_overscan ( ) ) {
if ( forceOverscan_ & & crtc - > can_overscan ( ) ) {
char overscan [ PROPERTY_VALUE_MAX ] ;
int left_margin = 100 , right_margin = 100 , top_margin = 100 , bottom_margin = 100 ;
DrmConnector * conn = drm_ - > GetConnectorFromType ( display_ ) ;
DrmConnector * conn = drm_ - > GetConnectorFromType ( display_ ) ;
if ( conn = = NULL )
if ( ! conn ) {
{
ALOGE ( " %s: line=%d display %d connector is NULL " , __FUNCTION__ , __LINE__ , display_ ) ;
ALOGE ( " %s: line=%d display %d connector is NULL " , __FUNCTION__ , __LINE__ , display_ ) ;
drmModeAtomicFree ( pset ) ;
return - ENODEV ;
return - ENODEV ;
}
}
DrmMode mode = conn - > current_mode ( ) ;
if ( display_comp - > mode_3d ( ) ! = NON_3D | | ( mode . interlaced ( ) > 0 ) )
{
left_margin = 100 ;
top_margin = 100 ;
right_margin = 100 ;
bottom_margin = 100 ;
}
else
{
if ( display_ = = HWC_DISPLAY_PRIMARY ) {
if ( hwc_have_baseparameter ( ) ) {
property_get ( " persist. " PROPERTY_TYPE " .overscan.main " , overscan , " use_baseparameter " ) ;
if ( ! strcmp ( overscan , " use_baseparameter " ) )
hwc_get_baseparameter_config ( overscan , display_ , BP_OVERSCAN , 0 ) ;
} else {
property_get ( " persist. " PROPERTY_TYPE " .overscan.main " , overscan , " overscan 100,100,100,100 " ) ;
}
} else {
if ( hwc_have_baseparameter ( ) ) {
property_get ( " persist. " PROPERTY_TYPE " .overscan.aux " , overscan , " use_baseparameter " ) ;
if ( ! strcmp ( overscan , " use_baseparameter " ) )
hwc_get_baseparameter_config ( overscan , display_ , BP_OVERSCAN , 0 ) ;
} else {
property_get ( " persist. " PROPERTY_TYPE " .overscan.aux " , overscan , " overscan 100,100,100,100 " ) ;
}
}
sscanf ( overscan , " overscan %d,%d,%d,%d " , & left_margin , & top_margin ,
& right_margin , & bottom_margin ) ;
ALOGD_IF ( log_level ( DBG_VERBOSE ) , " vop post scale overscan(%d,%d,%d,%d) " ,
left_margin , top_margin , right_margin , bottom_margin ) ;
}
if ( left_margin < OVERSCAN_MIN_VALUE ) left_margin = OVERSCAN_MIN_VALUE ;
if ( ! conn - > built_in ( ) ) {
if ( top_margin < OVERSCAN_MIN_VALUE ) top_margin = OVERSCAN_MIN_VALUE ;
DrmMode mode = conn - > current_mode ( ) ;
if ( right_margin < OVERSCAN_MIN_VALUE ) right_margin = OVERSCAN_MIN_VALUE ;
bool reset = display_comp - > mode_3d ( ) ! = NON_3D | | ( mode . interlaced ( ) > 0 ) ;
if ( bottom_margin < OVERSCAN_MIN_VALUE ) bottom_margin = OVERSCAN_MIN_VALUE ;
int ret = CheckOverscan ( pset , crtc , display_ , reset , conn - > unique_name ( ) ) ;
if ( ret ) {
if ( left_margin > OVERSCAN_MAX_VALUE ) left_margin = OVERSCAN_MAX_VALUE ;
drmModeAtomicFree ( pset ) ;
if ( top_margin > OVERSCAN_MAX_VALUE ) top_margin = OVERSCAN_MAX_VALUE ;
return ret ;
if ( right_margin > OVERSCAN_MAX_VALUE ) right_margin = OVERSCAN_MAX_VALUE ;
}
if ( bottom_margin > OVERSCAN_MAX_VALUE ) bottom_margin = OVERSCAN_MAX_VALUE ;
ret = drmModeAtomicAddProperty ( pset , crtc - > id ( ) , crtc - > left_margin_property ( ) . id ( ) , left_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc - > id ( ) , crtc - > right_margin_property ( ) . id ( ) , right_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc - > id ( ) , crtc - > top_margin_property ( ) . id ( ) , top_margin ) < 0 | |
drmModeAtomicAddProperty ( pset , crtc - > id ( ) , crtc - > bottom_margin_property ( ) . id ( ) , bottom_margin ) < 0 ;
if ( ret ) {
ALOGE ( " Failed to add overscan to pset " ) ;
drmModeAtomicFree ( pset ) ;
return ret ;
}
}
}
}