+static void
+swtnl_restart_ttri(struct nv04_context *nv04, struct nouveau_pushbuf *push)
+{
+ BEGIN_NV04(push, NV04_TTRI(COLORKEY), 7);
+ PUSH_DATA (push, nv04->colorkey);
+ PUSH_RELOC(push, nv04->texture[0]->bo, nv04->texture[0]->offset,
+ NOUVEAU_BO_LOW, 0, 0);
+ PUSH_RELOC(push, nv04->texture[0]->bo, nv04->format[0], NOUVEAU_BO_OR,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_A,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_B);
+ PUSH_DATA (push, nv04->filter[0]);
+ PUSH_DATA (push, nv04->blend);
+ PUSH_DATA (push, nv04->ctrl[0] & ~0x3e000000);
+ PUSH_DATA (push, nv04->fog);
+}
+
+static void
+swtnl_restart_mtri(struct nv04_context *nv04, struct nouveau_pushbuf *push)
+{
+ BEGIN_NV04(push, NV04_MTRI(OFFSET(0)), 8);
+ PUSH_RELOC(push, nv04->texture[0]->bo, nv04->texture[0]->offset,
+ NOUVEAU_BO_LOW, 0, 0);
+ PUSH_RELOC(push, nv04->texture[1]->bo, nv04->texture[1]->offset,
+ NOUVEAU_BO_LOW, 0, 0);
+ PUSH_RELOC(push, nv04->texture[0]->bo, nv04->format[0], NOUVEAU_BO_OR,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_A,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_B);
+ PUSH_RELOC(push, nv04->texture[1]->bo, nv04->format[1], NOUVEAU_BO_OR,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_A,
+ NV04_TEXTURED_TRIANGLE_FORMAT_DMA_B);
+ PUSH_DATA (push, nv04->filter[0]);
+ PUSH_DATA (push, nv04->filter[1]);
+ PUSH_DATA (push, nv04->alpha[0]);
+ PUSH_DATA (push, nv04->color[0]);
+ BEGIN_NV04(push, NV04_MTRI(COMBINE_ALPHA(1)), 8);
+ PUSH_DATA (push, nv04->alpha[1]);
+ PUSH_DATA (push, nv04->color[1]);
+ PUSH_DATA (push, nv04->factor);
+ PUSH_DATA (push, nv04->blend & ~0x0000000f);
+ PUSH_DATA (push, nv04->ctrl[0]);
+ PUSH_DATA (push, nv04->ctrl[1]);
+ PUSH_DATA (push, nv04->ctrl[2]);
+ PUSH_DATA (push, nv04->fog);
+}
+
+static inline bool
+swtnl_restart(struct gl_context *ctx, int multi, unsigned vertex_size)
+{
+ const int tex_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
+ struct nv04_context *nv04 = to_nv04_context(ctx);
+ struct nouveau_pushbuf *push = context_push(ctx);
+ struct nouveau_pushbuf_refn refs[] = {
+ { nv04->texture[0]->bo, tex_flags },
+ { nv04->texture[1]->bo, tex_flags },
+ };
+
+ /* wait for enough space for state, and at least one whole primitive */
+ if (nouveau_pushbuf_space(push, 32 + (4 * vertex_size), 4, 0) ||
+ nouveau_pushbuf_refn (push, refs, multi ? 2 : 1))
+ return false;
+
+ /* emit engine state */
+ if (multi)
+ swtnl_restart_mtri(nv04, push);
+ else
+ swtnl_restart_ttri(nv04, push);
+
+ return true;
+}
+