diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 215dc709841..950a8a35310 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -45,6 +45,7 @@ #include "pan_util.h" #include "pan_indirect_draw.h" #include "pan_indirect_dispatch.h" +#include "pan_blitter.h" #include "midgard_pack.h" @@ -3682,13 +3683,26 @@ panfrost_get_sample_position(struct pipe_context *context, out_value); } +static void +screen_destroy(struct pipe_screen *pscreen) +{ + struct panfrost_device *dev = pan_device(pscreen); + pan_blitter_cleanup(dev); +} + void panfrost_cmdstream_screen_init(struct panfrost_screen *screen) { + struct panfrost_device *dev = &screen->dev; + screen->vtbl.prepare_rsd = prepare_rsd; screen->vtbl.emit_tls = emit_tls; screen->vtbl.emit_fbd = emit_fbd; screen->vtbl.emit_fragment_job = emit_fragment_job; + screen->vtbl.screen_destroy = screen_destroy; + + pan_blitter_init(dev, &screen->blitter.bin_pool.base, + &screen->blitter.desc_pool.base); } void diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index b4267d07577..4b1fabc1809 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -43,7 +43,6 @@ #include "drm-uapi/drm_fourcc.h" #include "drm-uapi/panfrost_drm.h" -#include "pan_blitter.h" #include "pan_bo.h" #include "pan_shader.h" #include "pan_screen.h" @@ -696,11 +695,12 @@ panfrost_destroy_screen(struct pipe_screen *pscreen) pan_indirect_dispatch_cleanup(dev); panfrost_cleanup_indirect_draw_shaders(dev); panfrost_pool_cleanup(&screen->indirect_draw.bin_pool); - pan_blitter_cleanup(dev); panfrost_pool_cleanup(&screen->blitter.bin_pool); panfrost_pool_cleanup(&screen->blitter.desc_pool); pan_blend_shaders_cleanup(dev); + screen->vtbl.screen_destroy(pscreen); + if (dev->ro) dev->ro->destroy(dev->ro); panfrost_close_device(dev); @@ -892,9 +892,6 @@ panfrost_create_screen(int fd, struct renderonly *ro) 4096, "Blitter shaders", false, true); panfrost_pool_init(&screen->blitter.desc_pool, NULL, dev, 0, 65536, "Blitter RSDs", false, true); - pan_blitter_init(dev, &screen->blitter.bin_pool.base, - &screen->blitter.desc_pool.base); - panfrost_cmdstream_screen_init(screen); return &screen->base; diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index 5781a0e6c72..eda9a72a5f0 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -63,6 +63,9 @@ struct panfrost_vtable { /* Emits a fragment job */ mali_ptr (*emit_fragment_job)(struct panfrost_batch *, const struct pan_fb_info *); + + /* General destructor */ + void (*screen_destroy)(struct pipe_screen *); }; struct panfrost_screen {