nir,panfrost,agx: Fix driver PIXEL_COORD_INTEGER setting and drop workaround.

nir_lower_frag_coord_to_pixel_coord was adding .5 to work around that the
drivers were mistakenly setting PIXEL_COORD_HALF_INTEGER.  With the
setting corrected, the GL frontend handles it appropriately (instead of
subtracting half in the frontend for ARB_fragment_coord_conventions
integer setting and then adding the half back here), and makes the pass
reusable from Intel.

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29585>
This commit is contained in:
Emma Anholt
2023-09-12 10:12:40 -07:00
committed by Marge Bot
parent 6a9596be56
commit 3beae0f98e
5 changed files with 17 additions and 11 deletions

View File

@@ -13,13 +13,11 @@ lower(nir_builder *b, nir_intrinsic_instr *intr, UNUSED void *data)
if (intr->intrinsic != nir_intrinsic_load_frag_coord)
return false;
/* load_pixel_coord gives the top-left corner of the pixel, but frag_coord
* should return the centre of the pixel.
/* Note: frag_coord should already have pixel-center lowering applied with
* nir_lower_wpos_center for VK, or PIPE_CAP_PIXEL_CENTER_INTEGER for GL.
*/
b->cursor = nir_before_instr(&intr->instr);
nir_def *top_left_xy = nir_u2f32(b, nir_load_pixel_coord(b));
nir_def *xy = nir_fadd_imm(b, top_left_xy, 0.5);
nir_def *xy = nir_u2f32(b, nir_load_pixel_coord(b));
nir_def *vec = nir_vec4(b, nir_channel(b, xy, 0), nir_channel(b, xy, 1),
nir_load_frag_coord_zw(b, .component = 2),
nir_load_frag_coord_zw(b, .component = 3));

View File

@@ -1670,13 +1670,13 @@ agx_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return 12;
case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_FS_FACE_IS_INTEGER_SYSVAL:
case PIPE_CAP_FS_POSITION_IS_SYSVAL:
return true;
case PIPE_CAP_FS_COORD_ORIGIN_LOWER_LEFT:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_FS_POINT_IS_SYSVAL:
return false;

View File

@@ -242,13 +242,17 @@ panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
return PAN_MAX_MIP_LEVELS;
case PIPE_CAP_FS_COORD_ORIGIN_LOWER_LEFT:
/* pixel coord is in integer sysval on bifrost. */
case PIPE_CAP_FS_COORD_PIXEL_CENTER_INTEGER:
/* Hardware is upper left. Pixel center at (0.5, 0.5) */
return dev->arch >= 6;
case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
return dev->arch < 6;
case PIPE_CAP_FS_COORD_ORIGIN_LOWER_LEFT:
/* Hardware is upper left */
return 0;
case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_TGSI_TEXCOORD:
return 1;

View File

@@ -36,7 +36,8 @@ static bool
pan_lower_sample_pos_impl(struct nir_builder *b, nir_intrinsic_instr *intr,
UNUSED void *data)
{
if (intr->intrinsic != nir_intrinsic_load_sample_pos)
if (intr->intrinsic != nir_intrinsic_load_sample_pos &&
intr->intrinsic != nir_intrinsic_load_sample_pos_or_center)
return false;
b->cursor = nir_before_instr(&intr->instr);

View File

@@ -318,6 +318,9 @@ panvk_per_arch(shader_create)(struct panvk_device *dev,
NIR_PASS_V(nir, nir_lower_compute_system_values, &options);
if (nir->info.stage == MESA_SHADER_FRAGMENT)
NIR_PASS_V(nir, nir_lower_wpos_center);
NIR_PASS_V(nir, nir_split_var_copies);
NIR_PASS_V(nir, nir_lower_var_copies);