llvmpipe: store a screen pointer in resource struct
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 26 May 2021 13:10:25 +0000 (09:10 -0400)
committerMarge Bot <eric+marge@anholt.net>
Wed, 26 May 2021 23:58:59 +0000 (23:58 +0000)
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>

src/gallium/drivers/llvmpipe/lp_texture.c
src/gallium/drivers/llvmpipe/lp_texture.h

index 92396f3..e0fa880 100644 (file)
@@ -232,6 +232,7 @@ llvmpipe_resource_create_all(struct pipe_screen *_screen,
       return NULL;
 
    lpr->base = *templat;
+   lpr->screen = screen;
    pipe_reference_init(&lpr->base.reference, 1);
    lpr->base.screen = &screen->base;
 
@@ -454,12 +455,13 @@ llvmpipe_resource_data(struct pipe_resource *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,
                               struct winsys_handle *whandle,
                               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;
 
    /* 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->screen = screen;
    pipe_reference_init(&lpr->base.reference, 1);
-   lpr->base.screen = screen;
+   lpr->base.screen = _screen;
 
    /*
     * Looks like unaligned displaytargets work just fine,
@@ -733,6 +736,7 @@ llvmpipe_user_buffer_create(struct pipe_screen *screen,
    if (!buffer)
       return NULL;
 
+   buffer->screen = llvmpipe_screen(screen);
    pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.screen = screen;
    buffer->base.format = PIPE_FORMAT_R8_UNORM; /* ?? */
index 19cf5ec..bda5281 100644 (file)
@@ -45,6 +45,7 @@ enum lp_texture_usage
 struct pipe_context;
 struct pipe_screen;
 struct llvmpipe_context;
+struct llvmpipe_screen;
 
 struct sw_displaytarget;
 
@@ -60,6 +61,9 @@ struct llvmpipe_resource
 {
    struct pipe_resource base;
 
+   /** an extra screen pointer to avoid crashing in driver trace */
+   struct llvmpipe_screen *screen;
+
    /** Row stride in bytes */
    unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
    /** Image stride (for cube maps, array or 3D textures) in bytes */