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"
11 #include "os/os_time.h"
17 #include <libdrm/nouveau_drm.h>
19 #include "nouveau_winsys.h"
20 #include "nouveau_screen.h"
21 #include "nouveau_fence.h"
22 #include "nouveau_mm.h"
23 #include "nouveau_buffer.h"
25 /* XXX this should go away */
26 #include "state_tracker/drm_driver.h"
28 int nouveau_mesa_debug
= 0;
31 nouveau_screen_get_name(struct pipe_screen
*pscreen
)
33 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
34 static char buffer
[128];
36 util_snprintf(buffer
, sizeof(buffer
), "NV%02X", dev
->chipset
);
41 nouveau_screen_get_vendor(struct pipe_screen
*pscreen
)
47 nouveau_screen_get_timestamp(struct pipe_screen
*pscreen
)
49 int64_t cpu_time
= os_time_get() * 1000;
51 /* getparam of PTIMER_TIME takes about x10 as long (several usecs) */
53 return cpu_time
+ nouveau_screen(pscreen
)->cpu_gpu_time_delta
;
57 nouveau_screen_fence_ref(struct pipe_screen
*pscreen
,
58 struct pipe_fence_handle
**ptr
,
59 struct pipe_fence_handle
*pfence
)
61 nouveau_fence_ref(nouveau_fence(pfence
), (struct nouveau_fence
**)ptr
);
65 nouveau_screen_fence_signalled(struct pipe_screen
*screen
,
66 struct pipe_fence_handle
*pfence
)
68 return nouveau_fence_signalled(nouveau_fence(pfence
));
72 nouveau_screen_fence_finish(struct pipe_screen
*screen
,
73 struct pipe_fence_handle
*pfence
,
76 return nouveau_fence_wait(nouveau_fence(pfence
));
81 nouveau_screen_bo_from_handle(struct pipe_screen
*pscreen
,
82 struct winsys_handle
*whandle
,
85 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
86 struct nouveau_bo
*bo
= 0;
89 ret
= nouveau_bo_name_ref(dev
, whandle
->handle
, &bo
);
91 debug_printf("%s: ref name 0x%08x failed with %d\n",
92 __FUNCTION__
, whandle
->handle
, ret
);
96 *out_stride
= whandle
->stride
;
102 nouveau_screen_bo_get_handle(struct pipe_screen
*pscreen
,
103 struct nouveau_bo
*bo
,
105 struct winsys_handle
*whandle
)
107 whandle
->stride
= stride
;
109 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
110 return nouveau_bo_name_get(bo
, &whandle
->handle
) == 0;
111 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
112 whandle
->handle
= bo
->handle
;
120 nouveau_screen_init(struct nouveau_screen
*screen
, struct nouveau_device
*dev
)
122 struct pipe_screen
*pscreen
= &screen
->base
;
123 struct nv04_fifo nv04_data
= { .vram
= 0xbeef0201, .gart
= 0xbeef0202 };
124 struct nvc0_fifo nvc0_data
= { };
128 union nouveau_bo_config mm_config
;
130 char *nv_dbg
= getenv("NOUVEAU_MESA_DEBUG");
132 nouveau_mesa_debug
= atoi(nv_dbg
);
134 if (dev
->chipset
< 0xc0) {
136 size
= sizeof(nv04_data
);
139 size
= sizeof(nvc0_data
);
142 ret
= nouveau_object_new(&dev
->object
, 0, NOUVEAU_FIFO_CHANNEL_CLASS
,
143 data
, size
, &screen
->channel
);
146 screen
->device
= dev
;
148 ret
= nouveau_client_new(screen
->device
, &screen
->client
);
151 ret
= nouveau_pushbuf_new(screen
->client
, screen
->channel
,
157 /* getting CPU time first appears to be more accurate */
158 screen
->cpu_gpu_time_delta
= os_time_get();
160 ret
= nouveau_getparam(dev
, NOUVEAU_GETPARAM_PTIMER_TIME
, &time
);
162 screen
->cpu_gpu_time_delta
= time
- screen
->cpu_gpu_time_delta
* 1000;
164 pscreen
->get_name
= nouveau_screen_get_name
;
165 pscreen
->get_vendor
= nouveau_screen_get_vendor
;
167 pscreen
->get_timestamp
= nouveau_screen_get_timestamp
;
169 pscreen
->fence_reference
= nouveau_screen_fence_ref
;
170 pscreen
->fence_signalled
= nouveau_screen_fence_signalled
;
171 pscreen
->fence_finish
= nouveau_screen_fence_finish
;
173 util_format_s3tc_init();
175 screen
->lowmem_bindings
= PIPE_BIND_GLOBAL
; /* gallium limit */
176 screen
->vidmem_bindings
=
177 PIPE_BIND_RENDER_TARGET
| PIPE_BIND_DEPTH_STENCIL
|
178 PIPE_BIND_DISPLAY_TARGET
| PIPE_BIND_SCANOUT
| PIPE_BIND_CURSOR
|
179 PIPE_BIND_SAMPLER_VIEW
|
180 PIPE_BIND_SHADER_RESOURCE
| PIPE_BIND_COMPUTE_RESOURCE
|
182 screen
->sysmem_bindings
=
183 PIPE_BIND_SAMPLER_VIEW
| PIPE_BIND_STREAM_OUTPUT
;
185 memset(&mm_config
, 0, sizeof(mm_config
));
187 screen
->mm_GART
= nouveau_mm_create(dev
,
188 NOUVEAU_BO_GART
| NOUVEAU_BO_MAP
,
190 screen
->mm_VRAM
= nouveau_mm_create(dev
, NOUVEAU_BO_VRAM
, &mm_config
);
195 nouveau_screen_fini(struct nouveau_screen
*screen
)
197 nouveau_mm_destroy(screen
->mm_GART
);
198 nouveau_mm_destroy(screen
->mm_VRAM
);
200 nouveau_pushbuf_del(&screen
->pushbuf
);
202 nouveau_client_del(&screen
->client
);
203 nouveau_object_del(&screen
->channel
);
205 nouveau_device_del(&screen
->device
);