• Home
  • Raw
  • Download

Lines Matching refs:bo

33 void bo_del(struct fd_bo *bo);
37 set_name(struct fd_bo *bo, uint32_t name) in set_name() argument
39 bo->name = name; in set_name()
41 _mesa_hash_table_insert(bo->dev->name_table, &bo->name, bo); in set_name()
48 struct fd_bo *bo = NULL; in lookup_bo() local
52 bo = fd_bo_ref(entry->data); in lookup_bo()
55 list_delinit(&bo->list); in lookup_bo()
57 return bo; in lookup_bo()
61 fd_bo_init_common(struct fd_bo *bo, struct fd_device *dev) in fd_bo_init_common() argument
64 assert(bo->size); in fd_bo_init_common()
65 assert(bo->handle); in fd_bo_init_common()
67 bo->dev = dev; in fd_bo_init_common()
68 bo->iova = bo->funcs->iova(bo); in fd_bo_init_common()
69 bo->reloc_flags = FD_RELOC_FLAGS_INIT; in fd_bo_init_common()
71 p_atomic_set(&bo->refcnt, 1); in fd_bo_init_common()
72 list_inithead(&bo->list); in fd_bo_init_common()
79 struct fd_bo *bo; in bo_from_handle() local
83 bo = dev->funcs->bo_from_handle(dev, size, handle); in bo_from_handle()
84 if (!bo) { in bo_from_handle()
93 _mesa_hash_table_insert(dev->handle_table, &bo->handle, bo); in bo_from_handle()
95 return bo; in bo_from_handle()
102 struct fd_bo *bo = NULL; in bo_new() local
108 bo = fd_bo_cache_alloc(cache, &size, flags); in bo_new()
109 if (bo) in bo_new()
110 return bo; in bo_new()
112 bo = dev->funcs->bo_new(dev, size, flags); in bo_new()
113 if (!bo) in bo_new()
118 _mesa_hash_table_insert(dev->handle_table, &bo->handle, bo); in bo_new()
121 bo->alloc_flags = flags; in bo_new()
122 bo->max_fences = 1; in bo_new()
123 bo->fences = &bo->_inline_fence; in bo_new()
125 VG_BO_ALLOC(bo); in bo_new()
127 return bo; in bo_new()
133 struct fd_bo *bo = bo_new(dev, size, flags, &dev->bo_cache); in _fd_bo_new() local
134 if (bo) in _fd_bo_new()
135 bo->bo_reuse = BO_CACHE; in _fd_bo_new()
136 return bo; in _fd_bo_new()
140 _fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap) in _fd_bo_set_name() argument
142 bo->funcs->set_name(bo, fmt, ap); in _fd_bo_set_name()
154 struct fd_bo *bo = bo_new(dev, size, flags, &dev->ring_cache); in fd_bo_new_ring() local
155 if (bo) { in fd_bo_new_ring()
156 bo->bo_reuse = RING_CACHE; in fd_bo_new_ring()
157 bo->reloc_flags |= FD_RELOC_DUMP; in fd_bo_new_ring()
158 fd_bo_set_name(bo, "cmdstream"); in fd_bo_new_ring()
160 return bo; in fd_bo_new_ring()
166 struct fd_bo *bo = NULL; in fd_bo_from_handle() local
170 bo = lookup_bo(dev->handle_table, handle); in fd_bo_from_handle()
171 if (bo) in fd_bo_from_handle()
174 bo = bo_from_handle(dev, size, handle); in fd_bo_from_handle()
176 VG_BO_ALLOC(bo); in fd_bo_from_handle()
181 return bo; in fd_bo_from_handle()
189 struct fd_bo *bo; in fd_bo_from_dmabuf() local
198 bo = lookup_bo(dev->handle_table, handle); in fd_bo_from_dmabuf()
199 if (bo) in fd_bo_from_dmabuf()
206 bo = bo_from_handle(dev, size, handle); in fd_bo_from_dmabuf()
208 VG_BO_ALLOC(bo); in fd_bo_from_dmabuf()
213 return bo; in fd_bo_from_dmabuf()
222 struct fd_bo *bo; in fd_bo_from_name() local
227 bo = lookup_bo(dev->name_table, name); in fd_bo_from_name()
228 if (bo) in fd_bo_from_name()
236 bo = lookup_bo(dev->handle_table, req.handle); in fd_bo_from_name()
237 if (bo) in fd_bo_from_name()
240 bo = bo_from_handle(dev, req.size, req.handle); in fd_bo_from_name()
241 if (bo) { in fd_bo_from_name()
242 set_name(bo, name); in fd_bo_from_name()
243 VG_BO_ALLOC(bo); in fd_bo_from_name()
249 return bo; in fd_bo_from_name()
253 fd_bo_mark_for_dump(struct fd_bo *bo) in fd_bo_mark_for_dump() argument
255 bo->reloc_flags |= FD_RELOC_DUMP; in fd_bo_mark_for_dump()
259 fd_bo_get_iova(struct fd_bo *bo) in fd_bo_get_iova() argument
262 assert(bo->iova != 0); in fd_bo_get_iova()
263 return bo->iova; in fd_bo_get_iova()
267 fd_bo_ref(struct fd_bo *bo) in fd_bo_ref() argument
269 p_atomic_inc(&bo->refcnt); in fd_bo_ref()
270 return bo; in fd_bo_ref()
274 bo_del_or_recycle(struct fd_bo *bo) in bo_del_or_recycle() argument
276 struct fd_device *dev = bo->dev; in bo_del_or_recycle()
280 if ((bo->bo_reuse == BO_CACHE) && in bo_del_or_recycle()
281 (fd_bo_cache_free(&dev->bo_cache, bo) == 0)) in bo_del_or_recycle()
284 if ((bo->bo_reuse == RING_CACHE) && in bo_del_or_recycle()
285 (fd_bo_cache_free(&dev->ring_cache, bo) == 0)) in bo_del_or_recycle()
288 bo_del(bo); in bo_del_or_recycle()
292 fd_bo_del_locked(struct fd_bo *bo) in fd_bo_del_locked() argument
296 if (!p_atomic_dec_zero(&bo->refcnt)) in fd_bo_del_locked()
299 bo_del_or_recycle(bo); in fd_bo_del_locked()
303 fd_bo_del(struct fd_bo *bo) in fd_bo_del() argument
305 if (!p_atomic_dec_zero(&bo->refcnt)) in fd_bo_del()
309 bo_del_or_recycle(bo); in fd_bo_del()
321 cleanup_fences(struct fd_bo *bo, bool expired) in cleanup_fences() argument
325 for (int i = 0; i < bo->nr_fences; i++) { in cleanup_fences()
326 struct fd_bo_fence *f = &bo->fences[i]; in cleanup_fences()
333 bo->nr_fences--; in cleanup_fences()
335 if (bo->nr_fences > 0) { in cleanup_fences()
337 bo->fences[i] = bo->fences[bo->nr_fences]; in cleanup_fences()
347 bo_del(struct fd_bo *bo) in bo_del() argument
349 struct fd_device *dev = bo->dev; in bo_del()
350 uint32_t handle = bo->handle; in bo_del()
352 VG_BO_FREE(bo); in bo_del()
356 cleanup_fences(bo, false); in bo_del()
357 if (bo->fences != &bo->_inline_fence) in bo_del()
358 free(bo->fences); in bo_del()
360 if (bo->map) in bo_del()
361 os_munmap(bo->map, bo->size); in bo_del()
365 if (bo->name) in bo_del()
366 _mesa_hash_table_remove_key(dev->name_table, &bo->name); in bo_del()
369 bo->funcs->destroy(bo); in bo_del()
380 bo_flush(struct fd_bo *bo) in bo_flush() argument
382 for (int i = 0; i < bo->nr_fences; i++) { in bo_flush()
383 struct fd_bo_fence *f = &bo->fences[i]; in bo_flush()
389 fd_bo_get_name(struct fd_bo *bo, uint32_t *name) in fd_bo_get_name() argument
391 if (!bo->name) { in fd_bo_get_name()
393 .handle = bo->handle, in fd_bo_get_name()
397 ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_FLINK, &req); in fd_bo_get_name()
403 set_name(bo, req.name); in fd_bo_get_name()
405 bo->bo_reuse = NO_CACHE; in fd_bo_get_name()
406 bo->shared = true; in fd_bo_get_name()
407 bo_flush(bo); in fd_bo_get_name()
410 *name = bo->name; in fd_bo_get_name()
416 fd_bo_handle(struct fd_bo *bo) in fd_bo_handle() argument
418 bo->bo_reuse = NO_CACHE; in fd_bo_handle()
419 bo->shared = true; in fd_bo_handle()
420 bo_flush(bo); in fd_bo_handle()
421 return bo->handle; in fd_bo_handle()
425 fd_bo_dmabuf(struct fd_bo *bo) in fd_bo_dmabuf() argument
429 ret = drmPrimeHandleToFD(bo->dev->fd, bo->handle, DRM_CLOEXEC | DRM_RDWR, in fd_bo_dmabuf()
436 bo->bo_reuse = NO_CACHE; in fd_bo_dmabuf()
437 bo->shared = true; in fd_bo_dmabuf()
438 bo_flush(bo); in fd_bo_dmabuf()
444 fd_bo_size(struct fd_bo *bo) in fd_bo_size() argument
446 return bo->size; in fd_bo_size()
450 fd_bo_is_cached(struct fd_bo *bo) in fd_bo_is_cached() argument
452 return !!(bo->alloc_flags & FD_BO_CACHED_COHERENT); in fd_bo_is_cached()
456 bo_map(struct fd_bo *bo) in bo_map() argument
458 if (!bo->map) { in bo_map()
462 ret = bo->funcs->offset(bo, &offset); in bo_map()
467 bo->map = os_mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, in bo_map()
468 bo->dev->fd, offset); in bo_map()
469 if (bo->map == MAP_FAILED) { in bo_map()
471 bo->map = NULL; in bo_map()
474 return bo->map; in bo_map()
478 fd_bo_map(struct fd_bo *bo) in fd_bo_map() argument
483 if (bo->alloc_flags & FD_BO_NOMAP) in fd_bo_map()
486 return bo_map(bo); in fd_bo_map()
490 fd_bo_upload(struct fd_bo *bo, void *src, unsigned len) in fd_bo_upload() argument
492 if (bo->funcs->upload) { in fd_bo_upload()
493 bo->funcs->upload(bo, src, len); in fd_bo_upload()
497 memcpy(bo_map(bo), src, len); in fd_bo_upload()
502 fd_bo_cpu_prep(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t op) in fd_bo_cpu_prep() argument
505 enum fd_bo_state state = fd_bo_state(bo); in fd_bo_cpu_prep()
513 bo_flush(bo); in fd_bo_cpu_prep()
527 bo_flush(bo); in fd_bo_cpu_prep()
532 return bo->funcs->cpu_prep(bo, pipe, op & ~FD_BO_PREP_FLUSH); in fd_bo_cpu_prep()
536 fd_bo_cpu_fini(struct fd_bo *bo) in fd_bo_cpu_fini() argument
545 fd_bo_add_fence(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t fence) in fd_bo_add_fence() argument
549 if (bo->nosync) in fd_bo_add_fence()
555 for (int i = 0; i < bo->nr_fences; i++) { in fd_bo_add_fence()
556 struct fd_bo_fence *f = &bo->fences[i]; in fd_bo_add_fence()
564 cleanup_fences(bo, true); in fd_bo_add_fence()
570 if (unlikely((bo->nr_fences == 1) && in fd_bo_add_fence()
571 (bo->fences == &bo->_inline_fence))) { in fd_bo_add_fence()
572 bo->nr_fences = bo->max_fences = 0; in fd_bo_add_fence()
573 bo->fences = NULL; in fd_bo_add_fence()
574 APPEND(bo, fences, bo->_inline_fence); in fd_bo_add_fence()
577 APPEND(bo, fences, (struct fd_bo_fence){ in fd_bo_add_fence()
584 fd_bo_state(struct fd_bo *bo) in fd_bo_state() argument
588 cleanup_fences(bo, true); in fd_bo_state()
590 if (bo->shared || bo->nosync) in fd_bo_state()
593 if (!bo->nr_fences) in fd_bo_state()