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
+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
M
intel.c
+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+