#define PIPELINE_SELECT                                GFXPIPE_SINGLE_DW_CMD(0x1, 0x4)
 
+#define CMD_3DSTATE_DRAWING_RECTANGLE_FAST     GFXPIPE_3D_CMD(0x0, 0x0)
 #define CMD_3DSTATE_CLEAR_PARAMS               GFXPIPE_3D_CMD(0x0, 0x4)
 #define CMD_3DSTATE_DEPTH_BUFFER               GFXPIPE_3D_CMD(0x0, 0x5)
 #define CMD_3DSTATE_STENCIL_BUFFER             GFXPIPE_3D_CMD(0x0, 0x6)
 
 
        MATCH(PIPELINE_SELECT);
 
+       MATCH3D(3DSTATE_DRAWING_RECTANGLE_FAST);
        MATCH3D(3DSTATE_CLEAR_PARAMS);
        MATCH3D(3DSTATE_DEPTH_BUFFER);
        MATCH3D(3DSTATE_STENCIL_BUFFER);
 
        switch (GRAPHICS_VERx100(xe)) {
        case 1255:
-       case 1270:
-       case 1271:
+       case 1270 ... 2004:
                state_table = xe_hpg_svg_state;
                state_table_size = ARRAY_SIZE(xe_hpg_svg_state);
                break;
                xe_gt_assert(gt, num_dw != 0);
                xe_gt_assert(gt, is_single_dw ^ (num_dw > 1));
 
+               /*
+                * Xe2's SVG context is the same as the one on DG2 / MTL
+                * except that 3DSTATE_DRAWING_RECTANGLE (non-pipelined) has
+                * been replaced by 3DSTATE_DRAWING_RECTANGLE_FAST (pipelined).
+                * Just make the replacement here rather than defining a
+                * whole separate table for the single trivial change.
+                */
+               if (GRAPHICS_VER(xe) >= 20 &&
+                   instr == CMD_3DSTATE_DRAWING_RECTANGLE)
+                       instr = CMD_3DSTATE_DRAWING_RECTANGLE_FAST;
+
                bb->cs[bb->len] = instr;
                if (!is_single_dw)
                        bb->cs[bb->len] |= (num_dw - 2);