radeonsi: add GL_ARB_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-26 06:50:39 -05:00
committed by Marge Bot
parent 1f9bafbc74
commit 9c8dffd282
2 changed files with 40 additions and 0 deletions
+1
View File
@@ -192,6 +192,7 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
* (it might work sometimes, but that's not enough)
*/
case PIPE_CAP_SAMPLER_REDUCTION_MINMAX:
case PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB:
return !(sscreen->info.family == CHIP_TAHITI || sscreen->info.family == CHIP_VERDE);
case PIPE_CAP_TEXTURE_TRANSFER_MODES:
+39
View File
@@ -2245,6 +2245,40 @@ static bool si_is_zs_format_supported(enum pipe_format format)
return ac_is_zs_format_supported(format);
}
/* GFX6-8:
* - no integer format support
* - no depth format support (depth formats without shadow samplers are supported,
* but that's not enough)
* - only single-channel formats are supported
* - limitations of early chips (GFX6 only): no R9G9B9E5 support
*
* GFX9+:
* - all formats are supported
*/
static bool si_is_reduction_mode_supported(struct pipe_screen *screen, enum pipe_format format)
{
struct si_screen *sscreen = (struct si_screen *)screen;
const struct util_format_description *desc = util_format_description(format);
if (sscreen->info.gfx_level <= GFX8) {
/* old HW limitations */
if (sscreen->info.gfx_level == GFX6 &&
format == PIPE_FORMAT_R9G9B9E5_FLOAT)
return false;
/* reject if more than one channel */
if (desc->nr_channels > 1)
return false;
/* no integer or depth format support */
if (util_format_is_pure_integer(format) ||
util_format_has_depth(desc))
return false;
}
return true;
}
static bool si_is_format_supported(struct pipe_screen *screen, enum pipe_format format,
enum pipe_texture_target target, unsigned sample_count,
unsigned storage_sample_count, unsigned usage)
@@ -2343,6 +2377,11 @@ static bool si_is_format_supported(struct pipe_screen *screen, enum pipe_format
!(usage & PIPE_BIND_DEPTH_STENCIL))
retval |= PIPE_BIND_LINEAR;
if ((usage & PIPE_BIND_SAMPLER_REDUCTION_MINMAX) &&
screen->get_param(screen, PIPE_CAP_SAMPLER_REDUCTION_MINMAX) &&
si_is_reduction_mode_supported(screen, format))
retval |= PIPE_BIND_SAMPLER_REDUCTION_MINMAX;
return retval == usage;
}