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