commit 365cdf2

Michael Forney  ·  2013-11-17 23:16:23 +0000 UTC
parent 010e858
drm: Remove drm_drawable, move export to drm_draw_interface
4 files changed,  +78, -96
M drm.c
M drm.h
+12, -11
 1@@ -30,15 +30,17 @@ typedef bool (* drm_device_supported_func_t)(uint32_t vendor_id,
 2                                              uint32_t device_id);
 3 typedef void * (* drm_create_context_func_t)(int drm_fd);
 4 typedef void (* drm_destroy_context_func_t)(void * context);
 5-typedef struct drm_drawable * (* drm_create_drawable_func_t)
 6+typedef struct wld_drawable * (* drm_create_drawable_func_t)
 7     (void * context, uint32_t width, uint32_t height, uint32_t format);
 8-typedef struct drm_drawable * (* drm_import_func_t)
 9+typedef struct wld_drawable * (* drm_import_func_t)
10     (void * context, uint32_t width, uint32_t height, uint32_t format,
11      int prime_fd, unsigned long pitch);
12-typedef struct drm_drawable * (* drm_import_gem_func_t)
13+typedef struct wld_drawable * (* drm_import_gem_func_t)
14     (void * context, uint32_t width, uint32_t height, uint32_t format,
15      uint32_t gem_name, unsigned long pitch);
16-typedef int (* drm_export_func_t)(struct drm_drawable * drawable);
17+
18+typedef int (* drm_export_func_t)(struct wld_drawable * drawable);
19+typedef uint32_t (* drm_get_handle_func_t)(struct wld_drawable * drawable);
20 
21 struct wld_drm_interface
22 {
23@@ -48,7 +50,13 @@ struct wld_drm_interface
24     drm_create_drawable_func_t create_drawable;
25     drm_import_func_t import;
26     drm_import_gem_func_t import_gem;
27+};
28+
29+struct drm_draw_interface
30+{
31+    struct wld_draw_interface base;
32     drm_export_func_t export;
33+    drm_get_handle_func_t get_handle;
34 };
35 
36 struct wld_drm_context
37@@ -57,13 +65,6 @@ struct wld_drm_context
38     void * context;
39 };
40 
41-struct drm_drawable
42-{
43-    struct wld_drawable base;
44-    struct wld_drm_context * drm;
45-    uint32_t handle;
46-};
47-
48 #if WITH_DRM_INTEL
49 extern const struct wld_drm_interface intel_drm;
50 #endif
M drm.c
+8, -36
 1@@ -107,27 +107,11 @@ void wld_drm_destroy_context(struct wld_drm_context * drm)
 2     free(drm);
 3 }
 4 
 5-static struct wld_drawable * finish_drawable(struct wld_drm_context * drm,
 6-                                             struct drm_drawable * drawable)
 7-{
 8-    if (!drawable)
 9-        return NULL;
10-
11-    drawable->drm = drm;
12-
13-    return &drawable->base;
14-}
15-
16 struct wld_drawable * wld_drm_create_drawable(struct wld_drm_context * drm,
17                                               uint32_t width, uint32_t height,
18                                               uint32_t format)
19 {
20-    struct drm_drawable * drawable;
21-
22-    drawable = drm->interface->create_drawable(drm->context,
23-                                               width, height, format);
24-
25-    return finish_drawable(drm, drawable);
26+    return drm->interface->create_drawable(drm->context, width, height, format);
27 }
28 
29 struct wld_drawable * wld_drm_import(struct wld_drm_context * drm,
30@@ -135,12 +119,8 @@ struct wld_drawable * wld_drm_import(struct wld_drm_context * drm,
31                                      uint32_t format,
32                                      int prime_fd, unsigned long pitch)
33 {
34-    struct drm_drawable * drawable;
35-
36-    drawable = drm->interface->import(drm->context, width, height, format,
37-                                      prime_fd, pitch);
38-
39-    return finish_drawable(drm, drawable);
40+    return drm->interface->import(drm->context, width, height, format,
41+                                  prime_fd, pitch);
42 }
43 
44 struct wld_drawable * wld_drm_import_gem(struct wld_drm_context * drm,
45@@ -148,25 +128,17 @@ struct wld_drawable * wld_drm_import_gem(struct wld_drm_context * drm,
46                                          uint32_t format,
47                                          uint32_t gem_name, unsigned long pitch)
48 {
49-    struct drm_drawable * drawable;
50-
51-    drawable = drm->interface->import_gem(drm->context, width, height, format,
52-                                          gem_name, pitch);
53-
54-    return finish_drawable(drm, drawable);
55+    return drm->interface->import_gem(drm->context, width, height, format,
56+                                      gem_name, pitch);
57 }
58 
59 int wld_drm_export(struct wld_drawable * drawable)
60 {
61-    struct drm_drawable * drm_drawable = (void *) drawable;
62-
63-    return drm_drawable->drm->interface->export(drm_drawable);
64+    return ((struct drm_draw_interface *) drawable->interface)->export(drawable);
65 }
66 
67-uint32_t wld_drm_drawable_get_handle(struct wld_drawable * drawable)
68+uint32_t wld_drm_get_handle(struct wld_drawable * drawable)
69 {
70-    struct drm_drawable * drm_drawable = (void *) drawable;
71-
72-    return drm_drawable->handle;
73+    return ((struct drm_draw_interface *) drawable->interface)->get_handle(drawable);
74 }
75 
M drm.h
+1, -1
1@@ -77,7 +77,7 @@ int wld_drm_export(struct wld_drawable * drawable);
2  *
3  * This can be used with various DRM ioctls.
4  */
5-uint32_t wld_drm_drawable_get_handle(struct wld_drawable * drawable);
6+uint32_t wld_drm_get_handle(struct wld_drawable * drawable);
7 
8 #endif
9 
+57, -48
  1@@ -39,7 +39,7 @@ struct wld_intel_context
  2 
  3 struct intel_drawable
  4 {
  5-    struct drm_drawable drm;
  6+    struct wld_drawable base;
  7 
  8     struct wld_intel_context * context;
  9     drm_intel_bo * bo;
 10@@ -66,31 +66,37 @@ static pixman_image_t * intel_map(struct wld_drawable * drawable);
 11 static void intel_flush(struct wld_drawable * drawable);
 12 static void intel_destroy(struct wld_drawable * drawable);
 13 
 14+static int intel_export(struct wld_drawable * drawable);
 15+static uint32_t intel_get_handle(struct wld_drawable * drawable);
 16+
 17 /* DRM implementation */
 18 static bool intel_device_supported(uint32_t vendor_id, uint32_t device_id);
 19 static struct wld_intel_context * intel_create_context(int drm_fd);
 20 static void intel_destroy_context(struct wld_intel_context * context);
 21-static struct drm_drawable * intel_create_drawable
 22+static struct wld_drawable * intel_create_drawable
 23     (struct wld_intel_context * context, uint32_t width, uint32_t height,
 24      uint32_t format);
 25-static struct drm_drawable * intel_import
 26+static struct wld_drawable * intel_import
 27     (struct wld_intel_context * context, uint32_t width, uint32_t height,
 28      uint32_t format, int prime_fd, unsigned long pitch);
 29-static struct drm_drawable * intel_import_gem
 30+static struct wld_drawable * intel_import_gem
 31     (struct wld_intel_context * context, uint32_t width, uint32_t height,
 32      uint32_t format, uint32_t gem_name, unsigned long pitch);
 33-static int intel_export(struct drm_drawable * drawable);
 34-
 35-const static struct wld_draw_interface intel_draw = {
 36-    .fill_rectangle = &intel_fill_rectangle,
 37-    .fill_region = &default_fill_region,
 38-    .copy_rectangle = &intel_copy_rectangle,
 39-    .copy_region = &default_copy_region,
 40-    .draw_text_utf8 = &intel_draw_text_utf8,
 41-    .write = &intel_write,
 42-    .map = &intel_map,
 43-    .flush = &intel_flush,
 44-    .destroy = &intel_destroy
 45+
 46+const static struct drm_draw_interface intel_draw = {
 47+    .base = {
 48+        .fill_rectangle = &intel_fill_rectangle,
 49+        .fill_region = &default_fill_region,
 50+        .copy_rectangle = &intel_copy_rectangle,
 51+        .copy_region = &default_copy_region,
 52+        .draw_text_utf8 = &intel_draw_text_utf8,
 53+        .write = &intel_write,
 54+        .map = &intel_map,
 55+        .flush = &intel_flush,
 56+        .destroy = &intel_destroy
 57+    },
 58+    .export = &intel_export,
 59+    .get_handle = &intel_get_handle
 60 };
 61 
 62 const struct wld_drm_interface intel_drm = {
 63@@ -100,7 +106,6 @@ const struct wld_drm_interface intel_drm = {
 64     .create_drawable = (drm_create_drawable_func_t) &intel_create_drawable,
 65     .import = (drm_import_func_t) &intel_import,
 66     .import_gem = (drm_import_gem_func_t) &intel_import_gem,
 67-    .export = (drm_export_func_t) &intel_export,
 68 };
 69 
 70 bool intel_device_supported(uint32_t vendor_id, uint32_t device_id)
 71@@ -138,17 +143,17 @@ static struct intel_drawable * new_drawable(struct wld_intel_context * context,
 72     if (!(intel = malloc(sizeof *intel)))
 73         return NULL;
 74 
 75-    intel->drm.base.interface = &intel_draw;
 76-    intel->drm.base.width = width;
 77-    intel->drm.base.height = height;
 78-    intel->drm.base.format = format;
 79+    intel->base.interface = (struct wld_draw_interface *) &intel_draw;
 80+    intel->base.width = width;
 81+    intel->base.height = height;
 82+    intel->base.format = format;
 83     intel->context = context;
 84     intel->virtual = NULL;
 85 
 86     return intel;
 87 }
 88 
 89-struct drm_drawable * intel_create_drawable
 90+struct wld_drawable * intel_create_drawable
 91     (struct wld_intel_context * context, uint32_t width, uint32_t height,
 92      uint32_t format)
 93 {
 94@@ -160,13 +165,12 @@ struct drm_drawable * intel_create_drawable
 95 
 96     intel->bo = drm_intel_bo_alloc_tiled(context->bufmgr, "drawable",
 97                                          width, height, 4, &tiling_mode,
 98-                                         &intel->drm.base.pitch, 0);
 99-    intel->drm.handle = intel->bo->handle;
100+                                         &intel->base.pitch, 0);
101 
102-    return &intel->drm;
103+    return &intel->base;
104 }
105 
106-struct drm_drawable * intel_import(struct wld_intel_context * context,
107+struct wld_drawable * intel_import(struct wld_intel_context * context,
108                                    uint32_t width, uint32_t height,
109                                    uint32_t format,
110                                    int prime_fd, unsigned long pitch)
111@@ -179,13 +183,12 @@ struct drm_drawable * intel_import(struct wld_intel_context * context,
112 
113     intel->bo = drm_intel_bo_gem_create_from_prime(context->bufmgr,
114                                                    prime_fd, size);
115-    intel->drm.base.pitch = pitch;
116-    intel->drm.handle = intel->bo->handle;
117+    intel->base.pitch = pitch;
118 
119-    return &intel->drm;
120+    return &intel->base;
121 }
122 
123-struct drm_drawable * intel_import_gem(struct wld_intel_context * context,
124+struct wld_drawable * intel_import_gem(struct wld_intel_context * context,
125                                        uint32_t width, uint32_t height,
126                                        uint32_t format,
127                                        uint32_t gem_name, unsigned long pitch)
128@@ -197,20 +200,9 @@ struct drm_drawable * intel_import_gem(struct wld_intel_context * context,
129 
130     intel->bo = drm_intel_bo_gem_create_from_name(context->bufmgr, "drawable",
131                                                   gem_name);
132-    intel->drm.base.pitch = pitch;
133-    intel->drm.handle = intel->bo->handle;
134+    intel->base.pitch = pitch;
135 
136-    return &intel->drm;
137-}
138-
139-int intel_export(struct drm_drawable * drawable)
140-{
141-    struct intel_drawable * intel = (void *) drawable;
142-    int prime_fd;
143-
144-    drm_intel_bo_gem_export_to_prime(intel->bo, &prime_fd);
145-
146-    return prime_fd;
147+    return &intel->base;
148 }
149 
150 void intel_fill_rectangle(struct wld_drawable * drawable, uint32_t color,
151@@ -218,7 +210,7 @@ void intel_fill_rectangle(struct wld_drawable * drawable, uint32_t color,
152 {
153     struct intel_drawable * intel = (void *) drawable;
154 
155-    xy_color_blt(&intel->context->batch, intel->bo, intel->drm.base.pitch,
156+    xy_color_blt(&intel->context->batch, intel->bo, intel->base.pitch,
157                  x, y, x + width, y + height, color);
158 }
159 
160@@ -232,8 +224,8 @@ void intel_copy_rectangle(struct wld_drawable * src_drawable,
161     struct intel_drawable * dst = (void *) dst_drawable;
162 
163     xy_src_copy_blt(&dst->context->batch,
164-                    src->bo, src->drm.base.pitch, src_x, src_y,
165-                    dst->bo, dst->drm.base.pitch, dst_x, dst_y, width, height);
166+                    src->bo, src->base.pitch, src_x, src_y,
167+                    dst->bo, dst->base.pitch, dst_x, dst_y, width, height);
168 }
169 
170 void intel_draw_text_utf8(struct wld_drawable * drawable,
171@@ -254,7 +246,7 @@ void intel_draw_text_utf8(struct wld_drawable * drawable,
172     int32_t origin_x = x;
173 
174     xy_setup_blt(&intel->context->batch, true, INTEL_BLT_RASTER_OPERATION_SRC,
175-                 0, color, intel->bo, intel->drm.base.pitch);
176+                 0, color, intel->bo, intel->base.pitch);
177 
178     while ((ret = FcUtf8ToUcs4((FcChar8 *) text, &c, length)) > 0 && c != '\0')
179     {
180@@ -293,7 +285,7 @@ void intel_draw_text_utf8(struct wld_drawable * drawable,
181             intel_batch_flush(&intel->context->batch);
182             xy_setup_blt(&intel->context->batch, true,
183                          INTEL_BLT_RASTER_OPERATION_SRC, 0, color,
184-                         intel->bo, intel->drm.base.pitch);
185+                         intel->bo, intel->base.pitch);
186             goto retry;
187         }
188 
189@@ -353,3 +345,20 @@ void intel_destroy(struct wld_drawable * drawable)
190     free(intel);
191 }
192 
193+int intel_export(struct wld_drawable * drawable)
194+{
195+    struct intel_drawable * intel = (void *) drawable;
196+    int prime_fd;
197+
198+    drm_intel_bo_gem_export_to_prime(intel->bo, &prime_fd);
199+
200+    return prime_fd;
201+}
202+
203+uint32_t intel_get_handle(struct wld_drawable * drawable)
204+{
205+    struct intel_drawable * intel = (void *) drawable;
206+
207+    return intel->bo->handle;
208+}
209+