From 344486d583e7c2837c99c96b833f9b68a0b83f81 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 5 Sep 2025 11:44:52 -0700 Subject: [PATCH] freedreno/a6xx: Slight re-org of sampler descriptor building A bit of re-org to make it easier to slot in the gen8 case. Signed-off-by: Rob Clark Part-of: --- .../drivers/freedreno/a6xx/fd6_texture.cc | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc b/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc index ee2fc927192..43b369316f8 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc @@ -268,6 +268,13 @@ fd6_sampler_state_create(struct pipe_context *pctx, if (cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR) miplinear = true; + /* We don't know if the format is going to be YUV. Setting CHROMA_LINEAR + * unconditionally seems fine. + */ + bool chroma_linear = + cso->mag_img_filter == PIPE_TEX_FILTER_LINEAR && + cso->min_img_filter == PIPE_TEX_FILTER_LINEAR; + bool needs_border = false; so->descriptor[0] = COND(miplinear, A6XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) | @@ -276,21 +283,21 @@ fd6_sampler_state_create(struct pipe_context *pctx, A6XX_TEX_SAMP_0_ANISO((enum a6xx_tex_aniso)aniso) | A6XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s, &needs_border)) | A6XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t, &needs_border)) | - A6XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &needs_border)); + A6XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r, &needs_border)) | + A6XX_TEX_SAMP_0_LOD_BIAS(cso->lod_bias); so->descriptor[1] = + COND(cso->compare_mode, A6XX_TEX_SAMP_1_COMPARE_FUNC((enum adreno_compare_func)cso->compare_func)) | COND(cso->min_mip_filter == PIPE_TEX_MIPFILTER_NONE, A6XX_TEX_SAMP_1_MIPFILTER_LINEAR_FAR) | COND(!cso->seamless_cube_map, A6XX_TEX_SAMP_1_CUBEMAPSEAMLESSFILTOFF) | - COND(cso->unnormalized_coords, A6XX_TEX_SAMP_1_UNNORM_COORDS); + COND(cso->unnormalized_coords, A6XX_TEX_SAMP_1_UNNORM_COORDS) | + A6XX_TEX_SAMP_1_MIN_LOD(cso->min_lod) | + A6XX_TEX_SAMP_1_MAX_LOD(cso->max_lod); - so->descriptor[0] |= A6XX_TEX_SAMP_0_LOD_BIAS(cso->lod_bias); - so->descriptor[1] |= A6XX_TEX_SAMP_1_MIN_LOD(cso->min_lod) | - A6XX_TEX_SAMP_1_MAX_LOD(cso->max_lod); - - if (cso->compare_mode) - so->descriptor[1] |= - A6XX_TEX_SAMP_1_COMPARE_FUNC((enum adreno_compare_func)cso->compare_func); /* maps 1:1 */ + so->descriptor[2] = + A6XX_TEX_SAMP_2_REDUCTION_MODE(reduction_mode(cso->reduction_mode)) | + COND(chroma_linear, A6XX_TEX_SAMP_2_CHROMA_LINEAR); if (needs_border) { bool fast_border_color_enable = false; @@ -322,23 +329,13 @@ fd6_sampler_state_create(struct pipe_context *pctx, } if (fast_border_color_enable) { - so->descriptor[2] = A6XX_TEX_SAMP_2_FASTBORDERCOLOR(fast_border_color) | - A6XX_TEX_SAMP_2_FASTBORDERCOLOREN; + so->descriptor[2] |= A6XX_TEX_SAMP_2_FASTBORDERCOLOR(fast_border_color) | + A6XX_TEX_SAMP_2_FASTBORDERCOLOREN; } else { - so->descriptor[2] = A6XX_TEX_SAMP_2_BCOLOR(get_bcolor_offset(ctx, cso)); + so->descriptor[2] |= A6XX_TEX_SAMP_2_BCOLOR(get_bcolor_offset(ctx, cso)); } } - /* We don't know if the format is going to be YUV. Setting CHROMA_LINEAR - * unconditionally seems fine. - */ - if (cso->mag_img_filter == PIPE_TEX_FILTER_LINEAR && - cso->min_img_filter == PIPE_TEX_FILTER_LINEAR) - so->descriptor[2] |= A6XX_TEX_SAMP_2_CHROMA_LINEAR; - - so->descriptor[2] |= - A6XX_TEX_SAMP_2_REDUCTION_MODE(reduction_mode(cso->reduction_mode)); - return so; }