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