panfrost: disable round_to_nearest_even for NEAREST samplers

When round_to_nearest_even is enabled with NEAREST filtering, texture
coordinates near texel boundaries (e.g. 0.9999999404) can be incorrectly
rounded up to the next texel instead of being floor()'d.

According to OpenCL spec section 8.2, for CLK_FILTER_NEAREST:
  i = address_mode((int)floor(u))

Backport-to: *
Signed-off-by: Eric Guo <eric.guo@nxp.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40912>
This commit is contained in:
Eric Guo 2026-04-13 13:33:16 +08:00
parent 21047e61a5
commit c415134454

View file

@ -230,6 +230,14 @@ panfrost_create_sampler_state(struct pipe_context *pctx,
cfg.border_color_a = so->base.border_color.ui[3];
#if PAN_ARCH >= 6
/*
* Disabling round_to_nearest_even for NEAREST filters ensures proper
* floor() behavior as required by OpenCL_C spec section 8.2.
*/
if (cso->mag_img_filter == PIPE_TEX_FILTER_NEAREST &&
cso->min_img_filter == PIPE_TEX_FILTER_NEAREST)
cfg.round_to_nearest_even = false;
if (cso->max_anisotropy > 1) {
cfg.maximum_anisotropy = cso->max_anisotropy;
cfg.lod_algorithm = MALI_LOD_ALGORITHM_ANISOTROPIC;