uint32_t val = fd3_rasterizer_stateobj(ctx->rasterizer)
                                ->gras_cl_clip_cntl;
                uint8_t planes = ctx->rasterizer->clip_plane_enable;
+               val |= CONDREG(ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL),
+                               A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER);
+               val |= CONDREG(ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL),
+                               A3XX_GRAS_CL_CLIP_CNTL_IJ_NON_PERSP_CENTER);
+               val |= CONDREG(ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID),
+                               A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTROID);
+               val |= CONDREG(ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID),
+                               A3XX_GRAS_CL_CLIP_CNTL_IJ_NON_PERSP_CENTROID);
+               /* docs say enable at least one of IJ_PERSP_CENTER/CENTROID when fragcoord is used */
+               val |= CONDREG(ir3_find_sysval_regid(fp, SYSTEM_VALUE_FRAG_COORD),
+                               A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER);
                val |= COND(fp->writes_pos, A3XX_GRAS_CL_CLIP_CNTL_ZCLIP_DISABLE);
                val |= COND(fp->fragcoord_compmask != 0, A3XX_GRAS_CL_CLIP_CNTL_ZCOORD |
                                A3XX_GRAS_CL_CLIP_CNTL_WCOORD);
 
        enum a3xx_instrbuffermode fpbuffer, vpbuffer;
        uint32_t fpbuffersz, vpbuffersz, fsoff;
        uint32_t pos_regid, posz_regid, psize_regid;
-       uint32_t vcoord_regid, face_regid, coord_regid, zwcoord_regid;
+       uint32_t ij_regid[4], face_regid, coord_regid, zwcoord_regid;
        uint32_t color_regid[4] = {0};
        int constmode;
        int i, j;
        face_regid      = ir3_find_sysval_regid(fp, SYSTEM_VALUE_FRONT_FACE);
        coord_regid     = ir3_find_sysval_regid(fp, SYSTEM_VALUE_FRAG_COORD);
        zwcoord_regid   = (coord_regid == regid(63,0)) ? regid(63,0) : (coord_regid + 2);
-       vcoord_regid    = ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL);
+       ij_regid[0] = ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL);
+       ij_regid[1] = ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL);
+       ij_regid[2] = ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID);
+       ij_regid[3] = ir3_find_sysval_regid(fp, SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID);
 
        /* adjust regids for alpha output formats. there is no alpha render
         * format, so it's just treated like red
                        A3XX_HLSQ_CONTROL_1_REG_FRAGCOORDZWREGID(zwcoord_regid));
        OUT_RING(ring, A3XX_HLSQ_CONTROL_2_REG_PRIMALLOCTHRESHOLD(31) |
                        A3XX_HLSQ_CONTROL_2_REG_FACENESSREGID(face_regid));
-       OUT_RING(ring, A3XX_HLSQ_CONTROL_3_REG_IJPERSPCENTERREGID(vcoord_regid));
+       OUT_RING(ring,
+                       A3XX_HLSQ_CONTROL_3_REG_IJPERSPCENTERREGID(ij_regid[0]) |
+                       A3XX_HLSQ_CONTROL_3_REG_IJNONPERSPCENTERREGID(ij_regid[1]) |
+                       A3XX_HLSQ_CONTROL_3_REG_IJPERSPCENTROIDREGID(ij_regid[2]) |
+                       A3XX_HLSQ_CONTROL_3_REG_IJNONPERSPCENTROIDREGID(ij_regid[3]));
        OUT_RING(ring, A3XX_HLSQ_VS_CONTROL_REG_CONSTLENGTH(vp->constlen) |
                        A3XX_HLSQ_VS_CONTROL_REG_CONSTSTARTOFFSET(0) |
                        A3XX_HLSQ_VS_CONTROL_REG_INSTRLENGTH(vpbuffersz));