Lines Matching refs:bo
50 list_for_each_entry(struct v3d_bo, bo, &cache->time_list, time_list) {
52 cache_size += bo->size;
81 v3d_bo_remove_from_cache(struct v3d_bo_cache *cache, struct v3d_bo *bo)
83 list_del(&bo->time_list);
84 list_del(&bo->size_list);
96 struct v3d_bo *bo = NULL;
99 bo = list_first_entry(&cache->size_list[page_index],
106 if (!v3d_bo_wait(bo, 0, NULL)) {
111 pipe_reference_init(&bo->reference, 1);
112 v3d_bo_remove_from_cache(cache, bo);
114 bo->name = name;
117 return bo;
123 struct v3d_bo *bo;
132 bo = v3d_bo_from_cache(screen, size, name);
133 if (bo) {
139 return bo;
142 bo = CALLOC_STRUCT(v3d_bo);
143 if (!bo)
146 pipe_reference_init(&bo->reference, 1);
147 bo->screen = screen;
148 bo->size = size;
149 bo->name = name;
150 bo->private = true;
161 bo->handle = create.handle;
162 bo->offset = create.offset;
172 free(bo);
177 screen->bo_size += bo->size;
183 return bo;
187 v3d_bo_last_unreference(struct v3d_bo *bo)
189 struct v3d_screen *screen = bo->screen;
194 v3d_bo_last_unreference_locked_timed(bo, time.tv_sec);
199 v3d_bo_free(struct v3d_bo *bo)
201 struct v3d_screen *screen = bo->screen;
203 if (bo->map) {
204 if (using_v3d_simulator && bo->name &&
205 strcmp(bo->name, "winsys") == 0) {
206 free(bo->map);
208 munmap(bo->map, bo->size);
209 VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0));
215 c.handle = bo->handle;
218 fprintf(stderr, "close object %d: %s\n", bo->handle, strerror(errno));
221 screen->bo_size -= bo->size;
225 bo->name ? bo->name : "",
226 bo->name ? " " : "",
227 bo->size / 1024);
231 free(bo);
240 list_for_each_entry_safe(struct v3d_bo, bo, &cache->time_list,
243 if (time - bo->free_time > 2) {
249 v3d_bo_remove_from_cache(cache, bo);
250 v3d_bo_free(bo);
266 list_for_each_entry_safe(struct v3d_bo, bo, &cache->time_list,
268 v3d_bo_remove_from_cache(cache, bo);
269 v3d_bo_free(bo);
275 v3d_bo_last_unreference_locked_timed(struct v3d_bo *bo, time_t time)
277 struct v3d_screen *screen = bo->screen;
279 uint32_t page_index = bo->size / 4096 - 1;
281 if (!bo->private) {
282 v3d_bo_free(bo);
311 bo->free_time = time;
312 list_addtail(&bo->size_list, &cache->size_list[page_index]);
313 list_addtail(&bo->time_list, &cache->time_list);
316 bo->name, bo->size / 1024);
319 bo->name = NULL;
328 struct v3d_bo *bo;
334 bo = util_hash_table_get(screen->bo_handles, (void*)(uintptr_t)handle);
335 if (bo) {
336 pipe_reference(NULL, &bo->reference);
340 bo = CALLOC_STRUCT(v3d_bo);
341 pipe_reference_init(&bo->reference, 1);
342 bo->screen = screen;
343 bo->handle = handle;
344 bo->size = size;
345 bo->name = "winsys";
346 bo->private = false;
349 v3d_simulator_open_from_handle(screen->fd, bo->handle, bo->size);
350 bo->map = malloc(bo->size);
360 free(bo->map);
361 free(bo);
362 bo = NULL;
365 bo->offset = get.offset;
366 assert(bo->offset != 0);
368 _mesa_hash_table_insert(screen->bo_handles, (void *)(uintptr_t)handle, bo);
371 screen->bo_size += bo->size;
375 return bo;
386 fprintf(stderr, "Failed to open bo %d: %s\n",
405 /* Determine the size of the bo we were handed. */
416 v3d_bo_get_dmabuf(struct v3d_bo *bo)
419 int ret = drmPrimeHandleToFD(bo->screen->fd, bo->handle,
422 fprintf(stderr, "Failed to export gem bo %d to dmabuf\n",
423 bo->handle);
427 mtx_lock(&bo->screen->bo_handles_mutex);
428 bo->private = false;
429 _mesa_hash_table_insert(bo->screen->bo_handles, (void *)(uintptr_t)bo->handle, bo);
430 mtx_unlock(&bo->screen->bo_handles_mutex);
436 v3d_bo_flink(struct v3d_bo *bo, uint32_t *name)
439 .handle = bo->handle,
441 int ret = v3d_ioctl(bo->screen->fd, DRM_IOCTL_GEM_FLINK, &flink);
443 fprintf(stderr, "Failed to flink bo %d: %s\n",
444 bo->handle, strerror(errno));
445 free(bo);
449 bo->private = false;
470 v3d_bo_wait(struct v3d_bo *bo, uint64_t timeout_ns, const char *reason)
472 struct v3d_screen *screen = bo->screen;
475 if (v3d_wait_bo_ioctl(screen->fd, bo->handle, 0) == -ETIME) {
477 bo->name, reason);
481 int ret = v3d_wait_bo_ioctl(screen->fd, bo->handle, timeout_ns);
495 v3d_bo_map_unsynchronized(struct v3d_bo *bo)
500 if (bo->map)
501 return bo->map;
505 map.handle = bo->handle;
506 ret = v3d_ioctl(bo->screen->fd, DRM_IOCTL_V3D_MMAP_BO, &map);
513 bo->map = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
514 bo->screen->fd, offset);
515 if (bo->map == MAP_FAILED) {
516 fprintf(stderr, "mmap of bo %d (offset 0x%016llx, size %d) failed\n",
517 bo->handle, (long long)offset, bo->size);
520 VG(VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, false));
522 return bo->map;
526 v3d_bo_map(struct v3d_bo *bo)
528 void *map = v3d_bo_map_unsynchronized(bo);
530 bool ok = v3d_bo_wait(bo, PIPE_TIMEOUT_INFINITE, "bo map");