Lines Matching refs:backing
51 * Sub-allocation information for a real buffer used as backing memory of a
66 struct zink_sparse_backing *backing;
320 * Attempt to allocate the given number of backing pages. Fewer pages may be
321 * allocated (depending on the fragmentation of existing backing buffers),
337 list_for_each_entry(struct zink_sparse_backing, backing, &bo->u.sparse.backing, list) {
338 for (unsigned idx = 0; idx < backing->num_chunks; ++idx) {
339 uint32_t cur_num_pages = backing->chunks[idx].end - backing->chunks[idx].begin;
342 best_backing = backing;
349 /* Allocate a new backing buffer if necessary. */
390 list_add(&best_backing->list, &bo->u.sparse.backing);
412 struct zink_sparse_backing *backing)
414 bo->u.sparse.num_backing_pages -= backing->bo->base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE;
416 list_del(&backing->list);
417 zink_bo_unref(screen, backing->bo);
418 FREE(backing->chunks);
419 FREE(backing);
423 * Return a range of pages from the given backing buffer back into the
428 struct zink_sparse_backing *backing,
433 unsigned high = backing->num_chunks;
439 if (backing->chunks[mid].begin >= start_page)
445 assert(low >= backing->num_chunks || end_page <= backing->chunks[low].begin);
446 assert(low == 0 || backing->chunks[low - 1].end <= start_page);
448 if (low > 0 && backing->chunks[low - 1].end == start_page) {
449 backing->chunks[low - 1].end = end_page;
451 if (low < backing->num_chunks && end_page == backing->chunks[low].begin) {
452 backing->chunks[low - 1].end = backing->chunks[low].end;
453 memmove(&backing->chunks[low], &backing->chunks[low + 1],
454 sizeof(*backing->chunks) * (backing->num_chunks - low - 1));
455 backing->num_chunks--;
457 } else if (low < backing->num_chunks && end_page == backing->chunks[low].begin) {
458 backing->chunks[low].begin = start_page;
460 if (backing->num_chunks >= backing->max_chunks) {
461 unsigned new_max_chunks = 2 * backing->max_chunks;
463 REALLOC(backing->chunks,
464 sizeof(*backing->chunks) * backing->max_chunks,
465 sizeof(*backing->chunks) * new_max_chunks);
469 backing->max_chunks = new_max_chunks;
470 backing->chunks = new_chunks;
473 memmove(&backing->chunks[low + 1], &backing->chunks[low],
474 sizeof(*backing->chunks) * (backing->num_chunks - low));
475 backing->chunks[low].begin = start_page;
476 backing->chunks[low].end = end_page;
477 backing->num_chunks++;
480 if (backing->num_chunks == 1 && backing->chunks[0].begin == 0 &&
481 backing->chunks[0].end == backing->bo->base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE)
482 sparse_free_backing_buffer(screen, bo, backing);
494 while (!list_is_empty(&bo->u.sparse.backing)) {
496 container_of(bo->u.sparse.backing.next,
542 list_inithead(&bo->u.sparse.backing);
780 if (comm[va_page].backing) {
787 while (va_page < end_va_page && !comm[va_page].backing)
790 /* Fill the uncommitted span with chunks of backing memory. */
792 struct zink_sparse_backing *backing;
796 backing = sparse_backing_alloc(screen, bo, &backing_start, &backing_size);
797 if (!backing) {
801 cur_sem = buffer_commit_single(screen, res, backing->bo, backing_start,
805 ok = sparse_backing_free(screen, bo, backing, backing_start, backing_size);
813 comm[span_va_page].backing = backing;
825 struct zink_sparse_backing *backing;
830 if (!comm[va_page].backing) {
847 backing = comm[va_page].backing;
849 comm[va_page].backing = NULL;
855 comm[va_page].backing == backing &&
857 comm[va_page].backing = NULL;
862 if (!sparse_backing_free(screen, bo, backing, backing_start, span_pages)) {
864 fprintf(stderr, "zink: leaking sparse backing memory\n");
967 struct zink_sparse_backing *backing[NUM_BATCHED_BINDS];
1007 if (comm[va_page].backing) {
1014 while (va_page < end_va_page && !comm[va_page].backing)
1017 /* Fill the uncommitted span with chunks of backing memory. */
1020 backing[i] = sparse_backing_alloc(screen, bo, &backing_start[i], &backing_size[i]);
1021 if (!backing[i]) {
1027 cur_sem = texture_commit_miptail(screen, res, backing[i]->bo, backing_start[i], offset, commit, cur_sem);
1031 ibind[i].memory = backing[i]->bo->mem ? backing[i]->bo->mem : backing[i]->bo->u.slab.real->mem;
1033 (backing[i]->bo->mem ? 0 : backing[i]->bo->offset);
1038 comm[span_va_page].backing = backing[i];
1053 if (!comm[va_page].backing) {
1059 backing[i] = comm[va_page].backing;
1061 comm[va_page].backing = NULL;
1067 comm[va_page].backing == backing[i] &&
1069 comm[va_page].backing = NULL;
1088 ok = sparse_backing_free(screen, backing[s]->bo, backing[s], backing_start[s], backing_size[s]);
1091 fprintf(stderr, "zink: leaking sparse backing memory\n");
1107 ok = sparse_backing_free(screen, backing[s]->bo, backing[s], backing_start[s], backing_size[s]);
1110 fprintf(stderr, "zink: leaking sparse backing memory\n");
1191 * anything if we allocated only twice the power of two for the backing buffer: