Lines Matching refs:bo

52 vc4_bo_label(struct vc4_screen *screen, struct vc4_bo *bo, const char *fmt, ...)
68 .handle = bo->handle,
108 vc4_bo_remove_from_cache(struct vc4_bo_cache *cache, struct vc4_bo *bo)
110 list_del(&bo->time_list);
111 list_del(&bo->size_list);
113 cache->bo_size -= bo->size;
116 static void vc4_bo_purgeable(struct vc4_bo *bo)
119 .handle = bo->handle,
123 if (bo->screen->has_madvise)
124 vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_GEM_MADVISE, &arg);
127 static bool vc4_bo_unpurgeable(struct vc4_bo *bo)
130 .handle = bo->handle,
134 if (!bo->screen->has_madvise)
137 if (vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_GEM_MADVISE, &arg))
144 vc4_bo_free(struct vc4_bo *bo)
146 struct vc4_screen *screen = bo->screen;
148 if (bo->map) {
149 if (using_vc4_simulator && bo->name &&
150 strcmp(bo->name, "winsys") == 0) {
151 free(bo->map);
153 munmap(bo->map, bo->size);
154 VG(VALGRIND_FREELIKE_BLOCK(bo->map, 0));
160 c.handle = bo->handle;
163 fprintf(stderr, "close object %d: %s\n", bo->handle, strerror(errno));
166 screen->bo_size -= bo->size;
170 bo->name ? bo->name : "",
171 bo->name ? " " : "",
172 bo->size / 1024);
176 free(bo);
184 struct vc4_bo *iter, *tmp, *bo = NULL;
208 bo = iter;
209 pipe_reference_init(&bo->reference, 1);
210 vc4_bo_remove_from_cache(cache, bo);
212 vc4_bo_label(screen, bo, "%s", name);
213 bo->name = name;
217 return bo;
225 struct vc4_bo *bo;
230 bo = vc4_bo_from_cache(screen, size, name);
231 if (bo) {
237 return bo;
240 bo = CALLOC_STRUCT(vc4_bo);
241 if (!bo)
244 pipe_reference_init(&bo->reference, 1);
245 bo->screen = screen;
246 bo->size = size;
247 bo->name = name;
248 bo->private = true;
255 bo->handle = create.handle;
265 free(bo);
270 screen->bo_size += bo->size;
276 vc4_bo_label(screen, bo, "%s", name);
278 return bo;
282 vc4_bo_last_unreference(struct vc4_bo *bo)
284 struct vc4_screen *screen = bo->screen;
289 vc4_bo_last_unreference_locked_timed(bo, time.tv_sec);
299 list_for_each_entry_safe(struct vc4_bo, bo, &cache->time_list,
308 if (time - bo->free_time > 2) {
309 vc4_bo_remove_from_cache(cache, bo);
310 vc4_bo_free(bo);
326 list_for_each_entry_safe(struct vc4_bo, bo, &cache->time_list,
328 vc4_bo_remove_from_cache(cache, bo);
329 vc4_bo_free(bo);
335 vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time)
337 struct vc4_screen *screen = bo->screen;
339 uint32_t page_index = bo->size / 4096 - 1;
341 if (!bo->private) {
342 vc4_bo_free(bo);
362 vc4_bo_purgeable(bo);
363 bo->free_time = time;
364 list_addtail(&bo->size_list, &cache->size_list[page_index]);
365 list_addtail(&bo->time_list, &cache->time_list);
367 cache->bo_size += bo->size;
370 bo->name, bo->size / 1024);
373 bo->name = NULL;
374 vc4_bo_label(screen, bo, "mesa cache");
383 struct vc4_bo *bo;
389 bo = util_hash_table_get(screen->bo_handles, (void*)(uintptr_t)handle);
390 if (bo) {
391 vc4_bo_reference(bo);
395 bo = CALLOC_STRUCT(vc4_bo);
396 pipe_reference_init(&bo->reference, 1);
397 bo->screen = screen;
398 bo->handle = handle;
399 bo->size = size;
400 bo->name = "winsys";
401 bo->private = false;
404 vc4_simulator_open_from_handle(screen->fd, bo->handle, bo->size);
405 bo->map = malloc(bo->size);
408 _mesa_hash_table_insert(screen->bo_handles, (void *)(uintptr_t)handle, bo);
412 return bo;
423 fprintf(stderr, "Failed to open bo %d: %s\n",
442 /* Determine the size of the bo we were handed. */
453 vc4_bo_get_dmabuf(struct vc4_bo *bo)
456 int ret = drmPrimeHandleToFD(bo->screen->fd, bo->handle,
459 fprintf(stderr, "Failed to export gem bo %d to dmabuf\n",
460 bo->handle);
464 mtx_lock(&bo->screen->bo_handles_mutex);
465 bo->private = false;
466 _mesa_hash_table_insert(bo->screen->bo_handles, (void *)(uintptr_t)bo->handle, bo);
467 mtx_unlock(&bo->screen->bo_handles_mutex);
475 struct vc4_bo *bo;
478 bo = CALLOC_STRUCT(vc4_bo);
479 if (!bo)
482 pipe_reference_init(&bo->reference, 1);
483 bo->screen = screen;
484 bo->size = align(size, 4096);
485 bo->name = "code";
486 bo->private = false; /* Make sure it doesn't go back to the cache. */
495 bo->handle = create.handle;
503 screen->bo_size += bo->size;
505 fprintf(stderr, "Allocated shader %dkb:\n", bo->size / 1024);
509 return bo;
513 vc4_bo_flink(struct vc4_bo *bo, uint32_t *name)
516 .handle = bo->handle,
518 int ret = vc4_ioctl(bo->screen->fd, DRM_IOCTL_GEM_FLINK, &flink);
520 fprintf(stderr, "Failed to flink bo %d: %s\n",
521 bo->handle, strerror(errno));
522 free(bo);
526 bo->private = false;
589 vc4_bo_wait(struct vc4_bo *bo, uint64_t timeout_ns, const char *reason)
591 struct vc4_screen *screen = bo->screen;
594 if (vc4_wait_bo_ioctl(screen->fd, bo->handle, 0) == -ETIME) {
596 bo->name, reason);
600 int ret = vc4_wait_bo_ioctl(screen->fd, bo->handle, timeout_ns);
614 vc4_bo_map_unsynchronized(struct vc4_bo *bo)
619 if (bo->map)
620 return bo->map;
624 map.handle = bo->handle;
625 ret = vc4_ioctl(bo->screen->fd, DRM_IOCTL_VC4_MMAP_BO, &map);
632 bo->map = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
633 bo->screen->fd, offset);
634 if (bo->map == MAP_FAILED) {
635 fprintf(stderr, "mmap of bo %d (offset 0x%016llx, size %d) failed\n",
636 bo->handle, (long long)offset, bo->size);
639 VG(VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, false));
641 return bo->map;
645 vc4_bo_map(struct vc4_bo *bo)
647 void *map = vc4_bo_map_unsynchronized(bo);
649 bool ok = vc4_bo_wait(bo, PIPE_TIMEOUT_INFINITE, "bo map");