1 #include <unistd.h>
2
3 #include "util/format/u_format.h"
4 #include "util/os_file.h"
5 #include "util/u_debug.h"
6 #include "util/u_memory.h"
7 #include "util/u_screen.h"
8
9 #include "renderonly/renderonly.h"
10 #include "nouveau_drm_public.h"
11
12 #include "nouveau/nouveau_screen.h"
13 #include "nouveau/nouveau_winsys.h"
14
15 static struct pipe_screen *
nouveau_screen_create(int fd,const struct pipe_screen_config * config,struct renderonly * ro)16 nouveau_screen_create(int fd, const struct pipe_screen_config *config,
17 struct renderonly *ro)
18 {
19 struct nouveau_drm *drm = NULL;
20 struct nouveau_device *dev = NULL;
21 struct nouveau_screen *(*init)(struct nouveau_device *);
22 struct nouveau_screen *screen = NULL;
23 int ret;
24
25 ret = nouveau_drm_new(fd, &drm);
26 if (ret)
27 return NULL;
28
29 ret = nouveau_device_new(&drm->client, &dev);
30 if (ret)
31 goto err_dev_new;
32
33 switch (dev->chipset & ~0xf) {
34 case 0x30:
35 case 0x40:
36 case 0x60:
37 init = nv30_screen_create;
38 break;
39 case 0x50:
40 case 0x80:
41 case 0x90:
42 case 0xa0:
43 init = nv50_screen_create;
44 break;
45 case 0xc0:
46 case 0xd0:
47 case 0xe0:
48 case 0xf0:
49 case 0x100:
50 case 0x110:
51 case 0x120:
52 case 0x130:
53 case 0x140:
54 case 0x160:
55 case 0x170:
56 case 0x190:
57 init = nvc0_screen_create;
58 break;
59 default:
60 debug_printf("%s: unknown chipset nv%02x\n", __func__, dev->chipset);
61 goto err_screen_create;
62 }
63
64 screen = init(dev);
65 if (!screen)
66 goto err_screen_create;
67
68 if (!screen->base.context_create)
69 goto err_screen_init;
70
71 screen->initialized = true;
72 return &screen->base;
73
74 err_screen_init:
75 screen->base.destroy(&screen->base);
76 return NULL;
77
78 err_screen_create:
79 nouveau_device_del(&dev);
80 err_dev_new:
81 nouveau_drm_del(&drm);
82 return NULL;
83 }
84
85 struct pipe_screen *
nouveau_drm_screen_create(int fd)86 nouveau_drm_screen_create(int fd)
87 {
88 return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL, NULL,
89 nouveau_screen_create);
90 }
91