commit bbb03ae
Michael Forney
·
2014-01-14 01:57:27 +0000 UTC
parent 25780d2
Add better map interface
6 files changed,
+57,
-30
+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
M
intel.c
+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
M
pixman.c
+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 */