Lines Matching refs:rsc
71 struct fd_resource *rsc) assert_dt
73 struct pipe_resource *prsc = &rsc->b.b;
76 ctx->rebind_resource(ctx, rsc);
79 if (rsc->dirty & FD_DIRTY_VTXBUF) {
91 if (!(rsc->dirty & per_stage_dirty))
99 if ((rsc->dirty & FD_DIRTY_CONST) &&
112 if ((rsc->dirty & FD_DIRTY_TEX) &&
124 if ((rsc->dirty & FD_DIRTY_IMAGE) &&
137 if ((rsc->dirty & FD_DIRTY_SSBO) &&
152 rebind_resource(struct fd_resource *rsc) assert_dt
154 struct fd_screen *screen = fd_screen(rsc->b.b.screen);
157 fd_resource_lock(rsc);
159 if (rsc->dirty)
161 rebind_resource_in_ctx(ctx, rsc);
163 fd_resource_unlock(rsc);
168 fd_resource_set_bo(struct fd_resource *rsc, struct fd_bo *bo)
170 struct fd_screen *screen = fd_screen(rsc->b.b.screen);
172 rsc->bo = bo;
173 rsc->seqno = p_atomic_inc_return(&screen->rsc_seqno);
177 __fd_resource_wait(struct fd_context *ctx, struct fd_resource *rsc, unsigned op,
181 return fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
186 PRSC_ARGS(&rsc->b.b)) {
187 ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
194 realloc_bo(struct fd_resource *rsc, uint32_t size)
196 struct pipe_resource *prsc = &rsc->b.b;
197 struct fd_screen *screen = fd_screen(rsc->b.b.screen);
199 COND(rsc->layout.tile_mode, FD_BO_NOMAP) |
209 if (rsc->bo)
210 fd_bo_del(rsc->bo);
214 prsc->height0, prsc->depth0, rsc->layout.cpp, prsc->bind);
215 fd_resource_set_bo(rsc, bo);
224 if (rsc->layout.ubwc) {
225 rsc->needs_ubwc_clear = true;
228 util_range_set_empty(&rsc->valid_buffer_range);
229 fd_bc_invalidate_resource(rsc, true);
269 * cases, like a rsc that is in a batch-cache key...
280 * should empty/destroy rsc->batches hashset)
322 struct fd_resource *rsc = fd_resource(prsc);
324 if (pending(rsc, !!(usage & PIPE_MAP_WRITE)))
327 if (resource_busy(rsc, translate_usage(usage)))
333 static void flush_resource(struct fd_context *ctx, struct fd_resource *rsc,
351 * @rsc: the resource to shadow
357 fd_try_shadow_resource(struct fd_context *ctx, struct fd_resource *rsc,
362 struct pipe_resource *prsc = &rsc->b.b;
374 fd_bc_flush_writer(ctx, rsc);
377 * batch, we need to flush any batches that reference this rsc as
385 foreach_batch (batch, &screen->batch_cache, rsc->track->bc_batch_mask) {
421 * should empty/destroy rsc->batches hashset)
423 fd_bc_invalidate_resource(rsc, false);
424 rebind_resource(rsc);
438 DBG("shadow: %p (%d, %p) -> %p (%d, %p)", rsc, rsc->b.b.reference.count,
439 rsc->track, shadow, shadow->b.b.reference.count, shadow->track);
441 swap(rsc->bo, shadow->bo);
442 swap(rsc->valid, shadow->valid);
446 shadow->needs_ubwc_clear = rsc->needs_ubwc_clear;
447 rsc->needs_ubwc_clear = temp;
449 swap(rsc->layout, shadow->layout);
450 rsc->seqno = p_atomic_inc_return(&ctx->screen->rsc_seqno);
453 * by any batches, but the existing rsc (probably) is. We need to
457 foreach_batch (batch, &ctx->screen->batch_cache, rsc->track->batch_mask) {
458 struct set_entry *entry = _mesa_set_search_pre_hashed(batch->resources, rsc->hash, rsc);
462 swap(rsc->track, shadow->track);
552 fd_resource_uncompress(struct fd_context *ctx, struct fd_resource *rsc, bool linear)
558 bool success = fd_try_shadow_resource(ctx, rsc, 0, NULL, modifier);
568 fd_resource_dump(struct fd_resource *rsc, const char *name)
570 fd_bo_cpu_prep(rsc->bo, NULL, FD_BO_PREP_READ);
572 dump_hex(fd_bo_map(rsc->bo), fd_bo_size(rsc->bo));
576 fd_alloc_staging(struct fd_context *ctx, struct fd_resource *rsc,
581 struct pipe_resource tmpl = rsc->b.b;
664 struct fd_resource *rsc = fd_resource(ptrans->resource);
667 util_range_add(&rsc->b.b, &rsc->valid_buffer_range,
673 flush_resource(struct fd_context *ctx, struct fd_resource *rsc,
677 fd_bc_flush_readers(ctx, rsc);
679 fd_bc_flush_writer(ctx, rsc);
688 struct fd_resource *rsc = fd_resource(prsc);
690 flush_resource(ctx, rsc, PIPE_MAP_READ);
695 fd_resource_wait(ctx, rsc, FD_BO_PREP_FLUSH);
704 struct fd_resource *rsc = fd_resource(ptrans->resource);
714 fd_bo_cpu_fini(rsc->bo);
717 util_range_add(&rsc->b.b, &rsc->valid_buffer_range, ptrans->box.x,
731 invalidate_resource(struct fd_resource *rsc, unsigned usage) assert_dt
733 bool needs_flush = pending(rsc, !!(usage & PIPE_MAP_WRITE));
736 if (needs_flush || resource_busy(rsc, op)) {
737 rebind_resource(rsc);
738 realloc_bo(rsc, fd_bo_size(rsc->bo));
740 util_range_set_empty(&rsc->valid_buffer_range);
753 struct fd_resource *rsc = fd_resource(prsc);
758 staging_rsc = fd_alloc_staging(ctx, rsc, level, box);
787 struct fd_resource *rsc = fd_resource(prsc);
792 buf = fd_bo_map(rsc->bo);
804 box->x / util_format_get_blockwidth(format) * rsc->layout.cpp +
805 fd_resource_offset(rsc, level, box->z);
808 rsc->valid = true;
825 struct fd_resource *rsc = fd_resource(prsc);
835 if (!rsc->valid)
844 if (rsc->layout.tile_mode) {
846 } else if ((usage & PIPE_MAP_READ) && !fd_bo_is_cached(rsc->bo)) {
852 invalidate_resource(rsc, usage);
855 bool needs_flush = pending(rsc, !!(usage & PIPE_MAP_WRITE));
860 bool busy = needs_flush || resource_busy(rsc, op);
875 if (needs_flush && fd_try_shadow_resource(ctx, rsc, level, box,
883 flush_resource(ctx, rsc, usage);
893 staging_rsc = fd_alloc_staging(ctx, rsc, level, box);
913 flush_resource(ctx, rsc, usage);
922 ret = fd_resource_wait(ctx, rsc, op);
932 improve_transfer_map_usage(struct fd_context *ctx, struct fd_resource *rsc,
950 } else if ((usage & PIPE_MAP_WRITE) && (rsc->b.b.target == PIPE_BUFFER) &&
951 !util_ranges_intersect(&rsc->valid_buffer_range, box->x,
970 struct fd_resource *rsc = fd_resource(prsc);
977 if ((usage & PIPE_MAP_DIRECTLY) && rsc->layout.tile_mode) {
993 usage = improve_transfer_map_usage(ctx, rsc, usage, box);
999 ptrans->stride = fd_resource_pitch(rsc, level);
1000 ptrans->layer_stride = fd_resource_layer_stride(rsc, level);
1022 struct fd_resource *rsc = fd_resource(prsc);
1024 if (!rsc->is_replacement)
1025 fd_bc_invalidate_resource(rsc, true);
1026 if (rsc->bo)
1027 fd_bo_del(rsc->bo);
1028 if (rsc->lrz)
1029 fd_bo_del(rsc->lrz);
1030 if (rsc->scanout)
1031 renderonly_scanout_destroy(rsc->scanout, fd_screen(pscreen)->ro);
1034 util_idalloc_mt_free(&screen->buffer_ids, rsc->b.buffer_id_unique);
1038 util_range_destroy(&rsc->valid_buffer_range);
1039 simple_mtx_destroy(&rsc->lock);
1040 fd_resource_tracking_reference(&rsc->track, NULL);
1042 FREE(rsc);
1046 fd_resource_modifier(struct fd_resource *rsc)
1048 if (!rsc->layout.tile_mode)
1051 if (rsc->layout.ubwc_layer_size)
1063 struct fd_resource *rsc = fd_resource(prsc);
1065 rsc->b.is_shared = true;
1067 handle->modifier = fd_resource_modifier(rsc);
1071 return fd_screen_bo_get_handle(pscreen, rsc->bo, rsc->scanout,
1072 fd_resource_pitch(rsc, 0), handle);
1079 struct fd_resource *rsc = fd_resource(prsc);
1086 realloc_bo(rsc, fd_screen(prsc->screen)->setup_slices(rsc));
1092 struct fd_resource *rsc = fd_resource(prsc);
1093 struct fdl_layout *layout = &rsc->layout;
1111 struct fd_resource *rsc = CALLOC_STRUCT(fd_resource);
1113 if (!rsc)
1116 struct pipe_resource *prsc = &rsc->b.b;
1121 rsc->hash = _mesa_hash_pointer(rsc);
1123 util_range_init(&rsc->valid_buffer_range);
1124 simple_mtx_init(&rsc->lock, mtx_plain);
1126 rsc->track = CALLOC_STRUCT(fd_resource_tracking);
1127 if (!rsc->track) {
1128 free(rsc);
1132 pipe_reference_init(&rsc->track->reference, 1);
1137 rsc->b.buffer_id_unique = util_idalloc_mt_alloc(&screen->buffer_ids);
1139 return rsc;
1237 struct fd_resource *rsc;
1242 rsc = alloc_resource_struct(pscreen, tmpl);
1243 if (!rsc)
1246 prsc = &rsc->b.b;
1255 rsc->b.is_shared = true;
1267 rsc->layout.tile_mode = screen->tile_mode(prsc);
1269 rsc->layout.ubwc = true;
1271 rsc->internal_format = format;
1276 fdl_layout_buffer(&rsc->layout, size);
1278 size = screen->setup_slices(rsc);
1292 if (rsc->layout.layer_first && !rsc->layout.layer_size) {
1293 rsc->layout.layer_size = align(size, 4096);
1294 size = rsc->layout.layer_size * prsc->array_size;
1298 fdl_dump_layout(&rsc->layout);
1316 struct fd_resource *rsc;
1342 rsc = fd_resource(pscreen->resource_from_handle(
1345 if (!rsc)
1348 return &rsc->b.b;
1355 rsc = fd_resource(prsc);
1357 realloc_bo(rsc, size);
1358 if (!rsc->bo)
1386 struct fd_resource *rsc = alloc_resource_struct(pscreen, tmpl);
1388 if (!rsc)
1391 struct fdl_slice *slice = fd_resource_slice(rsc, 0);
1392 struct pipe_resource *prsc = &rsc->b.b;
1396 rsc->b.is_shared = true;
1404 fd_resource_set_bo(rsc, bo);
1406 rsc->internal_format = tmpl->format;
1407 rsc->layout.layer_first = true;
1408 rsc->layout.pitch0 = handle->stride;
1418 rsc->layout.pitchalign =
1419 fdl_cpp_shift(&rsc->layout) + util_logbase2(screen->info->gmem_align_w);
1424 rsc->layout.pitchalign = MAX2(rsc->layout.pitchalign, 6);
1426 rsc->layout.pitchalign = MAX2(rsc->layout.pitchalign, 5);
1428 if (rsc->layout.pitch0 < (prsc->width0 * rsc->layout.cpp) ||
1429 fd_resource_pitch(rsc, 0) != rsc->layout.pitch0)
1432 assert(rsc->layout.cpp);
1434 if (screen->layout_resource_for_modifier(rsc, handle->modifier) < 0)
1438 rsc->scanout =
1443 rsc->valid = true;
1477 struct fd_resource *rsc = fd_resource(prsc);
1482 invalidate_resource(rsc, PIPE_MAP_READ | PIPE_MAP_WRITE);
1483 } else if (rsc->track->write_batch) {
1488 struct fd_batch *batch = rsc->track->write_batch;
1504 rsc->valid = false;
1523 struct fd_resource *rsc = fd_resource(prsc);
1524 if (rsc->stencil)
1525 return &rsc->stencil->b.b;
1545 fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
1569 struct fd_resource *rsc;
1587 rsc = fd_resource(prsc);
1588 rsc->b.is_shared = true;
1599 fd_resource_set_bo(rsc, fd_bo_ref(memobj->bo));