15ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_defines.h"
25ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_screen.h"
35ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_state.h"
4bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
55ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "util/u_memory.h"
65ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "util/u_inlines.h"
73bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz#include "util/u_format.h"
86ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry#include "util/u_format_s3tc.h"
937648b86b1fefd37dc285486cfb18969eeaa8df1Vinson Lee#include "util/u_string.h"
10bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
119ed65301e044711de0db51b4986085fca170d764Christoph Bumiller#include "os/os_time.h"
129ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
133584a44270a7f3a04e187bd79b5373314514d383Dave Airlie#include <stdio.h>
14625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs#include <errno.h>
1590dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz#include <stdlib.h>
16625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs
179ed65301e044711de0db51b4986085fca170d764Christoph Bumiller#include <libdrm/nouveau_drm.h>
189ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
19bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_winsys.h"
20bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_screen.h"
215a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "nouveau_fence.h"
226d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller#include "nouveau_mm.h"
236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller#include "nouveau_buffer.h"
24bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
253bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz/* XXX this should go away */
269ca563a9a8573bf79821abc75ccf0fdade19c8a9Jakob Bornecrantz#include "state_tracker/drm_driver.h"
273bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
2890dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarzint nouveau_mesa_debug = 0;
2990dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz
30bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char *
31bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_name(struct pipe_screen *pscreen)
32bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
33bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
34bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	static char buffer[128];
35bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
3637648b86b1fefd37dc285486cfb18969eeaa8df1Vinson Lee	util_snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
37bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return buffer;
38bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
39bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
40bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char *
41bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_vendor(struct pipe_screen *pscreen)
42bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
43bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return "nouveau";
44bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
45bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
469ed65301e044711de0db51b4986085fca170d764Christoph Bumillerstatic uint64_t
479ed65301e044711de0db51b4986085fca170d764Christoph Bumillernouveau_screen_get_timestamp(struct pipe_screen *pscreen)
489ed65301e044711de0db51b4986085fca170d764Christoph Bumiller{
499ed65301e044711de0db51b4986085fca170d764Christoph Bumiller	int64_t cpu_time = os_time_get() * 1000;
509ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
519ed65301e044711de0db51b4986085fca170d764Christoph Bumiller        /* getparam of PTIMER_TIME takes about x10 as long (several usecs) */
529ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
539ed65301e044711de0db51b4986085fca170d764Christoph Bumiller	return cpu_time + nouveau_screen(pscreen)->cpu_gpu_time_delta;
549ed65301e044711de0db51b4986085fca170d764Christoph Bumiller}
559ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
56bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic void
57bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_ref(struct pipe_screen *pscreen,
58bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			 struct pipe_fence_handle **ptr,
59bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			 struct pipe_fence_handle *pfence)
60bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
615a0915870c7e994d20334042b7647db749e79224Ben Skeggs	nouveau_fence_ref(nouveau_fence(pfence), (struct nouveau_fence **)ptr);
62bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
63bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
64bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
65bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_signalled(struct pipe_screen *screen,
66bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák                               struct pipe_fence_handle *pfence)
67bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
68bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák        return nouveau_fence_signalled(nouveau_fence(pfence));
69bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
70bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
71bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
72bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_finish(struct pipe_screen *screen,
73bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			    struct pipe_fence_handle *pfence,
74b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                            uint64_t timeout)
75bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
766d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	return nouveau_fence_wait(nouveau_fence(pfence));
77bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
78bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
793bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
80287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo *
81287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
82287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			      struct winsys_handle *whandle,
83287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			      unsigned *out_stride)
843bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz{
853bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
86287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	struct nouveau_bo *bo = 0;
873bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	int ret;
88287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	ret = nouveau_bo_name_ref(dev, whandle->handle, &bo);
903bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	if (ret) {
913bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		debug_printf("%s: ref name 0x%08x failed with %d\n",
92b5fcab976f702912bfb0edc8c67a8d07e0dfdcb0Vinson Lee			     __FUNCTION__, whandle->handle, ret);
933bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return NULL;
943bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	}
953bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
96287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	*out_stride = whandle->stride;
97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	return bo;
983bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz}
993bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
1003bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
101287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellboolean
102287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
103287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     struct nouveau_bo *bo,
104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     unsigned stride,
105287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     struct winsys_handle *whandle)
106287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
107287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	whandle->stride = stride;
1083bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
1093bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
1106d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		return nouveau_bo_name_get(bo, &whandle->handle) == 0;
1113bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	} else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
112287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		whandle->handle = bo->handle;
1133bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return TRUE;
1143bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	} else {
1153bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return FALSE;
1163bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	}
1173bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz}
1183bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
119bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsint
120bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)
121bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
122bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct pipe_screen *pscreen = &screen->base;
1236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	struct nv04_fifo nv04_data = { .vram = 0xbeef0201, .gart = 0xbeef0202 };
1246d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	struct nvc0_fifo nvc0_data = { };
1259ed65301e044711de0db51b4986085fca170d764Christoph Bumiller	uint64_t time;
1266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	int size, ret;
1276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	void *data;
1286d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	union nouveau_bo_config mm_config;
129bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
13090dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz	char *nv_dbg = getenv("NOUVEAU_MESA_DEBUG");
13190dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz	if (nv_dbg)
13290dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz	   nouveau_mesa_debug = atoi(nv_dbg);
13390dcd6c89ab4afa55ca19d572a1a695cf55cb1b2Marcin Slusarz
1346d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	if (dev->chipset < 0xc0) {
1356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		data = &nv04_data;
1366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		size = sizeof(nv04_data);
1376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	} else {
1386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		data = &nvc0_data;
1396d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		size = sizeof(nvc0_data);
1406d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	}
1416d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
1426d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	ret = nouveau_object_new(&dev->object, 0, NOUVEAU_FIFO_CHANNEL_CLASS,
1436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller				 data, size, &screen->channel);
14480e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	if (ret)
14580e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs		return ret;
146bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	screen->device = dev;
147bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
1486d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	ret = nouveau_client_new(screen->device, &screen->client);
1496d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	if (ret)
1506d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		return ret;
1516d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	ret = nouveau_pushbuf_new(screen->client, screen->channel,
1526d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller				  4, 512 * 1024, 1,
1536d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller				  &screen->pushbuf);
1546d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	if (ret)
1556d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller		return ret;
1566d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
1579ed65301e044711de0db51b4986085fca170d764Christoph Bumiller        /* getting CPU time first appears to be more accurate */
1589ed65301e044711de0db51b4986085fca170d764Christoph Bumiller        screen->cpu_gpu_time_delta = os_time_get();
1599ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
1609ed65301e044711de0db51b4986085fca170d764Christoph Bumiller        ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_PTIMER_TIME, &time);
1619ed65301e044711de0db51b4986085fca170d764Christoph Bumiller        if (!ret)
1629ed65301e044711de0db51b4986085fca170d764Christoph Bumiller           screen->cpu_gpu_time_delta = time - screen->cpu_gpu_time_delta * 1000;
1639ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
164bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->get_name = nouveau_screen_get_name;
165bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->get_vendor = nouveau_screen_get_vendor;
166bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
1679ed65301e044711de0db51b4986085fca170d764Christoph Bumiller	pscreen->get_timestamp = nouveau_screen_get_timestamp;
1689ed65301e044711de0db51b4986085fca170d764Christoph Bumiller
169bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_reference = nouveau_screen_fence_ref;
170bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_signalled = nouveau_screen_fence_signalled;
171bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_finish = nouveau_screen_fence_finish;
172bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
1736ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry	util_format_s3tc_init();
1746ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry
1751befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller	screen->lowmem_bindings = PIPE_BIND_GLOBAL; /* gallium limit */
1761befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller	screen->vidmem_bindings =
1771befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_RENDER_TARGET | PIPE_BIND_DEPTH_STENCIL |
1781befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_CURSOR |
1791befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_SAMPLER_VIEW |
1801befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_SHADER_RESOURCE | PIPE_BIND_COMPUTE_RESOURCE |
1811befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_GLOBAL;
1821befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller	screen->sysmem_bindings =
1831befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller		PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_STREAM_OUTPUT;
1841befacc7647f51344f5cfbfa86b62e53625a436fChristoph Bumiller
1856d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	memset(&mm_config, 0, sizeof(mm_config));
1866d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
187cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	screen->mm_GART = nouveau_mm_create(dev,
188cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs					    NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
1896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller					    &mm_config);
1906d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	screen->mm_VRAM = nouveau_mm_create(dev, NOUVEAU_BO_VRAM, &mm_config);
191bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return 0;
192bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
193bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
194bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsvoid
195bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fini(struct nouveau_screen *screen)
196bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
197cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	nouveau_mm_destroy(screen->mm_GART);
198cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	nouveau_mm_destroy(screen->mm_VRAM);
199cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs
2006d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	nouveau_pushbuf_del(&screen->pushbuf);
201cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs
2026d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	nouveau_client_del(&screen->client);
2036d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	nouveau_object_del(&screen->channel);
204bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
2056d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller	nouveau_device_del(&screen->device);
2066d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller}
207