mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 06:48:06 +02:00
nvfx: fixes after array textures merge
Signed-off-by: Xavier Chantry <chantry.xavier@gmail.com> Signed-off-by: Patrice Mandin <patmandin@gmail.com>
This commit is contained in:
parent
66d45567b4
commit
af5345d937
4 changed files with 35 additions and 19 deletions
|
|
@ -29,10 +29,11 @@
|
|||
#include "util/u_inlines.h"
|
||||
#include "util/u_memory.h"
|
||||
|
||||
struct pipe_surface *
|
||||
boolean
|
||||
util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
||||
struct pipe_screen *pscreen, struct pipe_resource *pt,
|
||||
unsigned level, unsigned layer, unsigned flags)
|
||||
unsigned level, unsigned layer, unsigned flags,
|
||||
struct pipe_surface **res)
|
||||
{
|
||||
struct pipe_surface *ps;
|
||||
|
||||
|
|
@ -53,12 +54,16 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
|||
if(ps)
|
||||
{
|
||||
p_atomic_inc(&ps->reference.count);
|
||||
return ps;
|
||||
*res = ps;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ps = (struct pipe_surface *)CALLOC(1, surface_struct_size);
|
||||
if(!ps)
|
||||
return NULL;
|
||||
{
|
||||
*res = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pipe_surface_init(ps, pt, level, layer, flags);
|
||||
|
||||
|
|
@ -67,7 +72,8 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
|
|||
else
|
||||
us->u.array[level] = ps;
|
||||
|
||||
return ps;
|
||||
*res = ps;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -42,11 +42,19 @@ struct util_surfaces
|
|||
} u;
|
||||
};
|
||||
|
||||
struct pipe_surface *util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size, struct pipe_screen *pscreen, struct pipe_resource *pt, unsigned level, unsigned layer, unsigned flags);
|
||||
/* 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,
|
||||
unsigned level, unsigned layer, unsigned flags,
|
||||
struct pipe_surface **res);
|
||||
|
||||
/* fast inline path for the very common case */
|
||||
static INLINE struct pipe_surface *
|
||||
util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size, struct pipe_screen *pscreen, struct pipe_resource *pt, unsigned level, unsigned layer, unsigned flags)
|
||||
static INLINE boolean
|
||||
util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size,
|
||||
struct pipe_screen *pscreen, 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))
|
||||
{
|
||||
|
|
@ -54,11 +62,12 @@ util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size, struct
|
|||
if(ps)
|
||||
{
|
||||
p_atomic_inc(&ps->reference.count);
|
||||
return ps;
|
||||
*res = ps;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return util_surfaces_do_get(us, surface_struct_size, pscreen, pt, level, layer, flags);
|
||||
return util_surfaces_do_get(us, surface_struct_size, pscreen, pt, level, layer, flags, res);
|
||||
}
|
||||
|
||||
static INLINE struct pipe_surface *
|
||||
|
|
|
|||
|
|
@ -193,18 +193,19 @@ struct pipe_surface *
|
|||
nvfx_miptree_surface_new(struct pipe_context *pipe, struct pipe_resource *pt,
|
||||
const struct pipe_surface *surf_tmpl)
|
||||
{
|
||||
struct nvfx_miptree* mt = (struct nvfx_miptree*)pt;
|
||||
struct nvfx_surface *ns;
|
||||
struct nvfx_miptree *mt = (struct nvfx_miptree *)pt;
|
||||
unsigned level = surf_tmpl->u.tex.level;
|
||||
struct nvfx_surface *ns = NULL;
|
||||
|
||||
assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
|
||||
ns = (struct nvfx_surface*)util_surfaces_get(&mt->surfaces, sizeof(struct nvfx_surface), NULL, pt,
|
||||
level, surf_tmpl->u.tex.first_layer, surf_tmpl->usage);
|
||||
if(ns->offset == ~0) {
|
||||
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);
|
||||
if(util_surfaces_get(&mt->surfaces, sizeof(struct nvfx_surface), NULL,
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ nvfx_surface_copy_temp(struct pipe_context* pipe, struct pipe_surface* surf, int
|
|||
base_vertex = nvfx->base_vertex;
|
||||
|
||||
box.x = box.y = 0;
|
||||
assert(surf->u.tex.first_layer = surf->u.tex.last_layer);
|
||||
assert(surf->u.tex.first_layer == surf->u.tex.last_layer);
|
||||
box.width = surf->width;
|
||||
box.height = surf->height;
|
||||
box.depth = 1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue