llvmpipe: store a screen pointer in resource struct
directly accessing the pipe_resource::screen pointer crashes trace, so it's necessary to have an unwrapped pointer available if such things are needed Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11017>
This commit is contained in:

committed by
Marge Bot

parent
621b8788bb
commit
09019fb456
@@ -232,6 +232,7 @@ llvmpipe_resource_create_all(struct pipe_screen *_screen,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
lpr->base = *templat;
|
lpr->base = *templat;
|
||||||
|
lpr->screen = screen;
|
||||||
pipe_reference_init(&lpr->base.reference, 1);
|
pipe_reference_init(&lpr->base.reference, 1);
|
||||||
lpr->base.screen = &screen->base;
|
lpr->base.screen = &screen->base;
|
||||||
|
|
||||||
@@ -454,12 +455,13 @@ llvmpipe_resource_data(struct pipe_resource *resource)
|
|||||||
|
|
||||||
|
|
||||||
static struct pipe_resource *
|
static struct pipe_resource *
|
||||||
llvmpipe_resource_from_handle(struct pipe_screen *screen,
|
llvmpipe_resource_from_handle(struct pipe_screen *_screen,
|
||||||
const struct pipe_resource *template,
|
const struct pipe_resource *template,
|
||||||
struct winsys_handle *whandle,
|
struct winsys_handle *whandle,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys;
|
struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
|
||||||
|
struct sw_winsys *winsys = screen->winsys;
|
||||||
struct llvmpipe_resource *lpr;
|
struct llvmpipe_resource *lpr;
|
||||||
|
|
||||||
/* XXX Seems like from_handled depth textures doesn't work that well */
|
/* XXX Seems like from_handled depth textures doesn't work that well */
|
||||||
@@ -470,8 +472,9 @@ llvmpipe_resource_from_handle(struct pipe_screen *screen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
lpr->base = *template;
|
lpr->base = *template;
|
||||||
|
lpr->screen = screen;
|
||||||
pipe_reference_init(&lpr->base.reference, 1);
|
pipe_reference_init(&lpr->base.reference, 1);
|
||||||
lpr->base.screen = screen;
|
lpr->base.screen = _screen;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Looks like unaligned displaytargets work just fine,
|
* Looks like unaligned displaytargets work just fine,
|
||||||
@@ -733,6 +736,7 @@ llvmpipe_user_buffer_create(struct pipe_screen *screen,
|
|||||||
if (!buffer)
|
if (!buffer)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
buffer->screen = llvmpipe_screen(screen);
|
||||||
pipe_reference_init(&buffer->base.reference, 1);
|
pipe_reference_init(&buffer->base.reference, 1);
|
||||||
buffer->base.screen = screen;
|
buffer->base.screen = screen;
|
||||||
buffer->base.format = PIPE_FORMAT_R8_UNORM; /* ?? */
|
buffer->base.format = PIPE_FORMAT_R8_UNORM; /* ?? */
|
||||||
|
@@ -45,6 +45,7 @@ enum lp_texture_usage
|
|||||||
struct pipe_context;
|
struct pipe_context;
|
||||||
struct pipe_screen;
|
struct pipe_screen;
|
||||||
struct llvmpipe_context;
|
struct llvmpipe_context;
|
||||||
|
struct llvmpipe_screen;
|
||||||
|
|
||||||
struct sw_displaytarget;
|
struct sw_displaytarget;
|
||||||
|
|
||||||
@@ -60,6 +61,9 @@ struct llvmpipe_resource
|
|||||||
{
|
{
|
||||||
struct pipe_resource base;
|
struct pipe_resource base;
|
||||||
|
|
||||||
|
/** an extra screen pointer to avoid crashing in driver trace */
|
||||||
|
struct llvmpipe_screen *screen;
|
||||||
|
|
||||||
/** Row stride in bytes */
|
/** Row stride in bytes */
|
||||||
unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
|
unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
|
||||||
/** Image stride (for cube maps, array or 3D textures) in bytes */
|
/** Image stride (for cube maps, array or 3D textures) in bytes */
|
||||||
|
Reference in New Issue
Block a user