From 68e46530a1821ab2a2209899bf971e1ca39acac9 Mon Sep 17 00:00:00 2001 From: Takanari Hayama Date: Thu, 19 Sep 2013 18:55:43 +0900 Subject: [PATCH 2/2] drmkms: mute plane when opacity is set to zero. If the opacity value of zero is passed, then we mute the plane by disabling the plane. We re-enable when the plane if non-zero opacity value is passed. --- systems/drmkms/drmkms_layer.c | 65 +++++++++++++++++++++++++--------------- systems/drmkms/drmkms_system.h | 2 ++ 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/systems/drmkms/drmkms_layer.c b/systems/drmkms/drmkms_layer.c index a80d2e5..f2e8011 100644 --- a/systems/drmkms/drmkms_layer.c +++ b/systems/drmkms/drmkms_layer.c @@ -388,8 +388,7 @@ drmkmsPlaneTestRegion( CoreLayer *layer, CoreLayerRegionConfigFlags failed = CLRCF_NONE; - if (((config->options & DLOP_OPACITY ) && !data->alpha_propid ) || - ((config->options & DLOP_SRC_COLORKEY) && !data->colorkey_propid)) + if ((config->options & DLOP_SRC_COLORKEY) && !data->colorkey_propid) failed |= CLRCF_OPTIONS; if (ret_failed) @@ -414,11 +413,15 @@ drmkmsPlaneSetRegion( CoreLayer *layer, CoreSurfaceBufferLock *right_lock ) { int ret; + bool unmute = false; DRMKMSData *drmkms = driver_data; DRMKMSLayerData *data = layer_data; D_DEBUG_AT( DRMKMS_Layer, "%s()\n", __FUNCTION__ ); - if (updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_BUFFERMODE | CLRCF_DEST | CLRCF_SOURCE)) { + if ((updated & CLRCF_OPACITY) && data->muted && config->opacity) + unmute = true; + + if ((updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_BUFFERMODE | CLRCF_DEST | CLRCF_SOURCE)) || unmute) { ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, (u32)(long)left_lock->handle, /* plane_flags */ 0, config->dest.x, config->dest.y, config->dest.w, config->dest.h, config->source.x << 16, config->source.y <<16, config->source.w << 16, config->source.h << 16); @@ -431,7 +434,7 @@ drmkmsPlaneSetRegion( CoreLayer *layer, } data->config = config; - + data->muted = false; } if ((updated & (CLRCF_SRCKEY | CLRCF_OPTIONS)) && data->colorkey_propid) { @@ -448,15 +451,26 @@ drmkmsPlaneSetRegion( CoreLayer *layer, } } - if (updated & CLRCF_OPACITY && data->alpha_propid) { - ret = drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->alpha_propid, config->opacity ); + if (updated & CLRCF_OPACITY) { + if (config->opacity == 0) { + ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, 0, + /* plane_flags */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0); - if (ret) { - D_ERROR( "DirectFB/DRMKMS: drmModeObjectSetProperty() failed setting alpha\n"); - return DFB_FAILURE; - } - } + if (ret) { + D_ERROR( "DirectFB/DRMKMS: drmModeSetPlane() failed disabling plane\n"); + return DFB_FAILURE; + } + + data->muted = true; + } else if (data->alpha_propid) { + ret = drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->alpha_propid, config->opacity ); + if (ret) { + D_ERROR( "DirectFB/DRMKMS: drmModeObjectSetProperty() failed setting alpha\n"); + return DFB_FAILURE; + } + } + } return DFB_OK; } @@ -473,13 +487,14 @@ drmkmsPlaneRemoveRegion( CoreLayer *layer, D_DEBUG_AT( DRMKMS_Layer, "%s()\n", __FUNCTION__ ); + if (!data->muted) { + ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, 0, + /* plane_flags */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0); - ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, 0, - /* plane_flags */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0); - - if (ret) { - D_PERROR( "DRMKMS/Layer/Remove: Failed setting plane configuration!\n" ); - return ret; + if (ret) { + D_PERROR( "DRMKMS/Layer/Remove: Failed setting plane configuration!\n" ); + return ret; + } } return DFB_OK; @@ -521,16 +536,18 @@ drmkmsPlaneFlipRegion( CoreLayer *layer, /* Task */ data->pending_task = left_lock->task; - ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, (u32)(long)left_lock->handle, - /* plane_flags */ 0, data->config->dest.x, data->config->dest.y, data->config->dest.w, data->config->dest.h, - data->config->source.x << 16, data->config->source.y <<16, data->config->source.w << 16, data->config->source.h << 16); + if (!data->muted) { + ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, (u32)(long)left_lock->handle, + /* plane_flags */ 0, data->config->dest.x, data->config->dest.y, data->config->dest.w, data->config->dest.h, + data->config->source.x << 16, data->config->source.y <<16, data->config->source.w << 16, data->config->source.h << 16); - if (ret) { - D_PERROR( "DRMKMS/Layer/FlipRegion: Failed setting plane configuration!\n" ); + if (ret) { + D_PERROR( "DRMKMS/Layer/FlipRegion: Failed setting plane configuration!\n" ); - direct_mutex_unlock( &data->lock ); + direct_mutex_unlock( &data->lock ); - return ret; + return ret; + } } dfb_surface_flip( surface, false ); diff --git a/systems/drmkms/drmkms_system.h b/systems/drmkms/drmkms_system.h index 008bfea..142ec68 100644 --- a/systems/drmkms/drmkms_system.h +++ b/systems/drmkms/drmkms_system.h @@ -83,6 +83,8 @@ typedef struct { DirectMutex lock; DirectWaitQueue wq_event; + + bool muted; } DRMKMSLayerData; typedef struct { -- 1.7.9.5