1 #include "pipe/p_defines.h"
2 #include "pipe/p_screen.h"
3 #include "pipe/p_state.h"
5 #include "util/u_memory.h"
6 #include "util/u_inlines.h"
7 #include "util/u_format.h"
8 #include "util/u_format_s3tc.h"
9 #include "util/u_string.h"
15 #include "nouveau_winsys.h"
16 #include "nouveau_screen.h"
17 #include "nouveau_fence.h"
18 #include "nouveau_mm.h"
19 #include "nouveau_buffer.h"
21 /* XXX this should go away */
22 #include "state_tracker/drm_driver.h"
24 int nouveau_mesa_debug
= 0;
27 nouveau_screen_get_name(struct pipe_screen
*pscreen
)
29 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
30 static char buffer
[128];
32 util_snprintf(buffer
, sizeof(buffer
), "NV%02X", dev
->chipset
);
37 nouveau_screen_get_vendor(struct pipe_screen
*pscreen
)
43 nouveau_screen_fence_ref(struct pipe_screen
*pscreen
,
44 struct pipe_fence_handle
**ptr
,
45 struct pipe_fence_handle
*pfence
)
47 nouveau_fence_ref(nouveau_fence(pfence
), (struct nouveau_fence
**)ptr
);
51 nouveau_screen_fence_signalled(struct pipe_screen
*screen
,
52 struct pipe_fence_handle
*pfence
)
54 return nouveau_fence_signalled(nouveau_fence(pfence
));
58 nouveau_screen_fence_finish(struct pipe_screen
*screen
,
59 struct pipe_fence_handle
*pfence
,
62 return nouveau_fence_wait(nouveau_fence(pfence
));
67 nouveau_screen_bo_from_handle(struct pipe_screen
*pscreen
,
68 struct winsys_handle
*whandle
,
71 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
72 struct nouveau_bo
*bo
= 0;
75 ret
= nouveau_bo_name_ref(dev
, whandle
->handle
, &bo
);
77 debug_printf("%s: ref name 0x%08x failed with %d\n",
78 __FUNCTION__
, whandle
->handle
, ret
);
82 *out_stride
= whandle
->stride
;
88 nouveau_screen_bo_get_handle(struct pipe_screen
*pscreen
,
89 struct nouveau_bo
*bo
,
91 struct winsys_handle
*whandle
)
93 whandle
->stride
= stride
;
95 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
96 return nouveau_bo_name_get(bo
, &whandle
->handle
) == 0;
97 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
98 whandle
->handle
= bo
->handle
;
106 nouveau_screen_init(struct nouveau_screen
*screen
, struct nouveau_device
*dev
)
108 struct pipe_screen
*pscreen
= &screen
->base
;
109 struct nv04_fifo nv04_data
= { .vram
= 0xbeef0201, .gart
= 0xbeef0202 };
110 struct nvc0_fifo nvc0_data
= { };
113 union nouveau_bo_config mm_config
;
115 char *nv_dbg
= getenv("NOUVEAU_MESA_DEBUG");
117 nouveau_mesa_debug
= atoi(nv_dbg
);
119 if (dev
->chipset
< 0xc0) {
121 size
= sizeof(nv04_data
);
124 size
= sizeof(nvc0_data
);
127 ret
= nouveau_object_new(&dev
->object
, 0, NOUVEAU_FIFO_CHANNEL_CLASS
,
128 data
, size
, &screen
->channel
);
131 screen
->device
= dev
;
133 ret
= nouveau_client_new(screen
->device
, &screen
->client
);
136 ret
= nouveau_pushbuf_new(screen
->client
, screen
->channel
,
142 pscreen
->get_name
= nouveau_screen_get_name
;
143 pscreen
->get_vendor
= nouveau_screen_get_vendor
;
145 pscreen
->fence_reference
= nouveau_screen_fence_ref
;
146 pscreen
->fence_signalled
= nouveau_screen_fence_signalled
;
147 pscreen
->fence_finish
= nouveau_screen_fence_finish
;
149 util_format_s3tc_init();
151 screen
->lowmem_bindings
= PIPE_BIND_GLOBAL
; /* gallium limit */
152 screen
->vidmem_bindings
=
153 PIPE_BIND_RENDER_TARGET
| PIPE_BIND_DEPTH_STENCIL
|
154 PIPE_BIND_DISPLAY_TARGET
| PIPE_BIND_SCANOUT
| PIPE_BIND_CURSOR
|
155 PIPE_BIND_SAMPLER_VIEW
|
156 PIPE_BIND_SHADER_RESOURCE
| PIPE_BIND_COMPUTE_RESOURCE
|
158 screen
->sysmem_bindings
=
159 PIPE_BIND_SAMPLER_VIEW
| PIPE_BIND_STREAM_OUTPUT
;
161 memset(&mm_config
, 0, sizeof(mm_config
));
163 screen
->mm_GART
= nouveau_mm_create(dev
,
164 NOUVEAU_BO_GART
| NOUVEAU_BO_MAP
,
166 screen
->mm_VRAM
= nouveau_mm_create(dev
, NOUVEAU_BO_VRAM
, &mm_config
);
171 nouveau_screen_fini(struct nouveau_screen
*screen
)
173 nouveau_mm_destroy(screen
->mm_GART
);
174 nouveau_mm_destroy(screen
->mm_VRAM
);
176 nouveau_pushbuf_del(&screen
->pushbuf
);
178 nouveau_client_del(&screen
->client
);
179 nouveau_object_del(&screen
->channel
);
181 nouveau_device_del(&screen
->device
);