Module: Mesa Branch: main Commit: 5e992e17de7f562644e1319cf477298b15ff4446 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5e992e17de7f562644e1319cf477298b15ff4446
Author: Alyssa Rosenzweig <[email protected]> Date: Tue Jul 6 17:48:46 2021 -0400 panfrost: Split out prepare_rsd into a vtbl This needs to be per-gen, but the rest of the caller does not, so let's split this out. iris makes extensive use of this vtbl pattern for cold paths like this one. Signed-off-by: Alyssa Rosenzweig <[email protected]> Acked-by: Boris Brezillon <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11745> --- src/gallium/drivers/panfrost/pan_assemble.c | 20 +++++--------------- src/gallium/drivers/panfrost/pan_cmdstream.c | 27 +++++++++++++++++++++++++++ src/gallium/drivers/panfrost/pan_screen.c | 2 ++ src/gallium/drivers/panfrost/pan_screen.h | 16 ++++++++++++++++ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_assemble.c b/src/gallium/drivers/panfrost/pan_assemble.c index b4c3dd7490a..1638c9aef0e 100644 --- a/src/gallium/drivers/panfrost/pan_assemble.c +++ b/src/gallium/drivers/panfrost/pan_assemble.c @@ -48,6 +48,7 @@ panfrost_shader_compile(struct pipe_screen *pscreen, gl_shader_stage stage, struct panfrost_shader_state *state) { + struct panfrost_screen *screen = pan_screen(pscreen); struct panfrost_device *dev = pan_device(pscreen); nir_shader *s; @@ -84,22 +85,11 @@ panfrost_shader_compile(struct pipe_screen *pscreen, binary.data, binary.size, 128)); } - struct mali_renderer_state_packed *out = &state->partial_rsd; - /* Upload RSDs for non-fragment shaders. Fragment shaders need draw - * time finalization based on the renderer state. */ - if (stage != MESA_SHADER_FRAGMENT) { - struct panfrost_ptr ptr = - pan_pool_alloc_desc(&desc_pool->base, RENDERER_STATE); - - state->state = panfrost_pool_take_ref(desc_pool, ptr.gpu); - out = ptr.cpu; - } - - pan_pack(out, RENDERER_STATE, cfg) { - pan_shader_prepare_rsd(dev, &state->info, state->bin.gpu, - &cfg); - } + /* Don't upload RSD for fragment shaders since they need draw-time + * merging for e.g. depth/stencil/alpha */ + bool upload = stage != MESA_SHADER_FRAGMENT; + screen->vtbl.prepare_rsd(dev, state, desc_pool, upload); panfrost_analyze_sysvals(state); diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 8ba599d0024..84d1865eb9a 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -3423,6 +3423,33 @@ panfrost_create_sampler_view( return (struct pipe_sampler_view *) so; } +static void +prepare_rsd(struct panfrost_device *dev, + struct panfrost_shader_state *state, + struct panfrost_pool *pool, bool upload) +{ + struct mali_renderer_state_packed *out = &state->partial_rsd; + + if (upload) { + struct panfrost_ptr ptr = + pan_pool_alloc_desc(&pool->base, RENDERER_STATE); + + state->state = panfrost_pool_take_ref(pool, ptr.gpu); + out = ptr.cpu; + } + + pan_pack(out, RENDERER_STATE, cfg) { + pan_shader_prepare_rsd(dev, &state->info, state->bin.gpu, + &cfg); + } +} + +void +panfrost_cmdstream_screen_init(struct panfrost_screen *screen) +{ + screen->vtbl.prepare_rsd = prepare_rsd; +} + void panfrost_cmdstream_context_init(struct pipe_context *pipe) { diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index f908be30a7c..55acd1c600e 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -896,5 +896,7 @@ panfrost_create_screen(int fd, struct renderonly *ro) 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 eb8d25d41a6..cb70de0c541 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -43,6 +43,17 @@ struct panfrost_batch; struct panfrost_context; struct panfrost_resource; +struct panfrost_shader_state; + +/* Virtual table of per-generation (GenXML) functions */ + +struct panfrost_vtable { + /* Prepares the renderer state descriptor for a given compiled shader, + * and if desired uploads it as well */ + void (*prepare_rsd)(struct panfrost_device *, + struct panfrost_shader_state *, + struct panfrost_pool *, bool); +}; struct panfrost_screen { struct pipe_screen base; @@ -54,6 +65,8 @@ struct panfrost_screen { struct { struct panfrost_pool bin_pool; } indirect_draw; + + struct panfrost_vtable vtbl; }; static inline struct panfrost_screen * @@ -71,4 +84,7 @@ pan_device(struct pipe_screen *p) struct pipe_fence_handle * panfrost_fence_create(struct panfrost_context *ctx); +void +panfrost_cmdstream_screen_init(struct panfrost_screen *screen); + #endif /* PAN_SCREEN_H */ _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
