Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / gallium / winsys / nouveau / drm / nouveau_drm_winsys.c
1 #include "pipe/p_context.h"
2 #include "pipe/p_state.h"
3 #include "util/u_format.h"
4 #include "util/u_memory.h"
5 #include "util/u_inlines.h"
6
7 #include "nouveau_drm_winsys.h"
8 #include "nouveau_drm_public.h"
9
10 #include "nouveau_drmif.h"
11 #include "nouveau_channel.h"
12 #include "nouveau_bo.h"
13
14 #include "nouveau/nouveau_winsys.h"
15 #include "nouveau/nouveau_screen.h"
16
17 static void
18 nouveau_drm_destroy_winsys(struct pipe_winsys *s)
19 {
20 struct nouveau_winsys *nv_winsys = nouveau_winsys(s);
21 struct nouveau_screen *nv_screen= nouveau_screen(nv_winsys->pscreen);
22 if (nv_screen)
23 nouveau_device_close(&nv_screen->device);
24 FREE(nv_winsys);
25 }
26
27 struct pipe_screen *
28 nouveau_drm_screen_create(int fd)
29 {
30 struct nouveau_winsys *nvws;
31 struct pipe_winsys *ws;
32 struct nouveau_device *dev = NULL;
33 struct pipe_screen *(*init)(struct pipe_winsys *,
34 struct nouveau_device *);
35 int ret;
36
37 ret = nouveau_device_open_existing(&dev, 0, fd, 0);
38 if (ret)
39 return NULL;
40
41 switch (dev->chipset & 0xf0) {
42 case 0x30:
43 case 0x40:
44 case 0x60:
45 init = nvfx_screen_create;
46 break;
47 case 0x50:
48 case 0x80:
49 case 0x90:
50 case 0xa0:
51 init = nv50_screen_create;
52 break;
53 default:
54 debug_printf("%s: unknown chipset nv%02x\n", __func__,
55 dev->chipset);
56 return NULL;
57 }
58
59 nvws = CALLOC_STRUCT(nouveau_winsys);
60 if (!nvws) {
61 nouveau_device_close(&dev);
62 return NULL;
63 }
64 ws = &nvws->base;
65 ws->destroy = nouveau_drm_destroy_winsys;
66
67 nvws->pscreen = init(ws, dev);
68 if (!nvws->pscreen) {
69 ws->destroy(ws);
70 return NULL;
71 }
72
73 return nvws->pscreen;
74 }