commit 4e7ee2e

Michael Forney  ·  2013-09-11 23:40:59 +0000 UTC
parent 926560d
surface: Rework surface state management and commit
2 files changed,  +57, -31
+47, -31
  1@@ -130,6 +130,8 @@ static void attach(struct wl_client * client, struct wl_resource * resource,
  2 {
  3     struct swc_surface * surface = wl_resource_get_user_data(resource);
  4 
  5+    surface->pending.commit |= SWC_SURFACE_COMMIT_ATTACH;
  6+
  7     state_set_buffer(&surface->pending.state, buffer_resource);
  8 
  9     surface->pending.x = x;
 10@@ -141,6 +143,8 @@ static void damage(struct wl_client * client, struct wl_resource * resource,
 11 {
 12     struct swc_surface * surface = wl_resource_get_user_data(resource);
 13 
 14+    surface->pending.commit |= SWC_SURFACE_COMMIT_DAMAGE;
 15+
 16     pixman_region32_union_rect(&surface->pending.state.damage,
 17                                &surface->pending.state.damage,
 18                                x, y, width, height);
 19@@ -152,6 +156,8 @@ static void frame(struct wl_client * client, struct wl_resource * resource,
 20     struct swc_surface * surface = wl_resource_get_user_data(resource);
 21     struct wl_resource * callback_resource;
 22 
 23+    surface->pending.commit |= SWC_SURFACE_COMMIT_FRAME;
 24+
 25     callback_resource = wl_resource_create(client, &wl_callback_interface,
 26                                            1, id);
 27     wl_resource_set_implementation(callback_resource, NULL, NULL,
 28@@ -166,7 +172,7 @@ static void set_opaque_region(struct wl_client * client,
 29 {
 30     struct swc_surface * surface = wl_resource_get_user_data(resource);
 31 
 32-    //printf("surface_set_opaque_region\n");
 33+    surface->pending.commit |= SWC_SURFACE_COMMIT_OPAQUE;
 34 
 35     if (region_resource)
 36     {
 37@@ -184,7 +190,7 @@ static void set_input_region(struct wl_client * client,
 38 {
 39     struct swc_surface * surface = wl_resource_get_user_data(resource);
 40 
 41-    printf("surface.set_input_region\n");
 42+    surface->pending.commit |= SWC_SURFACE_COMMIT_INPUT;
 43 
 44     if (region_resource)
 45     {
 46@@ -199,12 +205,9 @@ static void set_input_region(struct wl_client * client,
 47 static void commit(struct wl_client * client, struct wl_resource * resource)
 48 {
 49     struct swc_surface * surface = wl_resource_get_user_data(resource);
 50-    struct swc_event event;
 51-
 52-    event.data = surface;
 53 
 54     /* Attach */
 55-    if (surface->state.buffer != surface->pending.state.buffer)
 56+    if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
 57     {
 58         struct wl_shm_buffer * shm_buffer;
 59         struct swc_drm_buffer * drm_buffer;
 60@@ -231,39 +234,51 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
 61     }
 62 
 63     /* Damage */
 64-    pixman_region32_union(&surface->state.damage, &surface->state.damage,
 65-                          &surface->pending.state.damage);
 66-    pixman_region32_intersect_rect(&surface->state.damage,
 67-                                   &surface->state.damage, 0, 0,
 68-                                   surface->geometry.width,
 69-                                   surface->geometry.height);
 70+    if (surface->pending.commit & SWC_SURFACE_COMMIT_DAMAGE)
 71+    {
 72+        pixman_region32_intersect_rect(&surface->pending.state.damage,
 73+                                       &surface->pending.state.damage, 0, 0,
 74+                                       surface->geometry.width,
 75+                                       surface->geometry.height);
 76+        pixman_region32_union(&surface->state.damage, &surface->state.damage,
 77+                              &surface->pending.state.damage);
 78+        pixman_region32_clear(&surface->pending.state.damage);
 79+    }
 80 
 81     /* Opaque */
 82-    pixman_region32_copy(&surface->state.opaque,
 83-                         &surface->pending.state.opaque);
 84-    pixman_region32_intersect_rect(&surface->state.opaque,
 85-                                   &surface->state.opaque, 0, 0,
 86-                                   surface->geometry.width,
 87-                                   surface->geometry.height);
 88+    if (surface->pending.commit & SWC_SURFACE_COMMIT_OPAQUE)
 89+    {
 90+        pixman_region32_intersect_rect(&surface->state.opaque,
 91+                                       &surface->pending.state.opaque, 0, 0,
 92+                                       surface->geometry.width,
 93+                                       surface->geometry.height);
 94+    }
 95 
 96     /* Input */
 97-    pixman_region32_copy(&surface->state.input, &surface->pending.state.input);
 98-    pixman_region32_intersect_rect(&surface->state.input,
 99-                                   &surface->state.input, 0, 0,
100-                                   surface->geometry.width,
101-                                   surface->geometry.height);
102+    if (surface->pending.commit & SWC_SURFACE_COMMIT_INPUT)
103+    {
104+        pixman_region32_intersect_rect(&surface->state.input,
105+                                       &surface->pending.state.input, 0, 0,
106+                                       surface->geometry.width,
107+                                       surface->geometry.height);
108+    }
109 
110     /* Frame */
111-    wl_list_insert_list(&surface->state.frame_callbacks,
112-                        &surface->pending.state.frame_callbacks);
113+    if (surface->pending.commit & SWC_SURFACE_COMMIT_FRAME)
114+    {
115+        wl_list_insert_list(&surface->state.frame_callbacks,
116+                            &surface->pending.state.frame_callbacks);
117+        wl_list_init(&surface->pending.state.frame_callbacks);
118+    }
119 
120-    /* Reset pending state */
121-    pixman_region32_clear(&surface->pending.state.damage);
122-    pixman_region32_clear(&surface->pending.state.opaque);
123-    surface->pending.state.buffer = surface->state.buffer;
124-    wl_list_init(&surface->pending.state.frame_callbacks);
125+    if (surface->class)
126+    {
127+        if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
128+            surface->class->interface->attach(surface, surface->state.buffer);
129+        surface->class->interface->update(surface);
130+    }
131 
132-    surface->class->interface->update(surface);
133+    surface->pending.commit = 0;
134 }
135 
136 void set_buffer_transform(struct wl_client * client,
137@@ -330,6 +345,7 @@ struct swc_surface * swc_surface_new(struct wl_client * client, uint32_t id)
138     surface->geometry.y = 0;
139     surface->geometry.width = 0;
140     surface->geometry.height = 0;
141+    surface->pending.commit = 0;
142     surface->shell_data = NULL;
143     surface->shell_destructor = NULL;
144     surface->class = NULL;
+10, -0
 1@@ -30,6 +30,15 @@
 2 
 3 struct swc_surface;
 4 
 5+enum swc_surface_commit_info
 6+{
 7+    SWC_SURFACE_COMMIT_ATTACH = (1 << 0),
 8+    SWC_SURFACE_COMMIT_DAMAGE = (1 << 1),
 9+    SWC_SURFACE_COMMIT_OPAQUE = (1 << 2),
10+    SWC_SURFACE_COMMIT_INPUT = (1 << 3),
11+    SWC_SURFACE_COMMIT_FRAME = (1 << 4)
12+};
13+
14 struct swc_surface_state
15 {
16     struct wl_resource * buffer;
17@@ -94,6 +103,7 @@ struct swc_surface
18     struct
19     {
20         struct swc_surface_state state;
21+        uint32_t commit;
22         int32_t x, y;
23     } pending;
24