From 3e85e3ce080a910861c907b3a2f84a7a344ead1b Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 7 Dec 2023 12:16:45 +0100 Subject: [PATCH] panfrost: Make the pan_blend logic panfrost_device-agnostic We keep embedding a blend shader cache in panfrost_device, but now we have pan_blend source files that can be used without a panfrost_device object. Signed-off-by: Boris Brezillon Reviewed-by: Constantine Shablya Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/panfrost/pan_context.c | 3 ++- src/gallium/drivers/panfrost/pan_screen.c | 5 ++-- src/gallium/drivers/panfrost/pan_screen.h | 2 +- src/panfrost/lib/pan_blend.c | 29 ++++++++++++---------- src/panfrost/lib/pan_blend.h | 14 ++++++++--- src/panfrost/lib/pan_blitter.c | 2 +- src/panfrost/lib/pan_device.h | 8 ++---- src/panfrost/vulkan/panvk_vX_meta_blit.c | 5 ++-- 8 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index cd8f2488ff7..794d398aef9 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -222,7 +222,8 @@ panfrost_get_blend(struct panfrost_batch *batch, unsigned rti, pthread_mutex_lock(&dev->blend_shaders.lock); struct pan_blend_shader_variant *shader = pan_screen(ctx->base.screen) - ->vtbl.get_blend_shader(dev, &pan_blend, col0_type, col1_type, rti); + ->vtbl.get_blend_shader(&dev->blend_shaders, &pan_blend, col0_type, + col1_type, rti); /* Size check and upload */ unsigned offset = *shader_offset; diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index 3fd9ce4e733..2910ea0754e 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -776,7 +776,7 @@ panfrost_destroy_screen(struct pipe_screen *pscreen) panfrost_resource_screen_destroy(pscreen); panfrost_pool_cleanup(&screen->blitter.bin_pool); panfrost_pool_cleanup(&screen->blitter.desc_pool); - pan_blend_shaders_cleanup(dev); + pan_blend_shader_cache_cleanup(&dev->blend_shaders); if (screen->vtbl.screen_destroy) screen->vtbl.screen_destroy(pscreen); @@ -883,7 +883,8 @@ panfrost_create_screen(int fd, const struct pipe_screen_config *config, screen->base.set_damage_region = panfrost_resource_set_damage_region; panfrost_resource_screen_init(&screen->base); - pan_blend_shaders_init(dev); + pan_blend_shader_cache_init(&dev->blend_shaders, + panfrost_device_gpu_id(dev)); panfrost_disk_cache_init(screen); diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index 3400c0a6cbf..03406a613cf 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -78,7 +78,7 @@ struct panfrost_vtable { /* Get blend shader */ struct pan_blend_shader_variant *(*get_blend_shader)( - const struct panfrost_device *, const struct pan_blend_state *, + struct pan_blend_shader_cache *cache, const struct pan_blend_state *, nir_alu_type, nir_alu_type, unsigned rt); /* Shader compilation methods */ diff --git a/src/panfrost/lib/pan_blend.c b/src/panfrost/lib/pan_blend.c index ea0c0dbc4e9..902467acbbd 100644 --- a/src/panfrost/lib/pan_blend.c +++ b/src/panfrost/lib/pan_blend.c @@ -482,17 +482,20 @@ pan_blend_shader_key_equal(const void *a, const void *b) } void -pan_blend_shaders_init(struct panfrost_device *dev) +pan_blend_shader_cache_init(struct pan_blend_shader_cache *cache, + unsigned gpu_id) { - dev->blend_shaders.shaders = _mesa_hash_table_create( - NULL, pan_blend_shader_key_hash, pan_blend_shader_key_equal); - pthread_mutex_init(&dev->blend_shaders.lock, NULL); + cache->gpu_id = gpu_id; + cache->shaders = _mesa_hash_table_create(NULL, pan_blend_shader_key_hash, + pan_blend_shader_key_equal); + pthread_mutex_init(&cache->lock, NULL); } void -pan_blend_shaders_cleanup(struct panfrost_device *dev) +pan_blend_shader_cache_cleanup(struct pan_blend_shader_cache *cache) { - _mesa_hash_table_destroy(dev->blend_shaders.shaders, NULL); + _mesa_hash_table_destroy(cache->shaders, NULL); + pthread_mutex_destroy(&cache->lock); } #else /* ifndef PAN_ARCH */ @@ -806,7 +809,7 @@ GENX(pan_inline_rt_conversion)(nir_shader *s, enum pipe_format *formats) #endif struct pan_blend_shader_variant * -GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, +GENX(pan_blend_get_shader_locked)(struct pan_blend_shader_cache *cache, const struct pan_blend_state *state, nir_alu_type src0_type, nir_alu_type src1_type, unsigned rt) @@ -824,19 +827,19 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, }; /* Blend shaders should only be used for blending on Bifrost onwards */ - assert(dev->arch <= 5 || state->logicop_enable || + assert(PAN_ARCH <= 5 || state->logicop_enable || !pan_blend_is_opaque(state->rts[rt].equation)); assert(state->rts[rt].equation.color_mask != 0); struct hash_entry *he = - _mesa_hash_table_search(dev->blend_shaders.shaders, &key); + _mesa_hash_table_search(cache->shaders, &key); struct pan_blend_shader *shader = he ? he->data : NULL; if (!shader) { - shader = rzalloc(dev->blend_shaders.shaders, struct pan_blend_shader); + shader = rzalloc(cache->shaders, struct pan_blend_shader); shader->key = key; list_inithead(&shader->variants); - _mesa_hash_table_insert(dev->blend_shaders.shaders, &shader->key, shader); + _mesa_hash_table_insert(cache->shaders, &shader->key, shader); } list_for_each_entry(struct pan_blend_shader_variant, iter, &shader->variants, @@ -868,7 +871,7 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, /* Compile the NIR shader */ struct panfrost_compile_inputs inputs = { - .gpu_id = panfrost_device_gpu_id(dev), + .gpu_id = cache->gpu_id, .is_blend = true, .blend.nr_samples = key.nr_samples, }; @@ -889,7 +892,7 @@ GENX(pan_blend_get_shader_locked)(const struct panfrost_device *dev, #else NIR_PASS_V(nir, pan_lower_framebuffer, rt_formats, pan_raw_format_mask_midgard(rt_formats), MAX2(key.nr_samples, 1), - panfrost_device_gpu_id(dev) < 0x700); + cache->gpu_id < 0x700); #endif GENX(pan_shader_compile)(nir, &inputs, &variant->binary, &info); diff --git a/src/panfrost/lib/pan_blend.h b/src/panfrost/lib/pan_blend.h index eaaeaea6bfc..49c9ad65e39 100644 --- a/src/panfrost/lib/pan_blend.h +++ b/src/panfrost/lib/pan_blend.h @@ -35,7 +35,12 @@ #include "panfrost/util/pan_ir.h" struct MALI_BLEND_EQUATION; -struct panfrost_device; + +struct pan_blend_shader_cache { + unsigned gpu_id; + struct hash_table *shaders; + pthread_mutex_t lock; +}; struct pan_blend_equation { unsigned blend_enable : 1; @@ -143,9 +148,10 @@ void pan_blend_to_fixed_function_equation(const struct pan_blend_equation eq, uint32_t pan_pack_blend(const struct pan_blend_equation equation); -void pan_blend_shaders_init(struct panfrost_device *dev); +void pan_blend_shader_cache_init(struct pan_blend_shader_cache *cache, + unsigned gpu_id); -void pan_blend_shaders_cleanup(struct panfrost_device *dev); +void pan_blend_shader_cache_cleanup(struct pan_blend_shader_cache *cache); #ifdef PAN_ARCH @@ -160,7 +166,7 @@ bool GENX(pan_inline_rt_conversion)(nir_shader *s, enum pipe_format *formats); * you're done with the shader variant object. */ struct pan_blend_shader_variant *GENX(pan_blend_get_shader_locked)( - const struct panfrost_device *dev, const struct pan_blend_state *state, + struct pan_blend_shader_cache *cache, const struct pan_blend_state *state, nir_alu_type src0_type, nir_alu_type src1_type, unsigned rt); #endif diff --git a/src/panfrost/lib/pan_blitter.c b/src/panfrost/lib/pan_blitter.c index 4f406aed731..f9a534f2c27 100644 --- a/src/panfrost/lib/pan_blitter.c +++ b/src/panfrost/lib/pan_blitter.c @@ -359,7 +359,7 @@ pan_blitter_get_blend_shaders(struct panfrost_device *dev, unsigned rt_count, pthread_mutex_lock(&dev->blend_shaders.lock); struct pan_blend_shader_variant *b = GENX(pan_blend_get_shader_locked)( - dev, &blend_state, blit_shader->blend_types[i], + &dev->blend_shaders, &blend_state, blit_shader->blend_types[i], nir_type_float32, /* unused */ i); diff --git a/src/panfrost/lib/pan_device.h b/src/panfrost/lib/pan_device.h index bbf94dc305d..104e52da4a5 100644 --- a/src/panfrost/lib/pan_device.h +++ b/src/panfrost/lib/pan_device.h @@ -38,6 +38,7 @@ #include "util/u_dynarray.h" #include "panfrost/util/pan_ir.h" +#include "pan_blend.h" #include "pan_pool.h" #include "pan_util.h" @@ -76,11 +77,6 @@ struct pan_blitter { } rsds; }; -struct pan_blend_shaders { - struct hash_table *shaders; - pthread_mutex_t lock; -}; - struct pan_indirect_dispatch { struct panfrost_ubo_push push; struct panfrost_bo *bin; @@ -197,7 +193,7 @@ struct panfrost_device { } bo_cache; struct pan_blitter blitter; - struct pan_blend_shaders blend_shaders; + struct pan_blend_shader_cache blend_shaders; struct pan_indirect_dispatch indirect_dispatch; /* Tiler heap shared across all tiler jobs, allocated against the diff --git a/src/panfrost/vulkan/panvk_vX_meta_blit.c b/src/panfrost/vulkan/panvk_vX_meta_blit.c index 6c6915a946d..bd752b33bfe 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_blit.c +++ b/src/panfrost/vulkan/panvk_vX_meta_blit.c @@ -226,7 +226,8 @@ panvk_per_arch(meta_blit_init)(struct panvk_physical_device *dev) false); panvk_pool_init(&dev->meta.blitter.desc_pool, &dev->pdev, NULL, 0, 16 * 1024, "panvk_meta blitter descriptor pool", false); - pan_blend_shaders_init(&dev->pdev); + pan_blend_shader_cache_init(&dev->pdev.blend_shaders, + panfrost_device_gpu_id(&dev->pdev)); GENX(pan_blitter_init) (&dev->pdev, &dev->meta.blitter.bin_pool.base, &dev->meta.blitter.desc_pool.base); @@ -236,7 +237,7 @@ void panvk_per_arch(meta_blit_cleanup)(struct panvk_physical_device *dev) { GENX(pan_blitter_cleanup)(&dev->pdev); - pan_blend_shaders_cleanup(&dev->pdev); + pan_blend_shader_cache_cleanup(&dev->pdev.blend_shaders); panvk_pool_cleanup(&dev->meta.blitter.desc_pool); panvk_pool_cleanup(&dev->meta.blitter.bin_pool); }