Lines Matching defs:bufmgr
137 * List into the list of bufmgr.
220 bucket_for_size(struct crocus_bufmgr *bufmgr, uint64_t size)
250 return (index < bufmgr->num_buckets) ?
251 &bufmgr->cache_bucket[index] : NULL;
258 struct crocus_bufmgr *bufmgr = bo->bufmgr;
261 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_BUSY, &busy);
278 intel_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv);
296 alloc_bo_from_cache(struct crocus_bufmgr *bufmgr,
346 alloc_fresh_bo(struct crocus_bufmgr *bufmgr, uint64_t bo_size)
357 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CREATE, &create) != 0) {
363 bo->bufmgr = bufmgr;
380 if (intel_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd) != 0) {
389 bo_alloc_internal(struct crocus_bufmgr *bufmgr,
399 struct bo_cache_bucket *bucket = bucket_for_size(bufmgr, size);
407 simple_mtx_lock(&bufmgr->lock);
412 bo = alloc_bo_from_cache(bufmgr, bucket, alignment, flags);
414 simple_mtx_unlock(&bufmgr->lock);
417 bo = alloc_fresh_bo(bufmgr, bo_size);
427 bo->reusable = bucket && bufmgr->bo_reuse;
428 bo->cache_coherent = bufmgr->has_llc;
440 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_SET_CACHING, &arg) == 0) {
457 crocus_bo_alloc(struct crocus_bufmgr *bufmgr,
461 return bo_alloc_internal(bufmgr, name, size, 1,
466 crocus_bo_alloc_tiled(struct crocus_bufmgr *bufmgr, const char *name,
470 return bo_alloc_internal(bufmgr, name, size, alignment,
475 crocus_bo_create_userptr(struct crocus_bufmgr *bufmgr, const char *name,
488 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_USERPTR, &arg))
497 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd))
504 bo->bufmgr = bufmgr;
516 intel_ioctl(bufmgr->fd, DRM_IOCTL_GEM_CLOSE, &bo->gem_handle);
529 crocus_bo_gem_create_from_name(struct crocus_bufmgr *bufmgr,
540 simple_mtx_lock(&bufmgr->lock);
541 bo = find_and_ref_external_bo(bufmgr->name_table, handle);
546 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_GEM_OPEN, &open_arg);
557 bo = find_and_ref_external_bo(bufmgr->handle_table, open_arg.handle);
569 bo->bufmgr = bufmgr;
577 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo);
578 _mesa_hash_table_insert(bufmgr->name_table, &bo->global_name, bo);
581 ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling);
591 simple_mtx_unlock(&bufmgr->lock);
596 simple_mtx_unlock(&bufmgr->lock);
603 struct crocus_bufmgr *bufmgr = bo->bufmgr;
609 entry = _mesa_hash_table_search(bufmgr->name_table, &bo->global_name);
610 _mesa_hash_table_remove(bufmgr->name_table, entry);
613 entry = _mesa_hash_table_search(bufmgr->handle_table, &bo->gem_handle);
614 _mesa_hash_table_remove(bufmgr->handle_table, entry);
629 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_GEM_CLOSE, &close);
641 struct crocus_bufmgr *bufmgr = bo->bufmgr;
662 list_addtail(&bo->head, &bufmgr->zombie_list);
668 cleanup_bo_cache(struct crocus_bufmgr *bufmgr, time_t time)
672 if (bufmgr->time == time)
675 for (i = 0; i < bufmgr->num_buckets; i++) {
676 struct bo_cache_bucket *bucket = &bufmgr->cache_bucket[i];
688 list_for_each_entry_safe(struct crocus_bo, bo, &bufmgr->zombie_list, head) {
699 bufmgr->time = time;
705 struct crocus_bufmgr *bufmgr = bo->bufmgr;
712 bucket = bucket_for_size(bufmgr, bo->size);
727 struct crocus_bufmgr *bufmgr = bo->bufmgr;
732 simple_mtx_lock(&bufmgr->lock);
736 cleanup_bo_cache(bufmgr, time.tv_sec);
739 simple_mtx_unlock(&bufmgr->lock);
783 struct crocus_bufmgr *bufmgr = bo->bufmgr;
791 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg);
806 struct crocus_bufmgr *bufmgr = bo->bufmgr;
814 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_MMAP_OFFSET, &mmap_arg);
823 bufmgr->fd, mmap_arg.offset);
836 struct crocus_bufmgr *bufmgr = bo->bufmgr;
838 if (bufmgr->has_mmap_offset)
879 if (!bo->cache_coherent && !bo->bufmgr->has_llc) {
959 struct crocus_bufmgr *bufmgr = bo->bufmgr;
964 assert(bufmgr->has_tiling_uapi);
973 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg);
982 MAP_SHARED, bufmgr->fd, mmap_arg.offset);
1027 if (!(flags & MAP_WRITE) && bo->bufmgr->has_llc)
1124 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1134 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_WAIT, &wait);
1144 crocus_bufmgr_destroy(struct crocus_bufmgr *bufmgr)
1146 simple_mtx_destroy(&bufmgr->lock);
1149 for (int i = 0; i < bufmgr->num_buckets; i++) {
1150 struct bo_cache_bucket *bucket = &bufmgr->cache_bucket[i];
1160 list_for_each_entry_safe(struct crocus_bo, bo, &bufmgr->zombie_list, head) {
1165 _mesa_hash_table_destroy(bufmgr->name_table, NULL);
1166 _mesa_hash_table_destroy(bufmgr->handle_table, NULL);
1168 close(bufmgr->fd);
1170 free(bufmgr);
1177 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1195 ret = ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling);
1216 crocus_bo_import_dmabuf(struct crocus_bufmgr *bufmgr, int prime_fd,
1222 simple_mtx_lock(&bufmgr->lock);
1223 int ret = drmPrimeFDToHandle(bufmgr->fd, prime_fd, &handle);
1227 simple_mtx_unlock(&bufmgr->lock);
1236 bo = find_and_ref_external_bo(bufmgr->handle_table, handle);
1255 bo->bufmgr = bufmgr;
1261 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo);
1267 } else if (bufmgr->has_tiling_uapi) {
1269 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling))
1278 simple_mtx_unlock(&bufmgr->lock);
1283 simple_mtx_unlock(&bufmgr->lock);
1288 crocus_bo_import_dmabuf_no_mods(struct crocus_bufmgr *bufmgr,
1294 simple_mtx_lock(&bufmgr->lock);
1295 int ret = drmPrimeFDToHandle(bufmgr->fd, prime_fd, &handle);
1299 simple_mtx_unlock(&bufmgr->lock);
1308 bo = find_and_ref_external_bo(bufmgr->handle_table, handle);
1327 bo->bufmgr = bufmgr;
1333 _mesa_hash_table_insert(bufmgr->handle_table, &bo->gem_handle, bo);
1336 simple_mtx_unlock(&bufmgr->lock);
1344 _mesa_hash_table_insert(bo->bufmgr->handle_table, &bo->gem_handle, bo);
1353 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1360 simple_mtx_lock(&bufmgr->lock);
1362 simple_mtx_unlock(&bufmgr->lock);
1368 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1372 if (drmPrimeHandleToFD(bufmgr->fd, bo->gem_handle,
1390 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1395 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_GEM_FLINK, &flink))
1398 simple_mtx_lock(&bufmgr->lock);
1402 _mesa_hash_table_insert(bufmgr->name_table, &bo->global_name, bo);
1404 simple_mtx_unlock(&bufmgr->lock);
1419 struct crocus_bufmgr *bufmgr = bo->bufmgr;
1420 int ret = os_same_file_description(drm_fd, bufmgr->fd);
1442 simple_mtx_lock(&bufmgr->lock);
1446 simple_mtx_unlock(&bufmgr->lock);
1467 simple_mtx_unlock(&bufmgr->lock);
1475 add_bucket(struct crocus_bufmgr *bufmgr, int size)
1477 unsigned int i = bufmgr->num_buckets;
1479 assert(i < ARRAY_SIZE(bufmgr->cache_bucket));
1481 list_inithead(&bufmgr->cache_bucket[i].head);
1482 bufmgr->cache_bucket[i].size = size;
1483 bufmgr->num_buckets++;
1485 assert(bucket_for_size(bufmgr, size) == &bufmgr->cache_bucket[i]);
1486 assert(bucket_for_size(bufmgr, size - 2048) == &bufmgr->cache_bucket[i]);
1487 assert(bucket_for_size(bufmgr, size + 1) != &bufmgr->cache_bucket[i]);
1491 init_cache_buckets(struct crocus_bufmgr *bufmgr)
1503 add_bucket(bufmgr, PAGE_SIZE);
1504 add_bucket(bufmgr, PAGE_SIZE * 2);
1505 add_bucket(bufmgr, PAGE_SIZE * 3);
1509 add_bucket(bufmgr, size);
1511 add_bucket(bufmgr, size + size * 1 / 4);
1512 add_bucket(bufmgr, size + size * 2 / 4);
1513 add_bucket(bufmgr, size + size * 3 / 4);
1518 crocus_create_hw_context(struct crocus_bufmgr *bufmgr)
1521 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
1547 drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &p);
1553 crocus_hw_context_get_priority(struct crocus_bufmgr *bufmgr, uint32_t ctx_id)
1559 drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &p);
1564 crocus_hw_context_set_priority(struct crocus_bufmgr *bufmgr,
1576 if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &p))
1583 crocus_clone_hw_context(struct crocus_bufmgr *bufmgr, uint32_t ctx_id)
1585 uint32_t new_ctx = crocus_create_hw_context(bufmgr);
1588 int priority = crocus_hw_context_get_priority(bufmgr, ctx_id);
1589 crocus_hw_context_set_priority(bufmgr, new_ctx, priority);
1596 crocus_destroy_hw_context(struct crocus_bufmgr *bufmgr, uint32_t ctx_id)
1601 intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY, &d) != 0) {
1608 crocus_reg_read(struct crocus_bufmgr *bufmgr, uint32_t offset, uint64_t *result)
1611 int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_REG_READ, ®_read);
1638 struct crocus_bufmgr *bufmgr = calloc(1, sizeof(*bufmgr));
1639 if (bufmgr == NULL)
1644 * multiple parties (threads sharing the same screen bufmgr, or
1648 * Don't do this! Ensure that each library/bufmgr has its own device
1651 bufmgr->fd = os_dupfd_cloexec(fd);
1653 p_atomic_set(&bufmgr->refcount, 1);
1655 simple_mtx_init(&bufmgr->lock, mtx_plain);
1657 list_inithead(&bufmgr->zombie_list);
1659 bufmgr->has_llc = devinfo->has_llc;
1660 bufmgr->has_tiling_uapi = devinfo->has_tiling_uapi;
1661 bufmgr->bo_reuse = bo_reuse;
1662 bufmgr->has_mmap_offset = gem_param(fd, I915_PARAM_MMAP_GTT_VERSION) >= 4;
1664 init_cache_buckets(bufmgr);
1666 bufmgr->name_table =
1668 bufmgr->handle_table =
1671 return bufmgr;
1675 crocus_bufmgr_ref(struct crocus_bufmgr *bufmgr)
1677 p_atomic_inc(&bufmgr->refcount);
1678 return bufmgr;
1682 crocus_bufmgr_unref(struct crocus_bufmgr *bufmgr)
1685 if (p_atomic_dec_zero(&bufmgr->refcount)) {
1686 list_del(&bufmgr->link);
1687 crocus_bufmgr_destroy(bufmgr);
1705 struct crocus_bufmgr *bufmgr = NULL;
1715 bufmgr = crocus_bufmgr_ref(iter_bufmgr);
1720 bufmgr = crocus_bufmgr_create(devinfo, fd, bo_reuse);
1721 if (bufmgr)
1722 list_addtail(&bufmgr->link, &global_bufmgr_list);
1727 return bufmgr;
1731 crocus_bufmgr_get_fd(struct crocus_bufmgr *bufmgr)
1733 return bufmgr->fd;