mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
init ps->context with util_surfaces_get and do_get
Signed-off-by: Xavier Chantry <chantry.xavier@gmail.com> Reviewed-by: Jakob Bornecrantz <wallbraker at gmail.com> Signed-off-by: Patrice Mandin <patmandin@gmail.com>
This commit is contained in:
parent
af5345d937
commit
e3256ccb04
4 changed files with 16 additions and 14 deletions
|
|
@ -136,8 +136,9 @@ pipe_sampler_view_reference(struct pipe_sampler_view **ptr, struct pipe_sampler_
|
|||
}
|
||||
|
||||
static INLINE void
|
||||
pipe_surface_reset(struct pipe_surface* ps, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags)
|
||||
pipe_surface_reset(struct pipe_context *ctx, struct pipe_surface* ps,
|
||||
struct pipe_resource *pt, unsigned level, unsigned layer,
|
||||
unsigned flags)
|
||||
{
|
||||
pipe_resource_reference(&ps->texture, pt);
|
||||
ps->format = pt->format;
|
||||
|
|
@ -146,15 +147,17 @@ pipe_surface_reset(struct pipe_surface* ps, struct pipe_resource *pt,
|
|||
ps->usage = flags;
|
||||
ps->u.tex.level = level;
|
||||
ps->u.tex.first_layer = ps->u.tex.last_layer = layer;
|
||||
ps->context = ctx;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
pipe_surface_init(struct pipe_surface* ps, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags)
|
||||
pipe_surface_init(struct pipe_context *ctx, struct pipe_surface* ps,
|
||||
struct pipe_resource *pt, unsigned level, unsigned layer,
|
||||
unsigned flags)
|
||||
{
|
||||
ps->texture = 0;
|
||||
pipe_reference_init(&ps->reference, 1);
|
||||
pipe_surface_reset(ps, pt, level, layer, flags);
|
||||
pipe_surface_reset(ctx, ps, pt, level, layer, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
boolean
|
||||
util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
||||
struct pipe_screen *pscreen, struct pipe_resource *pt,
|
||||
struct pipe_context *ctx, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags,
|
||||
struct pipe_surface **res)
|
||||
{
|
||||
|
|
@ -51,7 +51,7 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
|||
ps = us->u.array[level];
|
||||
}
|
||||
|
||||
if(ps)
|
||||
if(ps && ps->context == ctx)
|
||||
{
|
||||
p_atomic_inc(&ps->reference.count);
|
||||
*res = ps;
|
||||
|
|
@ -65,7 +65,7 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
pipe_surface_init(ps, pt, level, layer, flags);
|
||||
pipe_surface_init(ctx, ps, pt, level, layer, flags);
|
||||
|
||||
if(pt->target == PIPE_TEXTURE_3D || pt->target == PIPE_TEXTURE_CUBE)
|
||||
cso_hash_insert(us->u.hash, (layer << 8) | level, ps);
|
||||
|
|
|
|||
|
|
@ -45,21 +45,21 @@ struct util_surfaces
|
|||
/* Return value indicates if the pipe surface result is new */
|
||||
boolean
|
||||
util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
||||
struct pipe_screen *pscreen, struct pipe_resource *pt,
|
||||
struct pipe_context *ctx, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags,
|
||||
struct pipe_surface **res);
|
||||
|
||||
/* fast inline path for the very common case */
|
||||
static INLINE boolean
|
||||
util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size,
|
||||
struct pipe_screen *pscreen, struct pipe_resource *pt,
|
||||
struct pipe_context *ctx, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags,
|
||||
struct pipe_surface **res)
|
||||
{
|
||||
if(likely((pt->target == PIPE_TEXTURE_2D || pt->target == PIPE_TEXTURE_RECT) && us->u.array))
|
||||
{
|
||||
struct pipe_surface *ps = us->u.array[level];
|
||||
if(ps)
|
||||
if(ps && ps->context == ctx)
|
||||
{
|
||||
p_atomic_inc(&ps->reference.count);
|
||||
*res = ps;
|
||||
|
|
@ -67,7 +67,7 @@ util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size,
|
|||
}
|
||||
}
|
||||
|
||||
return util_surfaces_do_get(us, surface_struct_size, pscreen, pt, level, layer, flags, res);
|
||||
return util_surfaces_do_get(us, surface_struct_size, ctx, pt, level, layer, flags, res);
|
||||
}
|
||||
|
||||
static INLINE struct pipe_surface *
|
||||
|
|
|
|||
|
|
@ -198,14 +198,13 @@ nvfx_miptree_surface_new(struct pipe_context *pipe, struct pipe_resource *pt,
|
|||
struct nvfx_surface *ns = NULL;
|
||||
|
||||
assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
|
||||
if(util_surfaces_get(&mt->surfaces, sizeof(struct nvfx_surface), NULL,
|
||||
if(util_surfaces_get(&mt->surfaces, sizeof(struct nvfx_surface), pipe,
|
||||
pt, level, surf_tmpl->u.tex.first_layer,
|
||||
surf_tmpl->usage, (struct pipe_surface **)&ns)) {
|
||||
util_dirty_surface_init(&ns->base);
|
||||
ns->pitch = nvfx_subresource_pitch(pt, level);
|
||||
ns->offset = nvfx_subresource_offset(pt, surf_tmpl->u.tex.first_layer, level, surf_tmpl->u.tex.first_layer);
|
||||
}
|
||||
ns->base.base.context = pipe;
|
||||
|
||||
return &ns->base.base;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue