commit bbb03ae

Michael Forney  ·  2014-01-14 01:57:27 +0000 UTC
parent 25780d2
Add better map interface
6 files changed,  +57, -30
M wld.h
+21, -2
 1@@ -35,6 +35,8 @@ void drawable_initialize(struct wld_drawable * drawable,
 2     drawable->height = height;
 3     drawable->format = format;
 4     drawable->pitch = pitch;
 5+    drawable->map.data = NULL;
 6+    drawable->map.count = 0;
 7     drawable->exporters = NULL;
 8 }
 9 
10@@ -53,9 +55,26 @@ void exporter_initialize(struct wld_exporter * exporter,
11 }
12 
13 EXPORT
14-pixman_image_t * wld_map(struct wld_drawable * drawable)
15+bool wld_map(struct wld_drawable * drawable)
16 {
17-    return drawable->impl->map(drawable);
18+    if (drawable->map.count == 0 && !drawable->impl->map(drawable))
19+        return false;
20+
21+    ++drawable->map.count;
22+    return true;
23+}
24+
25+EXPORT
26+bool wld_unmap(struct wld_drawable * drawable)
27+{
28+    if (drawable->map.count == 0
29+        || (drawable->map.count == 1 && !drawable->impl->unmap(drawable)))
30+    {
31+        return false;
32+    }
33+
34+    --drawable->map.count;
35+    return true;
36 }
37 
38 EXPORT
+15, -21
 1@@ -48,7 +48,6 @@ struct intel_drawable
 2     struct wld_drawable base;
 3     struct wld_exporter exporter;
 4     drm_intel_bo * bo;
 5-    pixman_image_t * virtual;
 6 };
 7 
 8 #include "interface/context.h"
 9@@ -121,7 +120,6 @@ static struct intel_drawable * new_drawable(uint32_t width, uint32_t height,
10 
11     drawable_initialize(&intel->base, &drawable_impl,
12                         width, height, format, 0);
13-    intel->virtual = NULL;
14     exporter_initialize(&intel->exporter, &exporter_impl);
15     drawable_add_exporter(&intel->base, &intel->exporter);
16 
17@@ -331,32 +329,28 @@ void renderer_destroy(struct wld_renderer * base)
18     free(renderer);
19 }
20 
21-static void destroy_virtual(pixman_image_t * image, void * data)
22+bool drawable_map(struct wld_drawable * base)
23 {
24-    struct intel_drawable * intel = data;
25+    struct intel_drawable * drawable = intel_drawable(base);
26+
27+    if (drm_intel_gem_bo_map_gtt(drawable->bo) != 0)
28+        return false;
29 
30-    drm_intel_gem_bo_unmap_gtt(intel->bo);
31-    intel->virtual = NULL;
32+    drawable->base.map.data = drawable->bo->virtual;
33+
34+    return true;
35 }
36 
37-pixman_image_t * drawable_map(struct wld_drawable * drawable)
38+bool drawable_unmap(struct wld_drawable * base)
39 {
40-    struct intel_drawable * intel = (void *) drawable;
41+    struct intel_drawable * drawable = intel_drawable(base);
42 
43-    if (!intel->virtual)
44-    {
45-        drm_intel_gem_bo_map_gtt(intel->bo);
46-        intel->virtual = pixman_image_create_bits_no_clear
47-            (format_wld_to_pixman(drawable->format),
48-             drawable->width, drawable->height,
49-             intel->bo->virtual, drawable->pitch);
50-        pixman_image_set_destroy_function(intel->virtual, &destroy_virtual,
51-                                          intel);
52-    }
53-    else
54-        pixman_image_ref(intel->virtual);
55+    if (drm_intel_gem_bo_unmap_gtt(drawable->bo) != 0)
56+        return false;
57+
58+    drawable->base.map.data = NULL;
59 
60-    return intel->virtual;
61+    return true;
62 }
63 
64 void drawable_destroy(struct wld_drawable * drawable)
+3, -1
 1@@ -21,11 +21,13 @@
 2  * SOFTWARE.
 3  */
 4 
 5-static pixman_image_t * drawable_map(struct wld_drawable * drawable);
 6+static bool drawable_map(struct wld_drawable * drawable);
 7+static bool drawable_unmap(struct wld_drawable * drawable);
 8 static void drawable_destroy(struct wld_drawable * drawable);
 9 
10 static const struct wld_drawable_impl drawable_impl = {
11     .map = &drawable_map,
12+    .unmap = &drawable_unmap,
13     .destroy = &drawable_destroy
14 };
15 
+7, -3
 1@@ -100,6 +100,7 @@ struct wld_drawable * new_drawable(pixman_image_t * image)
 2                         pixman_image_get_height(image),
 3                         format_pixman_to_wld(pixman_image_get_format(image)),
 4                         pixman_image_get_stride(image));
 5+    drawable->base.map.data = pixman_image_get_data(image);
 6     drawable->image = image;
 7 
 8     return &drawable->base;
 9@@ -364,11 +365,14 @@ void renderer_destroy(struct wld_renderer * base)
10     free(renderer);
11 }
12 
13-pixman_image_t * drawable_map(struct wld_drawable * drawable)
14+bool drawable_map(struct wld_drawable * drawable)
15 {
16-    struct pixman_drawable * pixman = (void *) drawable;
17+    return true;
18+}
19 
20-    return pixman_image_ref(pixman->image);
21+bool drawable_unmap(struct wld_drawable * drawable)
22+{
23+    return true;
24 }
25 
26 void drawable_destroy(struct wld_drawable * drawable)
+2, -1
 1@@ -126,7 +126,8 @@ struct wld_renderer_impl
 2 
 3 struct wld_drawable_impl
 4 {
 5-    pixman_image_t * (* map)(struct wld_drawable * drawable);
 6+    bool (* map)(struct wld_drawable * drawable);
 7+    bool (* unmap)(struct wld_drawable * drawable);
 8     void (* destroy)(struct wld_drawable * drawable);
 9 };
10 
M wld.h
+9, -2
 1@@ -152,16 +152,23 @@ struct wld_drawable
 2     unsigned long pitch;
 3     enum wld_format format;
 4 
 5+    struct
 6+    {
 7+        void * data;
 8+        unsigned count;
 9+    } map;
10+
11     struct wld_exporter * exporters;
12 
13     const struct wld_drawable_impl * impl;
14 };
15 
16+bool wld_map(struct wld_drawable * drawable);
17+bool wld_unmap(struct wld_drawable * drawable);
18+
19 bool wld_export(struct wld_drawable * drawable,
20                 uint32_t type, union wld_object * object);
21 
22-pixman_image_t * wld_map(struct wld_drawable * drawable);
23-
24 /**
25  * Destroy a drawable (created with any context).
26  */