Lines Matching refs:bo
52 vc4_bo_label(struct vc4_screen *screen, struct vc4_bo *bo, const char *fmt, ...) in vc4_bo_label() argument
68 .handle = bo->handle, in vc4_bo_label()
108 vc4_bo_remove_from_cache(struct vc4_bo_cache *cache, struct vc4_bo *bo) in vc4_bo_remove_from_cache() argument
110 list_del(&bo->time_list); in vc4_bo_remove_from_cache()
111 list_del(&bo->size_list); in vc4_bo_remove_from_cache()
113 cache->bo_size -= bo->size; in vc4_bo_remove_from_cache()
116 static void vc4_bo_purgeable(struct vc4_bo *bo) in vc4_bo_purgeable() argument
119 .handle = bo->handle, in vc4_bo_purgeable()
123 if (bo->screen->has_madvise) in vc4_bo_purgeable()
124 vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_GEM_MADVISE, &arg); in vc4_bo_purgeable()
127 static bool vc4_bo_unpurgeable(struct vc4_bo *bo) in vc4_bo_unpurgeable() argument
130 .handle = bo->handle, in vc4_bo_unpurgeable()
134 if (!bo->screen->has_madvise) in vc4_bo_unpurgeable()
137 if (vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_GEM_MADVISE, &arg)) in vc4_bo_unpurgeable()
144 vc4_bo_free(struct vc4_bo *bo) in vc4_bo_free() argument
146 struct vc4_screen *screen = bo->screen; in vc4_bo_free()
148 if (bo->map) { in vc4_bo_free()
149 if (using_vc4_simulator && bo->name && in vc4_bo_free()
150 strcmp(bo->name, "winsys") == 0) { in vc4_bo_free()
151 free(bo->map); in vc4_bo_free()
153 munmap(bo->map, bo->size); in vc4_bo_free()
154 VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0)); in vc4_bo_free()
160 c.handle = bo->handle; in vc4_bo_free()
163 fprintf(stderr, "close object %d: %s\n", bo->handle, strerror(errno)); in vc4_bo_free()
166 screen->bo_size -= bo->size; in vc4_bo_free()
170 bo->name ? bo->name : "", in vc4_bo_free()
171 bo->name ? " " : "", in vc4_bo_free()
172 bo->size / 1024); in vc4_bo_free()
176 free(bo); in vc4_bo_free()
184 struct vc4_bo *iter, *tmp, *bo = NULL; in vc4_bo_from_cache() local
208 bo = iter; in vc4_bo_from_cache()
209 pipe_reference_init(&bo->reference, 1); in vc4_bo_from_cache()
210 vc4_bo_remove_from_cache(cache, bo); in vc4_bo_from_cache()
212 vc4_bo_label(screen, bo, "%s", name); in vc4_bo_from_cache()
213 bo->name = name; in vc4_bo_from_cache()
217 return bo; in vc4_bo_from_cache()
225 struct vc4_bo *bo; in vc4_bo_alloc() local
230 bo = vc4_bo_from_cache(screen, size, name); in vc4_bo_alloc()
231 if (bo) { in vc4_bo_alloc()
237 return bo; in vc4_bo_alloc()
240 bo = CALLOC_STRUCT(vc4_bo); in vc4_bo_alloc()
241 if (!bo) in vc4_bo_alloc()
244 pipe_reference_init(&bo->reference, 1); in vc4_bo_alloc()
245 bo->screen = screen; in vc4_bo_alloc()
246 bo->size = size; in vc4_bo_alloc()
247 bo->name = name; in vc4_bo_alloc()
248 bo->private = true; in vc4_bo_alloc()
255 bo->handle = create.handle; in vc4_bo_alloc()
265 free(bo); in vc4_bo_alloc()
270 screen->bo_size += bo->size; in vc4_bo_alloc()
276 vc4_bo_label(screen, bo, "%s", name); in vc4_bo_alloc()
278 return bo; in vc4_bo_alloc()
282 vc4_bo_last_unreference(struct vc4_bo *bo) in vc4_bo_last_unreference() argument
284 struct vc4_screen *screen = bo->screen; in vc4_bo_last_unreference()
289 vc4_bo_last_unreference_locked_timed(bo, time.tv_sec); in vc4_bo_last_unreference()
299 list_for_each_entry_safe(struct vc4_bo, bo, &cache->time_list, in free_stale_bos()
308 if (time - bo->free_time > 2) { in free_stale_bos()
309 vc4_bo_remove_from_cache(cache, bo); in free_stale_bos()
310 vc4_bo_free(bo); in free_stale_bos()
326 list_for_each_entry_safe(struct vc4_bo, bo, &cache->time_list, in vc4_bo_cache_free_all()
328 vc4_bo_remove_from_cache(cache, bo); in vc4_bo_cache_free_all()
329 vc4_bo_free(bo); in vc4_bo_cache_free_all()
335 vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time) in vc4_bo_last_unreference_locked_timed() argument
337 struct vc4_screen *screen = bo->screen; in vc4_bo_last_unreference_locked_timed()
339 uint32_t page_index = bo->size / 4096 - 1; in vc4_bo_last_unreference_locked_timed()
341 if (!bo->private) { in vc4_bo_last_unreference_locked_timed()
342 vc4_bo_free(bo); in vc4_bo_last_unreference_locked_timed()
362 vc4_bo_purgeable(bo); in vc4_bo_last_unreference_locked_timed()
363 bo->free_time = time; in vc4_bo_last_unreference_locked_timed()
364 list_addtail(&bo->size_list, &cache->size_list[page_index]); in vc4_bo_last_unreference_locked_timed()
365 list_addtail(&bo->time_list, &cache->time_list); in vc4_bo_last_unreference_locked_timed()
367 cache->bo_size += bo->size; in vc4_bo_last_unreference_locked_timed()
370 bo->name, bo->size / 1024); in vc4_bo_last_unreference_locked_timed()
373 bo->name = NULL; in vc4_bo_last_unreference_locked_timed()
374 vc4_bo_label(screen, bo, "mesa cache"); in vc4_bo_last_unreference_locked_timed()
384 struct vc4_bo *bo; in vc4_bo_open_handle() local
390 bo = util_hash_table_get(screen->bo_handles, (void*)(uintptr_t)handle); in vc4_bo_open_handle()
391 if (bo) { in vc4_bo_open_handle()
392 pipe_reference(NULL, &bo->reference); in vc4_bo_open_handle()
396 bo = CALLOC_STRUCT(vc4_bo); in vc4_bo_open_handle()
397 pipe_reference_init(&bo->reference, 1); in vc4_bo_open_handle()
398 bo->screen = screen; in vc4_bo_open_handle()
399 bo->handle = handle; in vc4_bo_open_handle()
400 bo->size = size; in vc4_bo_open_handle()
401 bo->name = "winsys"; in vc4_bo_open_handle()
402 bo->private = false; in vc4_bo_open_handle()
406 bo->handle, bo->size); in vc4_bo_open_handle()
407 bo->map = malloc(bo->size); in vc4_bo_open_handle()
410 util_hash_table_set(screen->bo_handles, (void *)(uintptr_t)handle, bo); in vc4_bo_open_handle()
414 return bo; in vc4_bo_open_handle()
456 vc4_bo_get_dmabuf(struct vc4_bo *bo) in vc4_bo_get_dmabuf() argument
459 int ret = drmPrimeHandleToFD(bo->screen->fd, bo->handle, in vc4_bo_get_dmabuf()
463 bo->handle); in vc4_bo_get_dmabuf()
467 mtx_lock(&bo->screen->bo_handles_mutex); in vc4_bo_get_dmabuf()
468 bo->private = false; in vc4_bo_get_dmabuf()
469 util_hash_table_set(bo->screen->bo_handles, (void *)(uintptr_t)bo->handle, bo); in vc4_bo_get_dmabuf()
470 mtx_unlock(&bo->screen->bo_handles_mutex); in vc4_bo_get_dmabuf()
478 struct vc4_bo *bo; in vc4_bo_alloc_shader() local
481 bo = CALLOC_STRUCT(vc4_bo); in vc4_bo_alloc_shader()
482 if (!bo) in vc4_bo_alloc_shader()
485 pipe_reference_init(&bo->reference, 1); in vc4_bo_alloc_shader()
486 bo->screen = screen; in vc4_bo_alloc_shader()
487 bo->size = align(size, 4096); in vc4_bo_alloc_shader()
488 bo->name = "code"; in vc4_bo_alloc_shader()
489 bo->private = false; /* Make sure it doesn't go back to the cache. */ in vc4_bo_alloc_shader()
498 bo->handle = create.handle; in vc4_bo_alloc_shader()
506 screen->bo_size += bo->size; in vc4_bo_alloc_shader()
508 fprintf(stderr, "Allocated shader %dkb:\n", bo->size / 1024); in vc4_bo_alloc_shader()
512 return bo; in vc4_bo_alloc_shader()
516 vc4_bo_flink(struct vc4_bo *bo, uint32_t *name) in vc4_bo_flink() argument
519 .handle = bo->handle, in vc4_bo_flink()
521 int ret = vc4_ioctl(bo->screen->fd, DRM_IOCTL_GEM_FLINK, &flink); in vc4_bo_flink()
524 bo->handle, strerror(errno)); in vc4_bo_flink()
525 free(bo); in vc4_bo_flink()
529 bo->private = false; in vc4_bo_flink()
592 vc4_bo_wait(struct vc4_bo *bo, uint64_t timeout_ns, const char *reason) in vc4_bo_wait() argument
594 struct vc4_screen *screen = bo->screen; in vc4_bo_wait()
597 if (vc4_wait_bo_ioctl(screen->fd, bo->handle, 0) == -ETIME) { in vc4_bo_wait()
599 bo->name, reason); in vc4_bo_wait()
603 int ret = vc4_wait_bo_ioctl(screen->fd, bo->handle, timeout_ns); in vc4_bo_wait()
617 vc4_bo_map_unsynchronized(struct vc4_bo *bo) in vc4_bo_map_unsynchronized() argument
622 if (bo->map) in vc4_bo_map_unsynchronized()
623 return bo->map; in vc4_bo_map_unsynchronized()
627 map.handle = bo->handle; in vc4_bo_map_unsynchronized()
628 ret = vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_MMAP_BO, &map); in vc4_bo_map_unsynchronized()
635 bo->map = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, in vc4_bo_map_unsynchronized()
636 bo->screen->fd, offset); in vc4_bo_map_unsynchronized()
637 if (bo->map == MAP_FAILED) { in vc4_bo_map_unsynchronized()
639 bo->handle, (long long)offset, bo->size); in vc4_bo_map_unsynchronized()
642 VG(VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, false)); in vc4_bo_map_unsynchronized()
644 return bo->map; in vc4_bo_map_unsynchronized()
648 vc4_bo_map(struct vc4_bo *bo) in vc4_bo_map() argument
650 void *map = vc4_bo_map_unsynchronized(bo); in vc4_bo_map()
652 bool ok = vc4_bo_wait(bo, PIPE_TIMEOUT_INFINITE, "bo map"); in vc4_bo_map()