fd_bc_invalidate_resource(dst, true);
rebind_resource(dst);
+ util_idalloc_mt_free(&ctx->screen->buffer_ids, delete_buffer_id);
+
fd_screen_lock(ctx->screen);
fd_bo_del(dst->bo);
fd_screen_unlock(ctx->screen);
}
+static unsigned
+translate_usage(unsigned usage)
+{
+ uint32_t op = 0;
+
+ if (usage & PIPE_MAP_READ)
+ op |= FD_BO_PREP_READ;
+
+ if (usage & PIPE_MAP_WRITE)
+ op |= FD_BO_PREP_WRITE;
+
+ return op;
+}
+
+bool
+fd_resource_busy(struct pipe_screen *pscreen, struct pipe_resource *prsc,
+ unsigned usage)
+{
+ struct fd_resource *rsc = fd_resource(prsc);
+
+ if (pending(rsc, !!(usage & PIPE_MAP_WRITE)))
+ return true;
+
+ if (resource_busy(rsc, translate_usage(usage)))
+ return true;
+
+ return false;
+}
+
static void flush_resource(struct fd_context *ctx, struct fd_resource *rsc,
unsigned usage);
slab_free(&ctx->transfer_pool, ptrans);
}
-static unsigned
-translate_usage(unsigned usage)
-{
- uint32_t op = 0;
-
- if (usage & PIPE_MAP_READ)
- op |= FD_BO_PREP_READ;
-
- if (usage & PIPE_MAP_WRITE)
- op |= FD_BO_PREP_WRITE;
-
- return op;
-}
-
static void
invalidate_resource(struct fd_resource *rsc, unsigned usage) assert_dt
{
static void
fd_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *prsc)
{
+ struct fd_screen *screen = fd_screen(prsc->screen);
struct fd_resource *rsc = fd_resource(prsc);
if (!rsc->is_replacement)
if (rsc->scanout)
renderonly_scanout_destroy(rsc->scanout, fd_screen(pscreen)->ro);
+ if (prsc->target == PIPE_BUFFER)
+ util_idalloc_mt_free(&screen->buffer_ids, rsc->b.buffer_id_unique);
+
threaded_resource_deinit(prsc);
util_range_destroy(&rsc->valid_buffer_range);
alloc_resource_struct(struct pipe_screen *pscreen,
const struct pipe_resource *tmpl)
{
+ struct fd_screen *screen = fd_screen(pscreen);
struct fd_resource *rsc = CALLOC_STRUCT(fd_resource);
if (!rsc)
pipe_reference_init(&rsc->track->reference, 1);
+ threaded_resource_init(prsc);
+
+ if (tmpl->target == PIPE_BUFFER)
+ rsc->b.buffer_id_unique = util_idalloc_mt_alloc(&screen->buffer_ids);
+
return rsc;
}
DBG("%" PRSC_FMT, PRSC_ARGS(prsc));
- threaded_resource_init(prsc);
-
if (tmpl->bind & PIPE_BIND_SHARED)
rsc->b.is_shared = true;
DBG("%" PRSC_FMT ", modifier=%" PRIx64, PRSC_ARGS(prsc), handle->modifier);
- threaded_resource_init(prsc);
rsc->b.is_shared = true;
fd_resource_layout_init(prsc);