radeonsi: add GL_EXT_texture_filter_minmax extension

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29653>
This commit is contained in:
Ganesh Belgur Ramachandra
2024-06-10 09:04:16 -05:00
committed by Marge Bot
parent 11c27a6237
commit 1f9bafbc74
2 changed files with 23 additions and 0 deletions

View File

@@ -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;

View File

@@ -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),