• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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