From 1f9bafbc7466017d926b6441d2233a846615ed92 Mon Sep 17 00:00:00 2001 From: Ganesh Belgur Ramachandra Date: Mon, 10 Jun 2024 09:04:16 -0500 Subject: [PATCH] radeonsi: add GL_EXT_texture_filter_minmax extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_get.c | 6 ++++++ src/gallium/drivers/radeonsi/si_state.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index cf977a5e311..d262a5850ff 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -188,6 +188,12 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_CL_GL_SHARING: return 1; + /* Tahiti and Verde only: reduction mode is unsupported due to a bug + * (it might work sometimes, but that's not enough) + */ + case PIPE_CAP_SAMPLER_REDUCTION_MINMAX: + return !(sscreen->info.family == CHIP_TAHITI || sscreen->info.family == CHIP_VERDE); + case PIPE_CAP_TEXTURE_TRANSFER_MODES: return PIPE_TEXTURE_TRANSFER_BLIT | PIPE_TEXTURE_TRANSFER_COMPUTE; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 32e231ec19f..67e86720360 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -4331,6 +4331,21 @@ static inline unsigned si_tex_aniso_filter(unsigned filter) return 4; } +static unsigned si_tex_filter_mode(unsigned mode) +{ + switch (mode) { + case PIPE_TEX_REDUCTION_WEIGHTED_AVERAGE: + return V_008F30_SQ_IMG_FILTER_MODE_BLEND; + case PIPE_TEX_REDUCTION_MIN: + return V_008F30_SQ_IMG_FILTER_MODE_MIN; + case PIPE_TEX_REDUCTION_MAX: + return V_008F30_SQ_IMG_FILTER_MODE_MAX; + default: + break; + } + return 0; +} + static void *si_create_sampler_state(struct pipe_context *ctx, const struct pipe_sampler_state *state) { @@ -4339,6 +4354,7 @@ static void *si_create_sampler_state(struct pipe_context *ctx, struct si_sampler_state *rstate = CALLOC_STRUCT(si_sampler_state); unsigned max_aniso = sscreen->force_aniso >= 0 ? sscreen->force_aniso : state->max_anisotropy; unsigned max_aniso_ratio = si_tex_aniso_filter(max_aniso); + unsigned filter_mode = si_tex_filter_mode(state->reduction_mode); bool trunc_coord = (state->min_img_filter == PIPE_TEX_FILTER_NEAREST && state->mag_img_filter == PIPE_TEX_FILTER_NEAREST && state->compare_mode == PIPE_TEX_COMPARE_NONE) || @@ -4379,6 +4395,7 @@ static void *si_create_sampler_state(struct pipe_context *ctx, .unnormalized_coords = state->unnormalized_coords, .cube_wrap = state->seamless_cube_map, .trunc_coord = trunc_coord, + .filter_mode = filter_mode, .mag_filter = si_tex_filter(state->mag_img_filter, max_aniso), .min_filter = si_tex_filter(state->min_img_filter, max_aniso), .mip_filter = si_tex_mipfilter(state->min_mip_filter),