summaryrefslogtreecommitdiffstats
path: root/common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch
diff options
context:
space:
mode:
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.patch150
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
+