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
)
115 dri_drawable_t
*dri_draw
;
119 if (drmHashFirst(dri_screen
->drawable_hash
, &draw
, (void**)&dri_draw
))
121 dri_draw
->refcount
= 1;
122 driDestroyDrawable(dri_draw
);
124 while (drmHashNext(dri_screen
->drawable_hash
, &draw
, (void**)&dri_draw
))
126 dri_draw
->refcount
= 1;
127 driDestroyDrawable(dri_draw
);
131 drmHashDestroy(dri_screen
->drawable_hash
);
132 drmUnmap(dri_screen
->sarea
, SAREA_MAX
);
133 drmCloseOnce(dri_screen
->fd
);
134 XF86DRICloseConnection(dri_screen
->display
, dri_screen
->num
);
140 int driCreateDrawable(dri_screen_t
*dri_screen
, Drawable drawable
, dri_drawable_t
**dri_drawable
)
143 dri_drawable_t
*dri_draw
;
146 assert(dri_drawable
);
148 if (!XF86DRIQueryExtension(dri_screen
->display
, &evbase
, &errbase
))
151 if (!drmHashLookup(dri_screen
->drawable_hash
, drawable
, (void**)dri_drawable
))
154 (*dri_drawable
)->refcount
++;
158 dri_draw
= calloc(1, sizeof(dri_drawable_t
));
163 if (!XF86DRICreateDrawable(dri_screen
->display
, 0, drawable
, &dri_draw
->drm_drawable
))
169 dri_draw
->x_drawable
= drawable
;
170 dri_draw
->sarea_index
= 0;
171 dri_draw
->sarea_stamp
= NULL
;
172 dri_draw
->last_sarea_stamp
= 0;
173 dri_draw
->dri_screen
= dri_screen
;
174 dri_draw
->refcount
= 1;
176 if (drmHashInsert(dri_screen
->drawable_hash
, drawable
, dri_draw
))
178 XF86DRIDestroyDrawable(dri_screen
->display
, dri_screen
->num
, drawable
);
183 if (!dri_draw
->sarea_stamp
|| *dri_draw
->sarea_stamp
!= dri_draw
->last_sarea_stamp
)
185 DRM_SPINLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
187 if (driUpdateDrawableInfo(dri_draw
))
189 XF86DRIDestroyDrawable(dri_screen
->display
, dri_screen
->num
, drawable
);
191 DRM_SPINUNLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
195 DRM_SPINUNLOCK(&dri_screen
->sarea
->drawable_lock
, dri_screen
->draw_lock_id
);
198 *dri_drawable
= dri_draw
;
203 int driUpdateDrawableInfo(dri_drawable_t
*dri_drawable
)
205 assert(dri_drawable
);
207 if (dri_drawable
->cliprects
)
209 XFree(dri_drawable
->cliprects
);
210 dri_drawable
->cliprects
= NULL
;
212 if (dri_drawable
->back_cliprects
)
214 XFree(dri_drawable
->back_cliprects
);
215 dri_drawable
->back_cliprects
= NULL
;
218 DRM_SPINUNLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
220 if (!XF86DRIGetDrawableInfo
222 dri_drawable
->dri_screen
->display
,
223 dri_drawable
->dri_screen
->num
,
224 dri_drawable
->x_drawable
,
225 &dri_drawable
->sarea_index
,
226 &dri_drawable
->last_sarea_stamp
,
231 &dri_drawable
->num_cliprects
,
232 &dri_drawable
->cliprects
,
233 &dri_drawable
->back_x
,
234 &dri_drawable
->back_y
,
235 &dri_drawable
->num_back_cliprects
,
236 &dri_drawable
->back_cliprects
239 dri_drawable
->sarea_stamp
= &dri_drawable
->last_sarea_stamp
;
240 dri_drawable
->num_cliprects
= 0;
241 dri_drawable
->cliprects
= NULL
;
242 dri_drawable
->num_back_cliprects
= 0;
243 dri_drawable
->back_cliprects
= 0;
248 dri_drawable
->sarea_stamp
= &dri_drawable
->dri_screen
->sarea
->drawableTable
[dri_drawable
->sarea_index
].stamp
;
250 DRM_SPINLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
255 int driDestroyDrawable(dri_drawable_t
*dri_drawable
)
257 assert(dri_drawable
);
259 if (--dri_drawable
->refcount
== 0)
261 if (dri_drawable
->cliprects
)
262 XFree(dri_drawable
->cliprects
);
263 if (dri_drawable
->back_cliprects
)
264 XFree(dri_drawable
->back_cliprects
);
265 drmHashDelete(dri_drawable
->dri_screen
->drawable_hash
, dri_drawable
->x_drawable
);
266 XF86DRIDestroyDrawable(dri_drawable
->dri_screen
->display
, dri_drawable
->dri_screen
->num
, dri_drawable
->x_drawable
);
273 int driCreateContext(dri_screen_t
*dri_screen
, Visual
*visual
, dri_context_t
**dri_context
)
276 dri_context_t
*dri_ctx
;
282 if (!XF86DRIQueryExtension(dri_screen
->display
, &evbase
, &errbase
))
285 dri_ctx
= calloc(1, sizeof(dri_context_t
));
290 if (!XF86DRICreateContext(dri_screen
->display
, dri_screen
->num
, visual
, &dri_ctx
->id
, &dri_ctx
->drm_context
))
296 dri_ctx
->dri_screen
= dri_screen
;
297 *dri_context
= dri_ctx
;
302 int driDestroyContext(dri_context_t
*dri_context
)
306 XF86DRIDestroyContext(dri_context
->dri_screen
->display
, dri_context
->dri_screen
->num
, dri_context
->id
);