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);