From 84c33f188f39812e6603930a41b56d0952b3e2fa Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 12 Jul 2021 19:35:03 -0400 Subject: [PATCH] panfrost: Share sampler code across archs Signed-off-by: Alyssa Rosenzweig Reviewed-by: Boris Brezillon Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 92 +++++++++------------------- 1 file changed, 29 insertions(+), 63 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index c16ea88..eaf97f0 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -124,41 +124,46 @@ pan_pipe_to_mipmode(enum pipe_tex_mipfilter f) switch (f) { case PIPE_TEX_MIPFILTER_NEAREST: return MALI_MIPMAP_MODE_NEAREST; case PIPE_TEX_MIPFILTER_LINEAR: return MALI_MIPMAP_MODE_TRILINEAR; +#if PAN_ARCH >= 6 case PIPE_TEX_MIPFILTER_NONE: return MALI_MIPMAP_MODE_NONE; +#else + case PIPE_TEX_MIPFILTER_NONE: return MALI_MIPMAP_MODE_NEAREST; +#endif default: unreachable("Invalid"); } } -static void -panfrost_sampler_desc_init(const struct pipe_sampler_state *cso, - struct mali_midgard_sampler_packed *hw) + +static void * +panfrost_create_sampler_state( + struct pipe_context *pctx, + const struct pipe_sampler_state *cso) { + struct panfrost_sampler_state *so = CALLOC_STRUCT(panfrost_sampler_state); + struct panfrost_device *device = pan_device(pctx->screen); + + so->base = *cso; + bool using_nearest = cso->min_img_filter == PIPE_TEX_MIPFILTER_NEAREST; - pan_pack(hw, MIDGARD_SAMPLER, cfg) { +#if PAN_ARCH <= 5 + pan_pack(&so->hw, MIDGARD_SAMPLER, cfg) { +#else + pan_pack(&so->hw, BIFROST_SAMPLER, cfg) { +#endif cfg.magnify_nearest = cso->mag_img_filter == PIPE_TEX_FILTER_NEAREST; cfg.minify_nearest = cso->min_img_filter == PIPE_TEX_FILTER_NEAREST; - cfg.mipmap_mode = (cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR) ? - MALI_MIPMAP_MODE_TRILINEAR : MALI_MIPMAP_MODE_NEAREST; - cfg.normalized_coordinates = cso->normalized_coords; + cfg.normalized_coordinates = cso->normalized_coords; cfg.lod_bias = FIXED_16(cso->lod_bias, true); - cfg.minimum_lod = FIXED_16(cso->min_lod, false); - - /* If necessary, we disable mipmapping in the sampler descriptor by - * clamping the LOD as tight as possible (from 0 to epsilon, - * essentially -- remember these are fixed point numbers, so - * epsilon=1/256) */ - - cfg.maximum_lod = (cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE) ? - cfg.minimum_lod + 1 : - FIXED_16(cso->max_lod, false); + cfg.maximum_lod = FIXED_16(cso->max_lod, false); cfg.wrap_mode_s = translate_tex_wrap(cso->wrap_s, using_nearest); cfg.wrap_mode_t = translate_tex_wrap(cso->wrap_t, using_nearest); cfg.wrap_mode_r = translate_tex_wrap(cso->wrap_r, using_nearest); + cfg.mipmap_mode = pan_pipe_to_mipmode(cso->min_mip_filter); cfg.compare_function = panfrost_sampler_compare_func(cso); cfg.seamless_cube_map = cso->seamless_cube_map; @@ -166,58 +171,19 @@ panfrost_sampler_desc_init(const struct pipe_sampler_state *cso, cfg.border_color_g = cso->border_color.ui[1]; cfg.border_color_b = cso->border_color.ui[2]; cfg.border_color_a = cso->border_color.ui[3]; - } -} - -static void -panfrost_sampler_desc_init_bifrost(const struct pipe_sampler_state *cso, - struct mali_bifrost_sampler_packed *hw) -{ - bool using_nearest = cso->min_img_filter == PIPE_TEX_MIPFILTER_NEAREST; - - pan_pack(hw, BIFROST_SAMPLER, cfg) { - cfg.magnify_nearest = cso->mag_img_filter == PIPE_TEX_FILTER_NEAREST; - cfg.minify_nearest = cso->min_img_filter == PIPE_TEX_FILTER_NEAREST; - cfg.mipmap_mode = pan_pipe_to_mipmode(cso->min_mip_filter); - cfg.normalized_coordinates = cso->normalized_coords; - - cfg.lod_bias = FIXED_16(cso->lod_bias, true); - cfg.minimum_lod = FIXED_16(cso->min_lod, false); - cfg.maximum_lod = FIXED_16(cso->max_lod, false); +#if PAN_ARCH >= 6 if (cso->max_anisotropy > 1) { cfg.maximum_anisotropy = cso->max_anisotropy; cfg.lod_algorithm = MALI_LOD_ALGORITHM_ANISOTROPIC; } - - cfg.wrap_mode_s = translate_tex_wrap(cso->wrap_s, using_nearest); - cfg.wrap_mode_t = translate_tex_wrap(cso->wrap_t, using_nearest); - cfg.wrap_mode_r = translate_tex_wrap(cso->wrap_r, using_nearest); - - cfg.compare_function = panfrost_sampler_compare_func(cso); - cfg.seamless_cube_map = cso->seamless_cube_map; - - cfg.border_color_r = cso->border_color.ui[0]; - cfg.border_color_g = cso->border_color.ui[1]; - cfg.border_color_b = cso->border_color.ui[2]; - cfg.border_color_a = cso->border_color.ui[3]; +#else + /* Emulate disabled mipmapping by clamping the LOD as tight as + * possible (from 0 to epsilon = 1/256) */ + if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE) + cfg.maximum_lod = cfg.minimum_lod + 1; +#endif } -} - -static void * -panfrost_create_sampler_state( - struct pipe_context *pctx, - const struct pipe_sampler_state *cso) -{ - struct panfrost_sampler_state *so = CALLOC_STRUCT(panfrost_sampler_state); - struct panfrost_device *device = pan_device(pctx->screen); - - so->base = *cso; - - if (pan_is_bifrost(device)) - panfrost_sampler_desc_init_bifrost(cso, (struct mali_bifrost_sampler_packed *) &so->hw); - else - panfrost_sampler_desc_init(cso, &so->hw); return so; } -- 2.7.4