aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-graphics/directfb/directfb/0002-drmkms-mute-plane-when-opacity-is-set-to-zero.patch
blob: 226d5d5699734135e3c7d7ec55fea25986ad77d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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