5 int driCreateScreen(Display
*display
, int screen
, dri_screen_t
**dri_screen
, dri_framebuffer_t
*dri_framebuf
)
11 drmVersionPtr drm_version
;
12 drm_handle_t sarea_handle
;
14 dri_screen_t
*dri_scrn
;
19 if (!XF86DRIQueryExtension(display
, &evbase
, &errbase
))
22 dri_scrn
= calloc(1, sizeof(dri_screen_t
));
27 if (!XF86DRIQueryVersion(display
, &dri_scrn
->dri
.major
, &dri_scrn
->dri
.minor
, &dri_scrn
->dri
.patch
))
30 dri_scrn
->display
= display
;
31 dri_scrn
->num
= screen
;
32 dri_scrn
->draw_lock_id
= 1;
34 if (!XF86DRIOpenConnection(display
, screen
, &sarea_handle
, &bus_id
))
38 dri_scrn
->fd
= drmOpenOnce(NULL
, bus_id
, &newly_opened
);
42 goto close_connection
;
44 if (drmGetMagic(dri_scrn
->fd
, &magic
))
47 drm_version
= drmGetVersion(dri_scrn
->fd
);
52 dri_scrn
->drm
.major
= drm_version
->version_major
;
53 dri_scrn
->drm
.minor
= drm_version
->version_minor
;
54 dri_scrn
->drm
.patch
= drm_version
->version_patchlevel
;
55 drmFreeVersion(drm_version
);
57 if (!XF86DRIAuthConnection(display
, screen
, magic
))
60 if (!XF86DRIGetClientDriverName
71 if (drmMap(dri_scrn
->fd
, sarea_handle
, SAREA_MAX
, (drmAddress
)&dri_scrn
->sarea
))
74 dri_scrn
->drawable_hash
= drmHashCreate();
76 if (!dri_scrn
->drawable_hash
)
81 if (!XF86DRIGetDeviceInfo
84 screen
, &dri_framebuf
->drm_handle
,
87 &dri_framebuf
->stride
,
88 &dri_framebuf
->private_size
,
89 &dri_framebuf
->private
94 *dri_screen
= dri_scrn
;
99 drmHashDestroy(dri_scrn
->drawable_hash
);
101 drmUnmap(dri_scrn
->sarea
, SAREA_MAX
);
103 drmCloseOnce(dri_scrn
->fd
);
105 XF86DRICloseConnection(display
, screen
);
112 int driDestroyScreen(dri_screen_t
*dri_screen
)
116 drmHashDestroy(dri_screen
->drawable_hash
);
117 drmUnmap(dri_screen
->sarea
, SAREA_MAX
);
118 drmCloseOnce(dri_screen
->fd
);
119 XF86DRICloseConnection(dri_screen
->display
, dri_screen
->num
);
125 int driCreateDrawable(dri_screen_t
*dri_screen
, Drawable drawable
, dri_drawable_t
**dri_drawable
)
128 dri_drawable_t
*dri_draw
;
131 assert(dri_drawable
);
133 if (!XF86DRIQueryExtension(dri_screen
->display
, &evbase
, &errbase
))
136 if (!drmHashLookup(dri_screen
->drawable_hash
, drawable
, (void**)dri_drawable
))
139 (*dri_drawable
)->refcount
++;
143 dri_draw
= calloc(1, sizeof(dri_drawable_t
));
148 if (!XF86DRICreateDrawable(dri_screen
->display
, 0, drawable
, &dri_draw
->drm_drawable
))
154 dri_draw
->x_drawable
= drawable
;
155 dri_draw
->sarea_index
= 0;
156 dri_draw
->sarea_stamp
= NULL
;
157 dri_draw
->last_sarea_stamp
= 0;
158 dri_draw
->dri_screen
= dri_screen
;
159 dri_draw
->refcount
= 1;
161 if (drmHashInsert(dri_screen
->drawable_hash
, drawable
, dri_draw
))
163 XF86DRIDestroyDrawable(dri_screen
->display
, dri_screen
->num
, drawable
);
168 if (!dri_draw
->sarea_stamp
|| *dri_draw
->sarea_stamp
!= dri_draw
->last_sarea_stamp
)
170 DRM_SPINLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
172 if (driUpdateDrawableInfo(dri_draw
))
174 XF86DRIDestroyDrawable(dri_screen
->display
, dri_screen
->num
, drawable
);
176 DRM_SPINUNLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
180 DRM_SPINUNLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
183 *dri_drawable
= dri_draw
;
188 int driUpdateDrawableInfo(dri_drawable_t
*dri_drawable
)
190 assert(dri_drawable
);
192 if (dri_drawable
->cliprects
)
194 XFree(dri_drawable
->cliprects
);
195 dri_drawable
->cliprects
= NULL
;
197 if (dri_drawable
->back_cliprects
)
199 XFree(dri_drawable
->back_cliprects
);
200 dri_drawable
->back_cliprects
= NULL
;
203 DRM_SPINUNLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
205 if (!XF86DRIGetDrawableInfo
207 dri_drawable
->dri_screen
->display
,
208 dri_drawable
->dri_screen
->num
,
209 dri_drawable
->x_drawable
,
210 &dri_drawable
->sarea_index
,
211 &dri_drawable
->last_sarea_stamp
,
216 &dri_drawable
->num_cliprects
,
217 &dri_drawable
->cliprects
,
218 &dri_drawable
->back_x
,
219 &dri_drawable
->back_y
,
220 &dri_drawable
->num_back_cliprects
,
221 &dri_drawable
->back_cliprects
224 dri_drawable
->sarea_stamp
= &dri_drawable
->last_sarea_stamp
;
225 dri_drawable
->num_cliprects
= 0;
226 dri_drawable
->cliprects
= NULL
;
227 dri_drawable
->num_back_cliprects
= 0;
228 dri_drawable
->back_cliprects
= 0;
233 dri_drawable
->sarea_stamp
= &dri_drawable
->dri_screen
->sarea
->drawableTable
[dri_drawable
->sarea_index
].stamp
;
235 DRM_SPINLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
240 int driDestroyDrawable(dri_drawable_t
*dri_drawable
)
242 assert(dri_drawable
);
244 if (--dri_drawable
->refcount
== 0)
246 if (dri_drawable
->cliprects
)
247 XFree(dri_drawable
->cliprects
);
248 if (dri_drawable
->back_cliprects
)
249 XFree(dri_drawable
->back_cliprects
);
250 drmHashDelete(dri_drawable
->dri_screen
->drawable_hash
, dri_drawable
->x_drawable
);
251 XF86DRIDestroyDrawable(dri_drawable
->dri_screen
->display
, dri_drawable
->dri_screen
->num
, dri_drawable
->x_drawable
);
258 int driCreateContext(dri_screen_t
*dri_screen
, Visual
*visual
, dri_context_t
**dri_context
)
261 dri_context_t
*dri_ctx
;
267 if (!XF86DRIQueryExtension(dri_screen
->display
, &evbase
, &errbase
))
270 dri_ctx
= calloc(1, sizeof(dri_context_t
));
275 if (!XF86DRICreateContext(dri_screen
->display
, dri_screen
->num
, visual
, &dri_ctx
->id
, &dri_ctx
->drm_context
))
281 dri_ctx
->dri_screen
= dri_screen
;
282 *dri_context
= dri_ctx
;
287 int driDestroyContext(dri_context_t
*dri_context
)
291 XF86DRIDestroyContext(dri_context
->dri_screen
->display
, dri_context
->dri_screen
->num
, dri_context
->id
);