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
);
169 * XXX: Need this to initialize sarea pointer and other stuff in dri_drawable_t
170 * to be able to use the DRI_VALIDATE_DRAWABLE_INFO macro, but is it safe to
171 * call without any sync?
173 if (driUpdateDrawableInfo(dri_draw
))
175 XF86DRIDestroyDrawable(dri_screen
->display
, dri_screen
->num
, drawable
);
180 *dri_drawable
= dri_draw
;
185 int driUpdateDrawableInfo(dri_drawable_t
*dri_drawable
)
187 assert(dri_drawable
);
189 if (dri_drawable
->cliprects
)
190 XFree(dri_drawable
->cliprects
);
191 if (dri_drawable
->back_cliprects
)
192 XFree(dri_drawable
->back_cliprects
);
194 DRM_SPINUNLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
196 if (!XF86DRIGetDrawableInfo
198 dri_drawable
->dri_screen
->display
,
199 dri_drawable
->dri_screen
->num
,
200 dri_drawable
->x_drawable
,
201 &dri_drawable
->sarea_index
,
202 &dri_drawable
->last_sarea_stamp
,
207 &dri_drawable
->num_cliprects
,
208 &dri_drawable
->cliprects
,
209 &dri_drawable
->back_x
,
210 &dri_drawable
->back_y
,
211 &dri_drawable
->num_back_cliprects
,
212 &dri_drawable
->back_cliprects
215 dri_drawable
->sarea_stamp
= &dri_drawable
->last_sarea_stamp
;
216 dri_drawable
->num_cliprects
= 0;
217 dri_drawable
->cliprects
= NULL
;
218 dri_drawable
->num_back_cliprects
= 0;
219 dri_drawable
->back_cliprects
= 0;
224 dri_drawable
->sarea_stamp
= &dri_drawable
->dri_screen
->sarea
->drawableTable
[dri_drawable
->sarea_index
].stamp
;
226 DRM_SPINLOCK(&dri_drawable
->dri_screen
->sarea
->drawable_lock
, dri_drawable
->dri_screen
->draw_lock_id
);
231 int driDestroyDrawable(dri_drawable_t
*dri_drawable
)
233 assert(dri_drawable
);
235 if (--dri_drawable
->refcount
== 0)
237 if (dri_drawable
->cliprects
)
238 XFree(dri_drawable
->cliprects
);
239 if (dri_drawable
->back_cliprects
)
240 XFree(dri_drawable
->back_cliprects
);
241 drmHashDelete(dri_drawable
->dri_screen
->drawable_hash
, dri_drawable
->x_drawable
);
242 XF86DRIDestroyDrawable(dri_drawable
->dri_screen
->display
, dri_drawable
->dri_screen
->num
, dri_drawable
->x_drawable
);
249 int driCreateContext(dri_screen_t
*dri_screen
, Visual
*visual
, dri_context_t
**dri_context
)
252 dri_context_t
*dri_ctx
;
258 if (!XF86DRIQueryExtension(dri_screen
->display
, &evbase
, &errbase
))
261 dri_ctx
= calloc(1, sizeof(dri_context_t
));
266 if (!XF86DRICreateContext(dri_screen
->display
, dri_screen
->num
, visual
, &dri_ctx
->id
, &dri_ctx
->drm_context
))
272 dri_ctx
->dri_screen
= dri_screen
;
273 *dri_context
= dri_ctx
;
278 int driDestroyContext(dri_context_t
*dri_context
)
282 XF86DRIDestroyContext(dri_context
->dri_screen
->display
, dri_context
->dri_screen
->num
, dri_context
->id
);