Lines Matching refs:bo
82 vc5_bo_remove_from_cache(struct vc5_bo_cache *cache, struct vc5_bo *bo) in vc5_bo_remove_from_cache() argument
84 list_del(&bo->time_list); in vc5_bo_remove_from_cache()
85 list_del(&bo->size_list); in vc5_bo_remove_from_cache()
87 cache->bo_size -= bo->size; in vc5_bo_remove_from_cache()
99 struct vc5_bo *bo = NULL; in vc5_bo_from_cache() local
102 bo = LIST_ENTRY(struct vc5_bo, cache->size_list[page_index].next, in vc5_bo_from_cache()
109 if (!vc5_bo_wait(bo, 0, NULL)) { in vc5_bo_from_cache()
114 pipe_reference_init(&bo->reference, 1); in vc5_bo_from_cache()
115 vc5_bo_remove_from_cache(cache, bo); in vc5_bo_from_cache()
117 bo->name = name; in vc5_bo_from_cache()
120 return bo; in vc5_bo_from_cache()
126 struct vc5_bo *bo; in vc5_bo_alloc() local
131 bo = vc5_bo_from_cache(screen, size, name); in vc5_bo_alloc()
132 if (bo) { in vc5_bo_alloc()
138 return bo; in vc5_bo_alloc()
141 bo = CALLOC_STRUCT(vc5_bo); in vc5_bo_alloc()
142 if (!bo) in vc5_bo_alloc()
145 pipe_reference_init(&bo->reference, 1); in vc5_bo_alloc()
146 bo->screen = screen; in vc5_bo_alloc()
147 bo->size = size; in vc5_bo_alloc()
148 bo->name = name; in vc5_bo_alloc()
149 bo->private = true; in vc5_bo_alloc()
160 bo->handle = create.handle; in vc5_bo_alloc()
161 bo->offset = create.offset; in vc5_bo_alloc()
171 free(bo); in vc5_bo_alloc()
176 screen->bo_size += bo->size; in vc5_bo_alloc()
182 return bo; in vc5_bo_alloc()
186 vc5_bo_last_unreference(struct vc5_bo *bo) in vc5_bo_last_unreference() argument
188 struct vc5_screen *screen = bo->screen; in vc5_bo_last_unreference()
193 vc5_bo_last_unreference_locked_timed(bo, time.tv_sec); in vc5_bo_last_unreference()
198 vc5_bo_free(struct vc5_bo *bo) in vc5_bo_free() argument
200 struct vc5_screen *screen = bo->screen; in vc5_bo_free()
202 if (bo->map) { in vc5_bo_free()
203 if (using_vc5_simulator && bo->name && in vc5_bo_free()
204 strcmp(bo->name, "winsys") == 0) { in vc5_bo_free()
205 free(bo->map); in vc5_bo_free()
207 munmap(bo->map, bo->size); in vc5_bo_free()
208 VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0)); in vc5_bo_free()
214 c.handle = bo->handle; in vc5_bo_free()
217 fprintf(stderr, "close object %d: %s\n", bo->handle, strerror(errno)); in vc5_bo_free()
220 screen->bo_size -= bo->size; in vc5_bo_free()
224 bo->name ? bo->name : "", in vc5_bo_free()
225 bo->name ? " " : "", in vc5_bo_free()
226 bo->size / 1024); in vc5_bo_free()
230 free(bo); in vc5_bo_free()
239 list_for_each_entry_safe(struct vc5_bo, bo, &cache->time_list, in free_stale_bos()
248 if (time - bo->free_time > 2) { in free_stale_bos()
249 vc5_bo_remove_from_cache(cache, bo); in free_stale_bos()
250 vc5_bo_free(bo); in free_stale_bos()
266 list_for_each_entry_safe(struct vc5_bo, bo, &cache->time_list, in vc5_bo_cache_free_all()
268 vc5_bo_remove_from_cache(cache, bo); in vc5_bo_cache_free_all()
269 vc5_bo_free(bo); in vc5_bo_cache_free_all()
275 vc5_bo_last_unreference_locked_timed(struct vc5_bo *bo, time_t time) in vc5_bo_last_unreference_locked_timed() argument
277 struct vc5_screen *screen = bo->screen; in vc5_bo_last_unreference_locked_timed()
279 uint32_t page_index = bo->size / 4096 - 1; in vc5_bo_last_unreference_locked_timed()
281 if (!bo->private) { in vc5_bo_last_unreference_locked_timed()
282 vc5_bo_free(bo); in vc5_bo_last_unreference_locked_timed()
311 bo->free_time = time; in vc5_bo_last_unreference_locked_timed()
312 list_addtail(&bo->size_list, &cache->size_list[page_index]); in vc5_bo_last_unreference_locked_timed()
313 list_addtail(&bo->time_list, &cache->time_list); in vc5_bo_last_unreference_locked_timed()
315 cache->bo_size += bo->size; in vc5_bo_last_unreference_locked_timed()
318 bo->name, bo->size / 1024); in vc5_bo_last_unreference_locked_timed()
321 bo->name = NULL; in vc5_bo_last_unreference_locked_timed()
331 struct vc5_bo *bo; in vc5_bo_open_handle() local
337 bo = util_hash_table_get(screen->bo_handles, (void*)(uintptr_t)handle); in vc5_bo_open_handle()
338 if (bo) { in vc5_bo_open_handle()
339 pipe_reference(NULL, &bo->reference); in vc5_bo_open_handle()
343 bo = CALLOC_STRUCT(vc5_bo); in vc5_bo_open_handle()
344 pipe_reference_init(&bo->reference, 1); in vc5_bo_open_handle()
345 bo->screen = screen; in vc5_bo_open_handle()
346 bo->handle = handle; in vc5_bo_open_handle()
347 bo->size = size; in vc5_bo_open_handle()
348 bo->name = "winsys"; in vc5_bo_open_handle()
349 bo->private = false; in vc5_bo_open_handle()
353 bo->handle, bo->size); in vc5_bo_open_handle()
354 bo->map = malloc(bo->size); in vc5_bo_open_handle()
357 util_hash_table_set(screen->bo_handles, (void *)(uintptr_t)handle, bo); in vc5_bo_open_handle()
361 return bo; in vc5_bo_open_handle()
403 vc5_bo_get_dmabuf(struct vc5_bo *bo) in vc5_bo_get_dmabuf() argument
406 int ret = drmPrimeHandleToFD(bo->screen->fd, bo->handle, in vc5_bo_get_dmabuf()
410 bo->handle); in vc5_bo_get_dmabuf()
414 mtx_lock(&bo->screen->bo_handles_mutex); in vc5_bo_get_dmabuf()
415 bo->private = false; in vc5_bo_get_dmabuf()
416 util_hash_table_set(bo->screen->bo_handles, (void *)(uintptr_t)bo->handle, bo); in vc5_bo_get_dmabuf()
417 mtx_unlock(&bo->screen->bo_handles_mutex); in vc5_bo_get_dmabuf()
423 vc5_bo_flink(struct vc5_bo *bo, uint32_t *name) in vc5_bo_flink() argument
426 .handle = bo->handle, in vc5_bo_flink()
428 int ret = vc5_ioctl(bo->screen->fd, DRM_IOCTL_GEM_FLINK, &flink); in vc5_bo_flink()
431 bo->handle, strerror(errno)); in vc5_bo_flink()
432 free(bo); in vc5_bo_flink()
436 bo->private = false; in vc5_bo_flink()
499 vc5_bo_wait(struct vc5_bo *bo, uint64_t timeout_ns, const char *reason) in vc5_bo_wait() argument
501 struct vc5_screen *screen = bo->screen; in vc5_bo_wait()
504 if (vc5_wait_bo_ioctl(screen->fd, bo->handle, 0) == -ETIME) { in vc5_bo_wait()
506 bo->name, reason); in vc5_bo_wait()
510 int ret = vc5_wait_bo_ioctl(screen->fd, bo->handle, timeout_ns); in vc5_bo_wait()
524 vc5_bo_map_unsynchronized(struct vc5_bo *bo) in vc5_bo_map_unsynchronized() argument
529 if (bo->map) in vc5_bo_map_unsynchronized()
530 return bo->map; in vc5_bo_map_unsynchronized()
534 map.handle = bo->handle; in vc5_bo_map_unsynchronized()
535 ret = vc5_ioctl(bo->screen->fd, DRM_IOCTL_VC5_MMAP_BO, &map); in vc5_bo_map_unsynchronized()
542 bo->map = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, in vc5_bo_map_unsynchronized()
543 bo->screen->fd, offset); in vc5_bo_map_unsynchronized()
544 if (bo->map == MAP_FAILED) { in vc5_bo_map_unsynchronized()
546 bo->handle, (long long)offset, bo->size); in vc5_bo_map_unsynchronized()
549 VG(VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, false)); in vc5_bo_map_unsynchronized()
551 return bo->map; in vc5_bo_map_unsynchronized()
555 vc5_bo_map(struct vc5_bo *bo) in vc5_bo_map() argument
557 void *map = vc5_bo_map_unsynchronized(bo); in vc5_bo_map()
559 bool ok = vc5_bo_wait(bo, PIPE_TIMEOUT_INFINITE, "bo map"); in vc5_bo_map()