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);