• Home
  • Raw
  • Download

Lines Matching refs:bo

173 static int bo_set_tiling_internal(struct crocus_bo *bo, uint32_t tiling_mode,
176 static void bo_free(struct crocus_bo *bo);
194 struct crocus_bo *bo = entry ? entry->data : NULL; in find_and_ref_external_bo() local
196 if (bo) { in find_and_ref_external_bo()
197 assert(bo->external); in find_and_ref_external_bo()
198 assert(!bo->reusable); in find_and_ref_external_bo()
205 if (bo->head.prev || bo->head.next) in find_and_ref_external_bo()
206 list_del(&bo->head); in find_and_ref_external_bo()
208 crocus_bo_reference(bo); in find_and_ref_external_bo()
211 return bo; in find_and_ref_external_bo()
256 crocus_bo_busy(struct crocus_bo *bo) in crocus_bo_busy() argument
258 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_busy()
259 struct drm_i915_gem_busy busy = { .handle = bo->gem_handle }; in crocus_bo_busy()
263 bo->idle = !busy.busy; in crocus_bo_busy()
270 crocus_bo_madvise(struct crocus_bo *bo, int state) in crocus_bo_madvise() argument
273 .handle = bo->gem_handle, in crocus_bo_madvise()
278 intel_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv); in crocus_bo_madvise()
286 struct crocus_bo *bo = calloc(1, sizeof(*bo)); in bo_calloc() local
287 if (!bo) in bo_calloc()
290 list_inithead(&bo->exports); in bo_calloc()
291 bo->hash = _mesa_hash_pointer(bo); in bo_calloc()
292 return bo; in bo_calloc()
304 struct crocus_bo *bo = NULL; in alloc_bo_from_cache() local
318 bo = cur; in alloc_bo_from_cache()
326 if (!bo) in alloc_bo_from_cache()
333 void *map = crocus_bo_map(NULL, bo, MAP_WRITE | MAP_RAW); in alloc_bo_from_cache()
335 memset(map, 0, bo->size); in alloc_bo_from_cache()
337 bo_free(bo); in alloc_bo_from_cache()
342 return bo; in alloc_bo_from_cache()
348 struct crocus_bo *bo = bo_calloc(); in alloc_fresh_bo() local
349 if (!bo) in alloc_fresh_bo()
358 free(bo); in alloc_fresh_bo()
362 bo->gem_handle = create.handle; in alloc_fresh_bo()
363 bo->bufmgr = bufmgr; in alloc_fresh_bo()
364 bo->size = bo_size; in alloc_fresh_bo()
365 bo->idle = true; in alloc_fresh_bo()
366 bo->tiling_mode = I915_TILING_NONE; in alloc_fresh_bo()
367 bo->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; in alloc_fresh_bo()
368 bo->stride = 0; in alloc_fresh_bo()
375 .handle = bo->gem_handle, in alloc_fresh_bo()
380 if (intel_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd) != 0) { in alloc_fresh_bo()
381 bo_free(bo); in alloc_fresh_bo()
385 return bo; in alloc_fresh_bo()
397 struct crocus_bo *bo; in bo_alloc_internal() local
412 bo = alloc_bo_from_cache(bufmgr, bucket, alignment, flags); in bo_alloc_internal()
416 if (!bo) { in bo_alloc_internal()
417 bo = alloc_fresh_bo(bufmgr, bo_size); in bo_alloc_internal()
418 if (!bo) in bo_alloc_internal()
422 if (bo_set_tiling_internal(bo, tiling_mode, stride)) in bo_alloc_internal()
425 bo->name = name; in bo_alloc_internal()
426 p_atomic_set(&bo->refcount, 1); in bo_alloc_internal()
427 bo->reusable = bucket && bufmgr->bo_reuse; in bo_alloc_internal()
428 bo->cache_coherent = bufmgr->has_llc; in bo_alloc_internal()
429 bo->index = -1; in bo_alloc_internal()
430 bo->kflags = 0; in bo_alloc_internal()
433 bo->scanout = 1; in bo_alloc_internal()
435 if ((flags & BO_ALLOC_COHERENT) && !bo->cache_coherent) { in bo_alloc_internal()
437 .handle = bo->gem_handle, in bo_alloc_internal()
441 bo->cache_coherent = true; in bo_alloc_internal()
442 bo->reusable = false; in bo_alloc_internal()
446 DBG("bo_create: buf %d (%s) %llub\n", bo->gem_handle, in bo_alloc_internal()
447 bo->name, (unsigned long long) size); in bo_alloc_internal()
449 return bo; in bo_alloc_internal()
452 bo_free(bo); in bo_alloc_internal()
478 struct crocus_bo *bo; in crocus_bo_create_userptr() local
480 bo = bo_calloc(); in crocus_bo_create_userptr()
481 if (!bo) in crocus_bo_create_userptr()
490 bo->gem_handle = arg.handle; in crocus_bo_create_userptr()
494 .handle = bo->gem_handle, in crocus_bo_create_userptr()
500 bo->name = name; in crocus_bo_create_userptr()
501 bo->size = size; in crocus_bo_create_userptr()
502 bo->map_cpu = ptr; in crocus_bo_create_userptr()
504 bo->bufmgr = bufmgr; in crocus_bo_create_userptr()
505 bo->kflags = 0; in crocus_bo_create_userptr()
507 p_atomic_set(&bo->refcount, 1); in crocus_bo_create_userptr()
508 bo->userptr = true; in crocus_bo_create_userptr()
509 bo->cache_coherent = true; in crocus_bo_create_userptr()
510 bo->index = -1; in crocus_bo_create_userptr()
511 bo->idle = true; in crocus_bo_create_userptr()
513 return bo; in crocus_bo_create_userptr()
516 intel_ioctl(bufmgr->fd, DRM_IOCTL_GEM_CLOSE, &bo->gem_handle); in crocus_bo_create_userptr()
518 free(bo); in crocus_bo_create_userptr()
532 struct crocus_bo *bo; in crocus_bo_gem_create_from_name() local
541 bo = find_and_ref_external_bo(bufmgr->name_table, handle); in crocus_bo_gem_create_from_name()
542 if (bo) in crocus_bo_gem_create_from_name()
550 bo = NULL; in crocus_bo_gem_create_from_name()
557 bo = find_and_ref_external_bo(bufmgr->handle_table, open_arg.handle); in crocus_bo_gem_create_from_name()
558 if (bo) in crocus_bo_gem_create_from_name()
561 bo = bo_calloc(); in crocus_bo_gem_create_from_name()
562 if (!bo) in crocus_bo_gem_create_from_name()
565 p_atomic_set(&bo->refcount, 1); in crocus_bo_gem_create_from_name()
567 bo->size = open_arg.size; in crocus_bo_gem_create_from_name()
568 bo->gtt_offset = 0; in crocus_bo_gem_create_from_name()
569 bo->bufmgr = bufmgr; in crocus_bo_gem_create_from_name()
570 bo->gem_handle = open_arg.handle; in crocus_bo_gem_create_from_name()
571 bo->name = name; in crocus_bo_gem_create_from_name()
572 bo->global_name = handle; in crocus_bo_gem_create_from_name()
573 bo->reusable = false; in crocus_bo_gem_create_from_name()
574 bo->external = true; in crocus_bo_gem_create_from_name()
575 bo->kflags = 0; in crocus_bo_gem_create_from_name()
577 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo); in crocus_bo_gem_create_from_name()
578 _mesa_hash_table_insert(bufmgr->name_table, &bo->global_name, bo); in crocus_bo_gem_create_from_name()
580 struct drm_i915_gem_get_tiling get_tiling = { .handle = bo->gem_handle }; in crocus_bo_gem_create_from_name()
585 bo->tiling_mode = get_tiling.tiling_mode; in crocus_bo_gem_create_from_name()
586 bo->swizzle_mode = get_tiling.swizzle_mode; in crocus_bo_gem_create_from_name()
588 DBG("bo_create_from_handle: %d (%s)\n", handle, bo->name); in crocus_bo_gem_create_from_name()
592 return bo; in crocus_bo_gem_create_from_name()
595 bo_free(bo); in crocus_bo_gem_create_from_name()
601 bo_close(struct crocus_bo *bo) in bo_close() argument
603 struct crocus_bufmgr *bufmgr = bo->bufmgr; in bo_close()
605 if (bo->external) { in bo_close()
608 if (bo->global_name) { in bo_close()
609 entry = _mesa_hash_table_search(bufmgr->name_table, &bo->global_name); in bo_close()
613 entry = _mesa_hash_table_search(bufmgr->handle_table, &bo->gem_handle); in bo_close()
616 list_for_each_entry_safe(struct bo_export, export, &bo->exports, link) { in bo_close()
624 assert(list_is_empty(&bo->exports)); in bo_close()
628 struct drm_gem_close close = { .handle = bo->gem_handle }; in bo_close()
632 bo->gem_handle, bo->name, strerror(errno)); in bo_close()
635 free(bo); in bo_close()
639 bo_free(struct crocus_bo *bo) in bo_free() argument
641 struct crocus_bufmgr *bufmgr = bo->bufmgr; in bo_free()
643 if (bo->map_cpu && !bo->userptr) { in bo_free()
644 VG_NOACCESS(bo->map_cpu, bo->size); in bo_free()
645 munmap(bo->map_cpu, bo->size); in bo_free()
647 if (bo->map_wc) { in bo_free()
648 VG_NOACCESS(bo->map_wc, bo->size); in bo_free()
649 munmap(bo->map_wc, bo->size); in bo_free()
651 if (bo->map_gtt) { in bo_free()
652 VG_NOACCESS(bo->map_gtt, bo->size); in bo_free()
653 munmap(bo->map_gtt, bo->size); in bo_free()
656 if (bo->idle) { in bo_free()
657 bo_close(bo); in bo_free()
662 list_addtail(&bo->head, &bufmgr->zombie_list); in bo_free()
678 list_for_each_entry_safe(struct crocus_bo, bo, &bucket->head, head) { in cleanup_bo_cache()
679 if (time - bo->free_time <= 1) in cleanup_bo_cache()
682 list_del(&bo->head); in cleanup_bo_cache()
684 bo_free(bo); in cleanup_bo_cache()
688 list_for_each_entry_safe(struct crocus_bo, bo, &bufmgr->zombie_list, head) { in cleanup_bo_cache()
692 if (!bo->idle && crocus_bo_busy(bo)) in cleanup_bo_cache()
695 list_del(&bo->head); in cleanup_bo_cache()
696 bo_close(bo); in cleanup_bo_cache()
703 bo_unreference_final(struct crocus_bo *bo, time_t time) in bo_unreference_final() argument
705 struct crocus_bufmgr *bufmgr = bo->bufmgr; in bo_unreference_final()
708 DBG("bo_unreference final: %d (%s)\n", bo->gem_handle, bo->name); in bo_unreference_final()
711 if (bo->reusable) in bo_unreference_final()
712 bucket = bucket_for_size(bufmgr, bo->size); in bo_unreference_final()
714 if (bucket && crocus_bo_madvise(bo, I915_MADV_DONTNEED)) { in bo_unreference_final()
715 bo->free_time = time; in bo_unreference_final()
716 bo->name = NULL; in bo_unreference_final()
718 list_addtail(&bo->head, &bucket->head); in bo_unreference_final()
720 bo_free(bo); in bo_unreference_final()
725 __crocus_bo_unreference(struct crocus_bo *bo) in __crocus_bo_unreference() argument
727 struct crocus_bufmgr *bufmgr = bo->bufmgr; in __crocus_bo_unreference()
734 if (p_atomic_dec_zero(&bo->refcount)) { in __crocus_bo_unreference()
735 bo_unreference_final(bo, time.tv_sec); in __crocus_bo_unreference()
744 struct crocus_bo *bo, in bo_wait_with_stall_warning() argument
747 bool busy = dbg && !bo->idle; in bo_wait_with_stall_warning()
750 crocus_bo_wait_rendering(bo); in bo_wait_with_stall_warning()
756 action, bo->name, elapsed * 1000); in bo_wait_with_stall_warning()
781 struct crocus_bo *bo, bool wc) in crocus_bo_gem_mmap_legacy() argument
783 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_gem_mmap_legacy()
786 .handle = bo->gem_handle, in crocus_bo_gem_mmap_legacy()
787 .size = bo->size, in crocus_bo_gem_mmap_legacy()
794 __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); in crocus_bo_gem_mmap_legacy()
803 crocus_bo_gem_mmap_offset(struct util_debug_callback *dbg, struct crocus_bo *bo, in crocus_bo_gem_mmap_offset() argument
806 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_gem_mmap_offset()
809 .handle = bo->gem_handle, in crocus_bo_gem_mmap_offset()
817 __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); in crocus_bo_gem_mmap_offset()
822 void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, in crocus_bo_gem_mmap_offset()
826 __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); in crocus_bo_gem_mmap_offset()
834 crocus_bo_gem_mmap(struct util_debug_callback *dbg, struct crocus_bo *bo, bool wc) in crocus_bo_gem_mmap() argument
836 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_gem_mmap()
839 return crocus_bo_gem_mmap_offset(dbg, bo, wc); in crocus_bo_gem_mmap()
841 return crocus_bo_gem_mmap_legacy(dbg, bo, wc); in crocus_bo_gem_mmap()
846 struct crocus_bo *bo, unsigned flags) in crocus_bo_map_cpu() argument
852 assert(bo->cache_coherent || !(flags & MAP_WRITE)); in crocus_bo_map_cpu()
854 if (!bo->map_cpu) { in crocus_bo_map_cpu()
855 DBG("crocus_bo_map_cpu: %d (%s)\n", bo->gem_handle, bo->name); in crocus_bo_map_cpu()
857 void *map = crocus_bo_gem_mmap(dbg, bo, false); in crocus_bo_map_cpu()
862 VG_DEFINED(map, bo->size); in crocus_bo_map_cpu()
864 if (p_atomic_cmpxchg(&bo->map_cpu, NULL, map)) { in crocus_bo_map_cpu()
865 VG_NOACCESS(map, bo->size); in crocus_bo_map_cpu()
866 munmap(map, bo->size); in crocus_bo_map_cpu()
869 assert(bo->map_cpu); in crocus_bo_map_cpu()
871 DBG("crocus_bo_map_cpu: %d (%s) -> %p, ", bo->gem_handle, bo->name, in crocus_bo_map_cpu()
872 bo->map_cpu); in crocus_bo_map_cpu()
876 bo_wait_with_stall_warning(dbg, bo, "CPU mapping"); in crocus_bo_map_cpu()
879 if (!bo->cache_coherent && !bo->bufmgr->has_llc) { in crocus_bo_map_cpu()
896 intel_invalidate_range(bo->map_cpu, bo->size); in crocus_bo_map_cpu()
899 return bo->map_cpu; in crocus_bo_map_cpu()
904 struct crocus_bo *bo, unsigned flags) in crocus_bo_map_wc() argument
906 if (!bo->map_wc) { in crocus_bo_map_wc()
907 DBG("crocus_bo_map_wc: %d (%s)\n", bo->gem_handle, bo->name); in crocus_bo_map_wc()
909 void *map = crocus_bo_gem_mmap(dbg, bo, true); in crocus_bo_map_wc()
914 VG_DEFINED(map, bo->size); in crocus_bo_map_wc()
916 if (p_atomic_cmpxchg(&bo->map_wc, NULL, map)) { in crocus_bo_map_wc()
917 VG_NOACCESS(map, bo->size); in crocus_bo_map_wc()
918 munmap(map, bo->size); in crocus_bo_map_wc()
921 assert(bo->map_wc); in crocus_bo_map_wc()
923 DBG("crocus_bo_map_wc: %d (%s) -> %p\n", bo->gem_handle, bo->name, bo->map_wc); in crocus_bo_map_wc()
927 bo_wait_with_stall_warning(dbg, bo, "WC mapping"); in crocus_bo_map_wc()
930 return bo->map_wc; in crocus_bo_map_wc()
957 struct crocus_bo *bo, unsigned flags) in crocus_bo_map_gtt() argument
959 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_map_gtt()
967 if (bo->map_gtt == NULL) { in crocus_bo_map_gtt()
968 DBG("bo_map_gtt: mmap %d (%s)\n", bo->gem_handle, bo->name); in crocus_bo_map_gtt()
970 struct drm_i915_gem_mmap_gtt mmap_arg = { .handle = bo->gem_handle }; in crocus_bo_map_gtt()
976 __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); in crocus_bo_map_gtt()
981 void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, in crocus_bo_map_gtt()
985 __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); in crocus_bo_map_gtt()
994 VG_DEFINED(map, bo->size); in crocus_bo_map_gtt()
996 if (p_atomic_cmpxchg(&bo->map_gtt, NULL, map)) { in crocus_bo_map_gtt()
997 VG_NOACCESS(map, bo->size); in crocus_bo_map_gtt()
998 munmap(map, bo->size); in crocus_bo_map_gtt()
1001 assert(bo->map_gtt); in crocus_bo_map_gtt()
1003 DBG("bo_map_gtt: %d (%s) -> %p, ", bo->gem_handle, bo->name, bo->map_gtt); in crocus_bo_map_gtt()
1007 bo_wait_with_stall_warning(dbg, bo, "GTT mapping"); in crocus_bo_map_gtt()
1010 return bo->map_gtt; in crocus_bo_map_gtt()
1014 can_map_cpu(struct crocus_bo *bo, unsigned flags) in can_map_cpu() argument
1016 if (bo->scanout) in can_map_cpu()
1019 if (bo->cache_coherent) in can_map_cpu()
1027 if (!(flags & MAP_WRITE) && bo->bufmgr->has_llc) in can_map_cpu()
1052 struct crocus_bo *bo, unsigned flags) in crocus_bo_map() argument
1054 if (bo->tiling_mode != I915_TILING_NONE && !(flags & MAP_RAW)) in crocus_bo_map()
1055 return crocus_bo_map_gtt(dbg, bo, flags); in crocus_bo_map()
1059 if (can_map_cpu(bo, flags)) in crocus_bo_map()
1060 map = crocus_bo_map_cpu(dbg, bo, flags); in crocus_bo_map()
1062 map = crocus_bo_map_wc(dbg, bo, flags); in crocus_bo_map()
1077 bo->name, flags); in crocus_bo_map()
1078 map = crocus_bo_map_gtt(dbg, bo, flags); in crocus_bo_map()
1086 crocus_bo_wait_rendering(struct crocus_bo *bo) in crocus_bo_wait_rendering() argument
1091 crocus_bo_wait(bo, -1); in crocus_bo_wait_rendering()
1122 crocus_bo_wait(struct crocus_bo *bo, int64_t timeout_ns) in crocus_bo_wait() argument
1124 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_wait()
1127 if (bo->idle && !bo->external) in crocus_bo_wait()
1131 .bo_handle = bo->gem_handle, in crocus_bo_wait()
1138 bo->idle = true; in crocus_bo_wait()
1152 list_for_each_entry_safe(struct crocus_bo, bo, &bucket->head, head) { in crocus_bufmgr_destroy()
1153 list_del(&bo->head); in crocus_bufmgr_destroy()
1155 bo_free(bo); in crocus_bufmgr_destroy()
1160 list_for_each_entry_safe(struct crocus_bo, bo, &bufmgr->zombie_list, head) { in crocus_bufmgr_destroy()
1161 list_del(&bo->head); in crocus_bufmgr_destroy()
1162 bo_close(bo); in crocus_bufmgr_destroy()
1174 bo_set_tiling_internal(struct crocus_bo *bo, uint32_t tiling_mode, in bo_set_tiling_internal() argument
1177 struct crocus_bufmgr *bufmgr = bo->bufmgr; in bo_set_tiling_internal()
1181 if (bo->global_name == 0 && in bo_set_tiling_internal()
1182 tiling_mode == bo->tiling_mode && stride == bo->stride) in bo_set_tiling_internal()
1191 set_tiling.handle = bo->gem_handle; in bo_set_tiling_internal()
1200 bo->tiling_mode = set_tiling.tiling_mode; in bo_set_tiling_internal()
1201 bo->swizzle_mode = set_tiling.swizzle_mode; in bo_set_tiling_internal()
1202 bo->stride = set_tiling.stride; in bo_set_tiling_internal()
1207 crocus_bo_get_tiling(struct crocus_bo *bo, uint32_t *tiling_mode, in crocus_bo_get_tiling() argument
1210 *tiling_mode = bo->tiling_mode; in crocus_bo_get_tiling()
1211 *swizzle_mode = bo->swizzle_mode; in crocus_bo_get_tiling()
1220 struct crocus_bo *bo; in crocus_bo_import_dmabuf() local
1236 bo = find_and_ref_external_bo(bufmgr->handle_table, handle); in crocus_bo_import_dmabuf()
1237 if (bo) in crocus_bo_import_dmabuf()
1240 bo = bo_calloc(); in crocus_bo_import_dmabuf()
1241 if (!bo) in crocus_bo_import_dmabuf()
1244 p_atomic_set(&bo->refcount, 1); in crocus_bo_import_dmabuf()
1253 bo->size = ret; in crocus_bo_import_dmabuf()
1255 bo->bufmgr = bufmgr; in crocus_bo_import_dmabuf()
1256 bo->name = "prime"; in crocus_bo_import_dmabuf()
1257 bo->reusable = false; in crocus_bo_import_dmabuf()
1258 bo->external = true; in crocus_bo_import_dmabuf()
1259 bo->kflags = 0; in crocus_bo_import_dmabuf()
1260 bo->gem_handle = handle; in crocus_bo_import_dmabuf()
1261 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo); in crocus_bo_import_dmabuf()
1266 bo->tiling_mode = isl_tiling_to_i915_tiling(mod_info->tiling); in crocus_bo_import_dmabuf()
1268 struct drm_i915_gem_get_tiling get_tiling = { .handle = bo->gem_handle }; in crocus_bo_import_dmabuf()
1272 bo->tiling_mode = get_tiling.tiling_mode; in crocus_bo_import_dmabuf()
1274 bo->tiling_mode = I915_TILING_NONE; in crocus_bo_import_dmabuf()
1279 return bo; in crocus_bo_import_dmabuf()
1282 bo_free(bo); in crocus_bo_import_dmabuf()
1292 struct crocus_bo *bo; in crocus_bo_import_dmabuf_no_mods() local
1308 bo = find_and_ref_external_bo(bufmgr->handle_table, handle); in crocus_bo_import_dmabuf_no_mods()
1309 if (bo) in crocus_bo_import_dmabuf_no_mods()
1312 bo = bo_calloc(); in crocus_bo_import_dmabuf_no_mods()
1313 if (!bo) in crocus_bo_import_dmabuf_no_mods()
1316 p_atomic_set(&bo->refcount, 1); in crocus_bo_import_dmabuf_no_mods()
1325 bo->size = ret; in crocus_bo_import_dmabuf_no_mods()
1327 bo->bufmgr = bufmgr; in crocus_bo_import_dmabuf_no_mods()
1328 bo->name = "prime"; in crocus_bo_import_dmabuf_no_mods()
1329 bo->reusable = false; in crocus_bo_import_dmabuf_no_mods()
1330 bo->external = true; in crocus_bo_import_dmabuf_no_mods()
1331 bo->kflags = 0; in crocus_bo_import_dmabuf_no_mods()
1332 bo->gem_handle = handle; in crocus_bo_import_dmabuf_no_mods()
1333 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo); in crocus_bo_import_dmabuf_no_mods()
1337 return bo; in crocus_bo_import_dmabuf_no_mods()
1341 crocus_bo_make_external_locked(struct crocus_bo *bo) in crocus_bo_make_external_locked() argument
1343 if (!bo->external) { in crocus_bo_make_external_locked()
1344 _mesa_hash_table_insert(bo->bufmgr->handle_table, &bo->gem_handle, bo); in crocus_bo_make_external_locked()
1345 bo->external = true; in crocus_bo_make_external_locked()
1346 bo->reusable = false; in crocus_bo_make_external_locked()
1351 crocus_bo_make_external(struct crocus_bo *bo) in crocus_bo_make_external() argument
1353 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_make_external()
1355 if (bo->external) { in crocus_bo_make_external()
1356 assert(!bo->reusable); in crocus_bo_make_external()
1361 crocus_bo_make_external_locked(bo); in crocus_bo_make_external()
1366 crocus_bo_export_dmabuf(struct crocus_bo *bo, int *prime_fd) in crocus_bo_export_dmabuf() argument
1368 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_export_dmabuf()
1370 crocus_bo_make_external(bo); in crocus_bo_export_dmabuf()
1372 if (drmPrimeHandleToFD(bufmgr->fd, bo->gem_handle, in crocus_bo_export_dmabuf()
1380 crocus_bo_export_gem_handle(struct crocus_bo *bo) in crocus_bo_export_gem_handle() argument
1382 crocus_bo_make_external(bo); in crocus_bo_export_gem_handle()
1384 return bo->gem_handle; in crocus_bo_export_gem_handle()
1388 crocus_bo_flink(struct crocus_bo *bo, uint32_t *name) in crocus_bo_flink() argument
1390 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_flink()
1392 if (!bo->global_name) { in crocus_bo_flink()
1393 struct drm_gem_flink flink = { .handle = bo->gem_handle }; in crocus_bo_flink()
1399 if (!bo->global_name) { in crocus_bo_flink()
1400 crocus_bo_make_external_locked(bo); in crocus_bo_flink()
1401 bo->global_name = flink.name; in crocus_bo_flink()
1402 _mesa_hash_table_insert(bufmgr->name_table, &bo->global_name, bo); in crocus_bo_flink()
1407 *name = bo->global_name; in crocus_bo_flink()
1412 crocus_bo_export_gem_handle_for_device(struct crocus_bo *bo, int drm_fd, in crocus_bo_export_gem_handle_for_device() argument
1419 struct crocus_bufmgr *bufmgr = bo->bufmgr; in crocus_bo_export_gem_handle_for_device()
1425 *out_handle = crocus_bo_export_gem_handle(bo); in crocus_bo_export_gem_handle_for_device()
1436 int err = crocus_bo_export_dmabuf(bo, &dmabuf_fd); in crocus_bo_export_gem_handle_for_device()
1452 list_for_each_entry(struct bo_export, iter, &bo->exports, link) { in crocus_bo_export_gem_handle_for_device()
1465 list_addtail(&export->link, &bo->exports); in crocus_bo_export_gem_handle_for_device()