commit b7805fb
Michael Forney
·
2014-01-16 11:18:23 +0000 UTC
parent cbef704
surface: Use swc_buffer instead of wl_resource in state
4 files changed,
+19,
-80
+4,
-62
1@@ -11,7 +11,6 @@
2 #include "surface.h"
3 #include "util.h"
4 #include "view.h"
5-#include "wayland_buffer.h"
6
7 #include <stdlib.h>
8 #include <stdio.h>
9@@ -46,37 +45,12 @@ struct view
10
11 /* Rendering {{{ */
12
13-struct buffer_state
14-{
15- struct wld_buffer * buffer;
16- struct wl_listener destroy_listener;
17-};
18-
19 struct render_target
20 {
21 struct wld_buffer * buffer;
22 pixman_rectangle32_t geometry;
23 };
24
25-static void handle_buffer_destroy(struct wl_listener * listener, void * data)
26-{
27- struct buffer_state * state
28- = CONTAINER_OF(listener, typeof(*state), destroy_listener);
29-
30- wld_destroy_buffer(state->buffer);
31- free(state);
32-}
33-
34-static inline struct buffer_state * buffer_state(struct wl_resource * resource)
35-{
36- struct wl_listener * listener
37- = wl_resource_get_destroy_listener(resource, &handle_buffer_destroy);
38-
39- return listener ? CONTAINER_OF(listener, struct buffer_state,
40- destroy_listener)
41- : NULL;
42-}
43-
44 static void repaint_surface(struct render_target * target,
45 struct swc_surface * surface,
46 pixman_region32_t * damage)
47@@ -84,15 +58,11 @@ static void repaint_surface(struct render_target * target,
48 pixman_region32_t surface_damage;
49 pixman_region32_t border_damage;
50 pixman_region32_t surface_region;
51- struct buffer_state * state;
52 struct view * view = (void *) surface->view;
53
54 if (!surface->state.buffer)
55 return;
56
57- state = buffer_state(surface->state.buffer);
58- assert(state);
59-
60 pixman_region32_init_with_extents(&surface_damage, &view->extents);
61 pixman_region32_init(&border_damage);
62 pixman_region32_init_rect
63@@ -116,7 +86,7 @@ static void repaint_surface(struct render_target * target,
64
65 pixman_region32_translate(&surface_damage,
66 -surface->geometry.x, -surface->geometry.y);
67- wld_copy_region(swc.drm->renderer, state->buffer,
68+ wld_copy_region(swc.drm->renderer, surface->state.buffer->wld,
69 surface->geometry.x - target->geometry.x,
70 surface->geometry.y - target->geometry.y,
71 &surface_damage);
72@@ -166,36 +136,8 @@ static void renderer_repaint(struct render_target * target,
73 }
74
75 static void renderer_attach(struct swc_surface * surface,
76- struct wl_resource * resource)
77+ struct swc_buffer * buffer)
78 {
79- struct buffer_state * state;
80- struct swc_buffer * drm_buffer;
81-
82- if (!resource)
83- return;
84-
85- /* Check if we have already seen this buffer. */
86- if ((state = buffer_state(resource)))
87- return;
88-
89- if (!(state = malloc(sizeof *state)))
90- return;
91-
92- if ((drm_buffer = swc_wayland_buffer_get(resource)))
93- {
94- if (!(state = malloc(sizeof *state)))
95- return;
96-
97- state->buffer = drm_buffer->wld;
98- }
99- else
100- {
101- ERROR("Unsupported buffer type\n");
102- return;
103- }
104-
105- state->destroy_listener.notify = &handle_buffer_destroy;
106- wl_resource_add_destroy_listener(resource, &state->destroy_listener);
107 }
108
109 static void renderer_flush_surface(struct swc_surface * surface)
110@@ -334,9 +276,9 @@ static void remove_(struct swc_surface * surface)
111 free(view);
112 }
113
114-static void attach(struct swc_surface * surface, struct wl_resource * resource)
115+static void attach(struct swc_surface * surface, struct swc_buffer * buffer)
116 {
117- renderer_attach(surface, resource);
118+ renderer_attach(surface, buffer);
119 }
120
121 static void update(struct swc_surface * surface)
+12,
-15
1@@ -122,7 +122,7 @@ static void state_finish(struct swc_surface_state * state)
2 * @return: Whether or not the buffer was changed.
3 */
4 static bool state_set_buffer(struct swc_surface_state * state,
5- struct wl_resource * buffer)
6+ struct swc_buffer * buffer)
7 {
8 if (buffer == state->buffer)
9 return false;
10@@ -137,8 +137,7 @@ static bool state_set_buffer(struct swc_surface_state * state,
11 {
12 /* Need to watch the new buffer for destruction so we can remove it
13 * from state. */
14- wl_resource_add_destroy_listener(buffer,
15- &state->buffer_destroy_listener);
16+ wl_signal_add(&buffer->destroy_signal, &state->buffer_destroy_listener);
17 }
18
19 state->buffer = buffer;
20@@ -155,10 +154,12 @@ static void attach(struct wl_client * client, struct wl_resource * resource,
21 struct wl_resource * buffer_resource, int32_t x, int32_t y)
22 {
23 struct swc_surface * surface = wl_resource_get_user_data(resource);
24+ struct swc_buffer * buffer
25+ = buffer_resource ? swc_wayland_buffer_get(buffer_resource) : NULL;
26
27 surface->pending.commit |= SWC_SURFACE_COMMIT_ATTACH;
28
29- state_set_buffer(&surface->pending.state, buffer_resource);
30+ state_set_buffer(&surface->pending.state, buffer);
31
32 surface->pending.x = x;
33 surface->pending.y = y;
34@@ -235,23 +236,19 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
35 /* Attach */
36 if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
37 {
38- struct swc_buffer * buffer;
39+ struct swc_buffer * current_buffer = surface->state.buffer,
40+ * pending_buffer = surface->pending.state.buffer;
41
42- if (surface->state.buffer
43- && surface->state.buffer != surface->pending.state.buffer)
44- {
45- wl_buffer_send_release(surface->state.buffer);
46- }
47+ if (current_buffer && current_buffer != pending_buffer)
48+ swc_wayland_buffer_release(current_buffer);
49
50 state_set_buffer(&surface->state, surface->pending.state.buffer);
51
52 /* Determine size of buffer. */
53- if (surface->state.buffer)
54+ if (current_buffer)
55 {
56- if ((buffer = swc_wayland_buffer_get(surface->state.buffer)))
57- set_size(surface, buffer->wld->width, buffer->wld->height);
58- else
59- WARNING("Unknown buffer type attached\n");
60+ set_size(surface,
61+ current_buffer->wld->width, current_buffer->wld->height);
62 }
63 else
64 set_size(surface, 0, 0);
+1,
-1
1@@ -55,7 +55,7 @@ enum swc_surface_commit_info
2
3 struct swc_surface_state
4 {
5- struct wl_resource * buffer;
6+ struct swc_buffer * buffer;
7 struct wl_listener buffer_destroy_listener;
8 bool current;
9
+2,
-2
1@@ -27,6 +27,7 @@
2 #include <stdbool.h>
3 #include <stdint.h>
4
5+struct swc_buffer;
6 struct swc_surface;
7 struct wl_resource;
8
9@@ -46,8 +47,7 @@ struct swc_view_impl
10 void (* remove)(struct swc_surface * surface);
11
12 /* Called when a new buffer is attached to a surface. */
13- void (* attach)(struct swc_surface * surface,
14- struct wl_resource * resource);
15+ void (* attach)(struct swc_surface * surface, struct swc_buffer * buffer);
16
17 /* Called after a surface requests a commit. */
18 void (* update)(struct swc_surface * surface);