nouveau_screen.c revision b39bccbd4ed71e9585da4cf5acf7b887b2e90899
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 113584a44270a7f3a04e187bd79b5373314514d383Dave Airlie#include <stdio.h> 12625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs#include <errno.h> 13625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs 14bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau/nouveau_bo.h" 15bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_winsys.h" 16bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_screen.h" 175a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "nouveau_fence.h" 18bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 193bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz/* XXX this should go away */ 209ca563a9a8573bf79821abc75ccf0fdade19c8a9Jakob Bornecrantz#include "state_tracker/drm_driver.h" 21287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_simple_screen.h" 223bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 23bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char * 24bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_name(struct pipe_screen *pscreen) 25bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 26bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct nouveau_device *dev = nouveau_screen(pscreen)->device; 27bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs static char buffer[128]; 28bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 2937648b86b1fefd37dc285486cfb18969eeaa8df1Vinson Lee util_snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset); 30bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return buffer; 31bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 32bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 33bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char * 34bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_vendor(struct pipe_screen *pscreen) 35bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 36bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return "nouveau"; 37bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 38bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 39bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 40bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 41287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo * 42bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_bo_new(struct pipe_screen *pscreen, unsigned alignment, 43287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned usage, unsigned bind, unsigned size) 44bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 45bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct nouveau_device *dev = nouveau_screen(pscreen)->device; 46bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct nouveau_bo *bo = NULL; 476af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs uint32_t flags = NOUVEAU_BO_MAP, tile_mode = 0, tile_flags = 0; 48bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs int ret; 49bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 5042d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri if (bind & PIPE_BIND_VERTEX_BUFFER) 5142d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri flags |= nouveau_screen(pscreen)->vertex_buffer_flags; 5242d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri else if (bind & PIPE_BIND_INDEX_BUFFER) 5342d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri flags |= nouveau_screen(pscreen)->index_buffer_flags; 54bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 55287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (bind & (PIPE_BIND_RENDER_TARGET | 56287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_DEPTH_STENCIL | 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SCANOUT | 58287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_DISPLAY_TARGET | 59287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW)) 60287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell { 61287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell /* TODO: this may be incorrect or suboptimal */ 62287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!(bind & PIPE_BIND_SCANOUT)) 63bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs flags |= NOUVEAU_BO_GART; 64287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (usage != PIPE_USAGE_DYNAMIC) 65bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs flags |= NOUVEAU_BO_VRAM; 66bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 67bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (dev->chipset == 0x50 || dev->chipset >= 0x80) { 68287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (bind & PIPE_BIND_DEPTH_STENCIL) 696af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs tile_flags = 0x2800; 706af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs else 716af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs tile_flags = 0x7000; 72bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 73bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 74bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 756af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs ret = nouveau_bo_new_tile(dev, flags, alignment, size, 766af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs tile_mode, tile_flags, &bo); 77bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (ret) 78bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return NULL; 79bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 80287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return bo; 81bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 82bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 83287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo * 84bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_bo_user(struct pipe_screen *pscreen, void *ptr, unsigned bytes) 85bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 86bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct nouveau_device *dev = nouveau_screen(pscreen)->device; 87bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct nouveau_bo *bo = NULL; 88bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs int ret; 89bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 90bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs ret = nouveau_bo_user(dev, ptr, bytes, &bo); 91bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (ret) 92bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return NULL; 93bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 94287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return bo; 95bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 96bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid * 98287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map(struct pipe_screen *pscreen, 99287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct nouveau_bo *bo, 100287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned map_flags) 101bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 102bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs int ret; 103bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ret = nouveau_bo_map(bo, map_flags); 105bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (ret) { 106bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs debug_printf("map failed: %d\n", ret); 107bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return NULL; 108bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 109bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 110bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return bo->map; 111bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 112bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 113287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid * 114287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map_range(struct pipe_screen *pscreen, struct nouveau_bo *bo, 115287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned offset, unsigned length, unsigned flags) 116bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 117bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs int ret; 118bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 119625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs ret = nouveau_bo_map_range(bo, offset, length, flags); 120bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (ret) { 121c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis nouveau_bo_unmap(bo); 122625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs if (!(flags & NOUVEAU_BO_NOWAIT) || ret != -EBUSY) 123625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs debug_printf("map_range failed: %d\n", ret); 124bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return NULL; 125bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 126bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 12736705ee044681da9899d0950c22ae7baa10c3d33Ben Skeggs return (char *)bo->map - offset; /* why gallium? why? */ 128bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 129bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 130287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid 131287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map_flush_range(struct pipe_screen *pscreen, struct nouveau_bo *bo, 132287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned offset, unsigned length) 133bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 134bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs nouveau_bo_map_flush(bo, offset, length); 135bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 136bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 137287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid 138287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_unmap(struct pipe_screen *pscreen, struct nouveau_bo *bo) 139bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 140bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs nouveau_bo_unmap(bo); 141bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 142bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 143287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid 144287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_release(struct pipe_screen *pscreen, struct nouveau_bo *bo) 145bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 146bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs nouveau_bo_ref(NULL, &bo); 147bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 148bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 149bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic void 150bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_ref(struct pipe_screen *pscreen, 151bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct pipe_fence_handle **ptr, 152bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct pipe_fence_handle *pfence) 153bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 1545a0915870c7e994d20334042b7647db749e79224Ben Skeggs nouveau_fence_ref(nouveau_fence(pfence), (struct nouveau_fence **)ptr); 155bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 156bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 157bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic int 158bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_signalled(struct pipe_screen *screen, 159bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct pipe_fence_handle *pfence, 160bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs unsigned flags) 161bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 1625a0915870c7e994d20334042b7647db749e79224Ben Skeggs return !nouveau_fence_signalled(nouveau_fence(pfence)); 163bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 164bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 165bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic int 166bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_finish(struct pipe_screen *screen, 167bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct pipe_fence_handle *pfence, 168b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák unsigned flags, 169b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák uint64_t timeout) 170bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 1715a0915870c7e994d20334042b7647db749e79224Ben Skeggs return !nouveau_fence_wait(nouveau_fence(pfence)); 172bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 173bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 1743bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 175287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo * 176287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_from_handle(struct pipe_screen *pscreen, 177287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle, 178287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned *out_stride) 1793bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz{ 1803bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz struct nouveau_device *dev = nouveau_screen(pscreen)->device; 181287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct nouveau_bo *bo = 0; 1823bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz int ret; 183287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ret = nouveau_bo_handle_ref(dev, whandle->handle, &bo); 1853bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz if (ret) { 1863bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz debug_printf("%s: ref name 0x%08x failed with %d\n", 187b5fcab976f702912bfb0edc8c67a8d07e0dfdcb0Vinson Lee __FUNCTION__, whandle->handle, ret); 1883bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz return NULL; 1893bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz } 1903bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 191287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell *out_stride = whandle->stride; 192287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return bo; 1933bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz} 1943bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 1953bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 196287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellboolean 197287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_get_handle(struct pipe_screen *pscreen, 198287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct nouveau_bo *bo, 199287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned stride, 200287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct winsys_handle *whandle) 201287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 202287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell whandle->stride = stride; 2033bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 2043bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) { 205287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return nouveau_bo_handle_get(bo, &whandle->handle) == 0; 2063bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) { 207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell whandle->handle = bo->handle; 2083bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz return TRUE; 2093bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz } else { 2103bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz return FALSE; 2113bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz } 2123bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz} 2133bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz 214287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellunsigned int 216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_reference_flags(struct nouveau_bo *bo) 217287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{ 218287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell uint32_t bo_flags; 219287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell int flags = 0; 220287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 221287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell bo_flags = nouveau_bo_pending(bo); 222287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (bo_flags & NOUVEAU_BO_RD) 223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell flags |= PIPE_REFERENCED_FOR_READ; 224287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (bo_flags & NOUVEAU_BO_WR) 225287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell flags |= PIPE_REFERENCED_FOR_WRITE; 226287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 227287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return flags; 228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell} 229287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 230287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 231287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 232287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 233287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 234bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsint 235bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev) 236bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 237bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs struct pipe_screen *pscreen = &screen->base; 23880e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs int ret; 239bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 24080e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs ret = nouveau_channel_alloc(dev, 0xbeef0201, 0xbeef0202, 241c25fcf5aa5beccd7731706b8f85682170a2eca56Francisco Jerez 512*1024, &screen->channel); 24280e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs if (ret) 24380e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs return ret; 244bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs screen->device = dev; 245bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 246bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pscreen->get_name = nouveau_screen_get_name; 247bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pscreen->get_vendor = nouveau_screen_get_vendor; 248bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 249bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pscreen->fence_reference = nouveau_screen_fence_ref; 250bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pscreen->fence_signalled = nouveau_screen_fence_signalled; 251bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pscreen->fence_finish = nouveau_screen_fence_finish; 252bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 2536ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry util_format_s3tc_init(); 2546ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry 255cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs screen->mm_GART = nouveau_mm_create(dev, 256cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 257cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs 0x000); 258cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs screen->mm_VRAM = nouveau_mm_create(dev, NOUVEAU_BO_VRAM, 0x000); 259bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return 0; 260bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 261bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 262bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsvoid 263bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fini(struct nouveau_screen *screen) 264bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 265283b21d02bff3d4bd6127f6b642331e06db41aceMarcin Slusarz struct pipe_winsys *ws = screen->base.winsys; 266cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs 267cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs nouveau_mm_destroy(screen->mm_GART); 268cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs nouveau_mm_destroy(screen->mm_VRAM); 269cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs 27085dcc070719ef6a6bcf65dc4996b1733f63912d8Younes Manton nouveau_channel_free(&screen->channel); 271cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs 272a49167c1c03dab9452165f503251e543dec2be9aMarcin Slusarz if (ws) 273a49167c1c03dab9452165f503251e543dec2be9aMarcin Slusarz ws->destroy(ws); 274bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 275bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 276