diff options
Diffstat (limited to 'common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch')
-rw-r--r-- | common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch b/common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch new file mode 100644 index 0000000..226d5d5 --- /dev/null +++ b/common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch @@ -0,0 +1,150 @@ +From 68e46530a1821ab2a2209899bf971e1ca39acac9 Mon Sep 17 00:00:00 2001 +From: Takanari Hayama <taki@igel.co.jp> +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 + |