Tizen 2.0 Release
[profile/ivi/osmesa.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         case 0xc0:
54                 init = nvc0_screen_create;
55                 break;
56         default:
57                 debug_printf("%s: unknown chipset nv%02x\n", __func__,
58                              dev->chipset);
59                 return NULL;
60         }
61
62         nvws = CALLOC_STRUCT(nouveau_winsys);
63         if (!nvws) {
64                 nouveau_device_close(&dev);
65                 return NULL;
66         }
67         ws = &nvws->base;
68         ws->destroy = nouveau_drm_destroy_winsys;
69
70         nvws->pscreen = init(ws, dev);
71         if (!nvws->pscreen) {
72                 ws->destroy(ws);
73                 return NULL;
74         }
75
76         return nvws->pscreen;
77 }