1From e17351b08ab2a27c549434858650fedd112baaa4 Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Tue, 5 Jul 2022 11:20:42 +0800
4Subject: [PATCH 08/10] ecore_drm2: Ignore other primary planes and support
5 ZPOS
6
7Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
8---
9 src/lib/ecore_drm2/ecore_drm2_device.c  |  5 +++++
10 src/lib/ecore_drm2/ecore_drm2_fb.c      |  3 +++
11 src/lib/ecore_drm2/ecore_drm2_outputs.c | 11 ++++++++++-
12 src/lib/ecore_drm2/ecore_drm2_private.h |  1 +
13 4 files changed, 19 insertions(+), 1 deletion(-)
14
15diff --git a/src/lib/ecore_drm2/ecore_drm2_device.c b/src/lib/ecore_drm2/ecore_drm2_device.c
16index 77498d8..e8f5347 100644
17--- a/src/lib/ecore_drm2/ecore_drm2_device.c
18+++ b/src/lib/ecore_drm2/ecore_drm2_device.c
19@@ -495,6 +495,11 @@ _drm2_atomic_state_plane_fill(Ecore_Drm2_Plane_State *pstate, int fd)
20                     }
21                }
22           }
23+        else if (!strcasecmp(prop->name, "zpos"))
24+          {
25+             pstate->zpos.id = prop->prop_id;
26+             pstate->zpos.value = oprops->prop_values[i];
27+          }
28
29         sym_drmModeFreeProperty(prop);
30      }
31diff --git a/src/lib/ecore_drm2/ecore_drm2_fb.c b/src/lib/ecore_drm2/ecore_drm2_fb.c
32index e2ef2e8..38c8287 100644
33--- a/src/lib/ecore_drm2/ecore_drm2_fb.c
34+++ b/src/lib/ecore_drm2/ecore_drm2_fb.c
35@@ -396,6 +396,9 @@ _fb_atomic_flip_test(Ecore_Drm2_Output *output)
36                                        pstate->fid.id, pstate->fid.value);
37         if (ret < 0) goto err;
38
39+        sym_drmModeAtomicAddProperty(req, pstate->obj_id,
40+                                     pstate->zpos.id, pstate->zpos.value);
41+
42         ret =
43           sym_drmModeAtomicAddProperty(req, pstate->obj_id,
44                                        pstate->sx.id, pstate->sx.value);
45diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c b/src/lib/ecore_drm2/ecore_drm2_outputs.c
46index d7ff6a2..2140079 100644
47--- a/src/lib/ecore_drm2/ecore_drm2_outputs.c
48+++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c
49@@ -653,11 +653,20 @@ _output_plane_states_get(Ecore_Drm2_Atomic_State *state, unsigned int crtc_id, i
50    Eina_List *states = NULL;
51    Ecore_Drm2_Plane_State *pstate;
52
53-   int i = 0;
54+   int i = 0, num_primaries = 0;
55
56    for (; i < state->planes; i++)
57      {
58         pstate = &state->plane_states[i];
59+        if (pstate->type.value == DRM_PLANE_TYPE_PRIMARY) {
60+           num_primaries ++;
61+
62+           if (num_primaries != index + 1)
63+              continue;
64+
65+           pstate->zpos.value = 0;
66+        }
67+
68         if (pstate->cid.value == crtc_id)
69           {
70              states =
71diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h
72index 56c9fe8..ccb233f 100644
73--- a/src/lib/ecore_drm2/ecore_drm2_private.h
74+++ b/src/lib/ecore_drm2/ecore_drm2_private.h
75@@ -103,6 +103,7 @@ typedef struct _Ecore_Drm2_Plane_State
76    Ecore_Drm2_Atomic_Property sx, sy, sw, sh;
77    Ecore_Drm2_Atomic_Property cx, cy, cw, ch;
78    Ecore_Drm2_Atomic_Property rotation;
79+   Ecore_Drm2_Atomic_Property zpos;
80
81    /* these are not part of an atomic state, but we store these here
82     * so that we do not have to refetch properties when iterating planes */
83--
842.20.1
85
86