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"
7 #include "nouveau_drm_winsys.h"
9 #include "nouveau_drmif.h"
10 #include "nouveau_channel.h"
11 #include "nouveau_bo.h"
13 #include "nouveau/nouveau_winsys.h"
14 #include "nouveau/nouveau_screen.h"
17 nouveau_drm_destroy_winsys(struct pipe_winsys
*s
)
19 struct nouveau_winsys
*nv_winsys
= nouveau_winsys(s
);
20 struct nouveau_screen
*nv_screen
= nouveau_screen(nv_winsys
->pscreen
);
21 nouveau_device_close(&nv_screen
->device
);
25 static struct pipe_screen
*
26 nouveau_drm_create_screen(struct drm_api
*api
, int fd
)
28 struct nouveau_winsys
*nvws
;
29 struct pipe_winsys
*ws
;
30 struct nouveau_device
*dev
= NULL
;
31 struct pipe_screen
*(*init
)(struct pipe_winsys
*,
32 struct nouveau_device
*);
35 ret
= nouveau_device_open_existing(&dev
, 0, fd
, 0);
39 switch (dev
->chipset
& 0xf0) {
43 init
= nvfx_screen_create
;
49 init
= nv50_screen_create
;
52 debug_printf("%s: unknown chipset nv%02x\n", __func__
,
57 nvws
= CALLOC_STRUCT(nouveau_winsys
);
59 nouveau_device_close(&dev
);
63 ws
->destroy
= nouveau_drm_destroy_winsys
;
65 nvws
->pscreen
= init(ws
, dev
);
74 static struct drm_api nouveau_drm_api_hooks
= {
76 .driver_name
= "nouveau",
77 .create_screen
= nouveau_drm_create_screen
,
83 return &nouveau_drm_api_hooks
;