<div dir="ltr">On 20 August 2013 11:30, Paul Berry <span dir="ltr"><<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The arguments to brw_urb_WRITE() were getting pretty unwieldy, and we<br>
have to add more flags to support geometry shaders anyhow.<br>
<br>
Also plumb these flags through brw_clip_emit_vue(),<br>
brw_set_urb_message(), and the vec4_instruction class.<br>
---<br>
 src/mesa/drivers/dri/i965/brw_clip.h           |  3 +-<br>
 src/mesa/drivers/dri/i965/brw_clip_line.c      |  4 +--<br>
 src/mesa/drivers/dri/i965/brw_clip_tri.c       |  6 ++--<br>
 src/mesa/drivers/dri/i965/brw_clip_unfilled.c  |  6 ++--<br>
 src/mesa/drivers/dri/i965/brw_clip_util.c      | 19 +++++-------<br>
 src/mesa/drivers/dri/i965/brw_eu.h             | 42 +++++++++++++++++++++++---<br>
 src/mesa/drivers/dri/i965/brw_eu_emit.c        | 32 ++++++++------------<br>
 src/mesa/drivers/dri/i965/brw_gs_emit.c        |  6 ++--<br>
 src/mesa/drivers/dri/i965/brw_sf_emit.c        | 20 +++---------<br>
 src/mesa/drivers/dri/i965/brw_vec4.h           |  2 +-<br>
 src/mesa/drivers/dri/i965/brw_vec4_emit.cpp    |  5 +--<br>
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |  2 +-<br>
 12 files changed, 76 insertions(+), 71 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_clip.h b/src/mesa/drivers/dri/i965/brw_clip.h<br>
index f26d75d..5af0ad3 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_clip.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_clip.h<br>
@@ -173,8 +173,7 @@ void brw_clip_init_planes( struct brw_clip_compile *c );<br>
<br>
 void brw_clip_emit_vue(struct brw_clip_compile *c,<br>
                       struct brw_indirect vert,<br>
-                      bool allocate,<br>
-                      bool eot,<br>
+                       unsigned flags,<br></blockquote><div><br>From our in-person code review yesterday:<br><br></div><div>Francisco noted that we can make declarations like this one use type "enum brw_urb_write_flags" and get additional type checking in C++.  We can avoid the need for ugly casts in C++ that manipulates the bitfield by overloading operator|, e.g.:<br>
<br></div><div>inline brw_urb_write_flags operator|(brw_urb_write_flags x, brw_urb_write_flags y)<br>{<br></div><div>  ...ugly type casting goes here...<br>}<br><br></div><div>This has the advantage of preventing mistakes where we accidentally try to mix and match unrelated enums into the bitfield.<br>
<br></div><div>Also, it's possible using templates to declare this operator overload in one place, and then apply it to whatever enums we want using traits classes.<br><br></div><div>Due to the varying levels of C++ enthusiasm/disdain in the group, we wanted to have a chance to see exactly what the code would look like before deciding whether to do it.  So I volunteered to try it out as a follow-up patch.  In my initial effort I'll just overload the operator--I won't use the templates/traits approach.  If we like how that goes, we can explore the possibility of the templates/traits approach as a further follow-up.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                       GLuint header);<br>
<br>
 void brw_clip_kill_thread(struct brw_clip_compile *c);<br>
diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c b/src/mesa/drivers/dri/i965/brw_clip_line.c<br>
index 8466b1c..5238598 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_clip_line.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_clip_line.c<br>
@@ -282,10 +282,10 @@ static void clip_and_emit_line( struct brw_clip_compile *c )<br>
       brw_clip_interp_vertex(c, newvtx0, vtx0, vtx1, c->reg.t0, false);<br>
       brw_clip_interp_vertex(c, newvtx1, vtx1, vtx0, c->reg.t1, false);<br>
<br>
-      brw_clip_emit_vue(c, newvtx0, 1, 0,<br>
+      brw_clip_emit_vue(c, newvtx0, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                         (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                         | URB_WRITE_PRIM_START);<br>
-      brw_clip_emit_vue(c, newvtx1, 0, 1,<br>
+      brw_clip_emit_vue(c, newvtx1, BRW_URB_WRITE_EOT_COMPLETE,<br>
                         (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                         | URB_WRITE_PRIM_END);<br>
    }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c<br>
index 1eeb995..995a890 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_clip_tri.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c<br>
@@ -466,7 +466,7 @@ void brw_clip_tri_emit_polygon(struct brw_clip_compile *c)<br>
       brw_MOV(p, get_addr_reg(vptr), brw_address(c->reg.inlist));<br>
       brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));<br>
<br>
-      brw_clip_emit_vue(c, v0, 1, 0,<br>
+      brw_clip_emit_vue(c, v0, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                         ((_3DPRIM_TRIFAN << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                          | URB_WRITE_PRIM_START));<br>
<br>
@@ -475,7 +475,7 @@ void brw_clip_tri_emit_polygon(struct brw_clip_compile *c)<br>
<br>
       brw_DO(p, BRW_EXECUTE_1);<br>
       {<br>
-        brw_clip_emit_vue(c, v0, 1, 0,<br>
+        brw_clip_emit_vue(c, v0, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                            (_3DPRIM_TRIFAN << URB_WRITE_PRIM_TYPE_SHIFT));<br>
<br>
         brw_ADD(p, get_addr_reg(vptr), get_addr_reg(vptr), brw_imm_uw(2));<br>
@@ -486,7 +486,7 @@ void brw_clip_tri_emit_polygon(struct brw_clip_compile *c)<br>
       }<br>
       brw_WHILE(p);<br>
<br>
-      brw_clip_emit_vue(c, v0, 0, 1,<br>
+      brw_clip_emit_vue(c, v0, BRW_URB_WRITE_EOT_COMPLETE,<br>
                         ((_3DPRIM_TRIFAN << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                          | URB_WRITE_PRIM_END));<br>
    }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c<br>
index af327d6..644c99a 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c<br>
@@ -319,10 +319,10 @@ static void emit_lines(struct brw_clip_compile *c,<br>
              brw_imm_f(0));<br>
       brw_IF(p, BRW_EXECUTE_1);<br>
       {<br>
-        brw_clip_emit_vue(c, v0, 1, 0,<br>
+        brw_clip_emit_vue(c, v0, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                            (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                            | URB_WRITE_PRIM_START);<br>
-        brw_clip_emit_vue(c, v1, 1, 0,<br>
+        brw_clip_emit_vue(c, v1, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                            (_3DPRIM_LINESTRIP << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                            | URB_WRITE_PRIM_END);<br>
       }<br>
@@ -364,7 +364,7 @@ static void emit_points(struct brw_clip_compile *c,<br>
         if (do_offset)<br>
            apply_one_offset(c, v0);<br>
<br>
-        brw_clip_emit_vue(c, v0, 1, 0,<br>
+        brw_clip_emit_vue(c, v0, BRW_URB_WRITE_ALLOCATE_COMPLETE,<br>
                            (_3DPRIM_POINTLIST << URB_WRITE_PRIM_TYPE_SHIFT)<br>
                            | URB_WRITE_PRIM_START | URB_WRITE_PRIM_END);<br>
       }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_clip_util.c b/src/mesa/drivers/dri/i965/brw_clip_util.c<br>
index 62172ec..d5c50d7 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_clip_util.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_clip_util.c<br>
@@ -313,15 +313,18 @@ void brw_clip_interp_vertex( struct brw_clip_compile *c,<br>
<br>
 void brw_clip_emit_vue(struct brw_clip_compile *c,<br>
                       struct brw_indirect vert,<br>
-                      bool allocate,<br>
-                      bool eot,<br>
+                       unsigned flags,<br>
                       GLuint header)<br>
 {<br>
    struct brw_compile *p = &c->func;<br>
+   bool allocate = flags & BRW_URB_WRITE_ALLOCATE;<br>
<br>
    brw_clip_ff_sync(c);<br>
<br>
-   assert(!(allocate && eot));<br>
+   /* Any URB entry that is allocated must subsequently be used or discarded,<br>
+    * so it doesn't make sense to mark EOT and ALLOCATE at the same time.<br>
+    */<br>
+   assert(!(allocate && (flags & BRW_URB_WRITE_EOT)));<br>
<br>
    /* Copy the vertex from vertn into m1..mN+1:<br>
     */<br>
@@ -343,12 +346,9 @@ void brw_clip_emit_vue(struct brw_clip_compile *c,<br>
                 allocate ? c->reg.R0 : retype(brw_null_reg(), BRW_REGISTER_TYPE_UD),<br>
                 0,<br>
                 c->reg.R0,<br>
-                allocate,<br>
-                1,             /* used */<br>
+                 flags,<br>
                 c->nr_regs + 1, /* msg length */<br>
                 allocate ? 1 : 0, /* response_length */<br>
-                eot,           /* eot */<br>
-                1,             /* writes_complete */<br>
                 0,             /* urb offset */<br>
                 BRW_URB_SWIZZLE_NONE);<br>
 }<br>
@@ -367,12 +367,9 @@ void brw_clip_kill_thread(struct brw_clip_compile *c)<br>
                 retype(brw_null_reg(), BRW_REGISTER_TYPE_UD),<br>
                 0,<br>
                 c->reg.R0,<br>
-                0,             /* allocate */<br>
-                0,             /* used */<br>
+                 BRW_URB_WRITE_UNUSED | BRW_URB_WRITE_EOT_COMPLETE,<br>
                 1,             /* msg len */<br>
                 0,             /* response len */<br>
-                1,             /* eot */<br>
-                1,             /* writes complete */<br>
                 0,<br>
                 BRW_URB_SWIZZLE_NONE);<br>
 }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h<br>
index 0e08e89..ae4cab5 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_eu.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_eu.h<br>
@@ -228,16 +228,50 @@ void brw_set_dp_write_message(struct brw_compile *p,<br>
                              GLuint end_of_thread,<br>
                              GLuint send_commit_msg);<br>
<br>
+enum brw_urb_write_flags {<br>
+   /**<br>
+    * Causes a new URB entry to be allocated, and its address stored in the<br>
+    * destination register (gen < 7).<br>
+    */<br>
+   BRW_URB_WRITE_ALLOCATE = 0x1,<br>
+<br>
+   /**<br>
+    * Causes the current URB entry to be deallocated (gen < 7).<br>
+    */<br>
+   BRW_URB_WRITE_UNUSED = 0x2,<br>
+<br>
+   /**<br>
+    * Causes the thread to terminate.<br>
+    */<br>
+   BRW_URB_WRITE_EOT = 0x4,<br>
+<br>
+   /**<br>
+    * Indicates that the given URB entry is complete, and may be sent further<br>
+    * down the 3D pipeline (gen < 7).<br>
+    */<br>
+   BRW_URB_WRITE_COMPLETE = 0x8,<br>
+<br>
+   /**<br>
+    * Convenient combination of flags: end the thread while simultaneously<br>
+    * marking the given URB entry as complete.<br>
+    */<br>
+   BRW_URB_WRITE_EOT_COMPLETE = BRW_URB_WRITE_EOT | BRW_URB_WRITE_COMPLETE,<br>
+<br>
+   /**<br>
+    * Convenient combination of flags: mark the given URB entry as complete<br>
+    * and simultaneously allocate a new one.<br>
+    */<br>
+   BRW_URB_WRITE_ALLOCATE_COMPLETE =<br>
+      BRW_URB_WRITE_ALLOCATE | BRW_URB_WRITE_COMPLETE,<br>
+};<br>
+<br>
 void brw_urb_WRITE(struct brw_compile *p,<br>
                   struct brw_reg dest,<br>
                   GLuint msg_reg_nr,<br>
                   struct brw_reg src0,<br>
-                  bool allocate,<br>
-                  bool used,<br>
+                   unsigned flags,<br>
                   GLuint msg_length,<br>
                   GLuint response_length,<br>
-                  bool eot,<br>
-                  bool writes_complete,<br>
                   GLuint offset,<br>
                   GLuint swizzle);<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
index 204cea2..622b22f 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
@@ -515,19 +515,17 @@ static void brw_set_ff_sync_message(struct brw_compile *p,<br>
<br>
 static void brw_set_urb_message( struct brw_compile *p,<br>
                                 struct brw_instruction *insn,<br>
-                                bool allocate,<br>
-                                bool used,<br>
+                                 unsigned flags,<br>
                                 GLuint msg_length,<br>
                                 GLuint response_length,<br>
-                                bool end_of_thread,<br>
-                                bool complete,<br>
                                 GLuint offset,<br>
                                 GLuint swizzle_control )<br>
 {<br>
    struct brw_context *brw = p->brw;<br>
<br>
    brw_set_message_descriptor(p, insn, BRW_SFID_URB,<br>
-                             msg_length, response_length, true, end_of_thread);<br>
+                             msg_length, response_length, true,<br>
+                              flags & BRW_URB_WRITE_EOT);<br>
    if (brw->gen == 7) {<br>
       insn->bits3.urb_gen7.opcode = 0; /* URB_WRITE_HWORD */<br>
       insn->bits3.urb_gen7.offset = offset;<br>
@@ -535,21 +533,21 @@ static void brw_set_urb_message( struct brw_compile *p,<br>
       insn->bits3.urb_gen7.swizzle_control = swizzle_control;<br>
       /* per_slot_offset = 0 makes it ignore offsets in message header */<br>
       insn->bits3.urb_gen7.per_slot_offset = 0;<br>
-      insn->bits3.urb_gen7.complete = complete;<br>
+      insn->bits3.urb_gen7.complete = flags & BRW_URB_WRITE_COMPLETE ? 1 : 0;<br>
    } else if (brw->gen >= 5) {<br>
       insn->bits3.urb_gen5.opcode = 0; /* URB_WRITE */<br>
       insn->bits3.urb_gen5.offset = offset;<br>
       insn->bits3.urb_gen5.swizzle_control = swizzle_control;<br>
-      insn->bits3.urb_gen5.allocate = allocate;<br>
-      insn->bits3.urb_gen5.used = used;        /* ? */<br>
-      insn->bits3.urb_gen5.complete = complete;<br>
+      insn->bits3.urb_gen5.allocate = flags & BRW_URB_WRITE_ALLOCATE ? 1 : 0;<br>
+      insn->bits3.urb_gen5.used = flags & BRW_URB_WRITE_UNUSED ? 0 : 1;<br>
+      insn->bits3.urb_gen5.complete = flags & BRW_URB_WRITE_COMPLETE ? 1 : 0;<br>
    } else {<br>
       insn->bits3.urb.opcode = 0;      /* ? */<br>
       insn->bits3.urb.offset = offset;<br>
       insn->bits3.urb.swizzle_control = swizzle_control;<br>
-      insn->bits3.urb.allocate = allocate;<br>
-      insn->bits3.urb.used = used;     /* ? */<br>
-      insn->bits3.urb.complete = complete;<br>
+      insn->bits3.urb.allocate = flags & BRW_URB_WRITE_ALLOCATE ? 1 : 0;<br>
+      insn->bits3.urb.used = flags & BRW_URB_WRITE_UNUSED ? 0 : 1;<br>
+      insn->bits3.urb.complete = flags & BRW_URB_WRITE_COMPLETE ? 1 : 0;<br>
    }<br>
 }<br>
<br>
@@ -2215,12 +2213,9 @@ void brw_urb_WRITE(struct brw_compile *p,<br>
                   struct brw_reg dest,<br>
                   GLuint msg_reg_nr,<br>
                   struct brw_reg src0,<br>
-                  bool allocate,<br>
-                  bool used,<br>
+                   unsigned flags,<br>
                   GLuint msg_length,<br>
                   GLuint response_length,<br>
-                  bool eot,<br>
-                  bool writes_complete,<br>
                   GLuint offset,<br>
                   GLuint swizzle)<br>
 {<br>
@@ -2254,12 +2249,9 @@ void brw_urb_WRITE(struct brw_compile *p,<br>
<br>
    brw_set_urb_message(p,<br>
                       insn,<br>
-                      allocate,<br>
-                      used,<br>
+                      flags,<br>
                       msg_length,<br>
                       response_length,<br>
-                      eot,<br>
-                      writes_complete,<br>
                       offset,<br>
                       swizzle);<br>
 }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_gs_emit.c b/src/mesa/drivers/dri/i965/brw_gs_emit.c<br>
index 6034a9d..fff3585 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_gs_emit.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_gs_emit.c<br>
@@ -185,12 +185,10 @@ static void brw_gs_emit_vue(struct brw_gs_compile *c,<br>
                           : retype(brw_null_reg(), BRW_REGISTER_TYPE_UD),<br>
                 0,<br>
                 c->reg.header,<br>
-                allocate,<br>
-                1,             /* used */<br>
+                allocate ? BRW_URB_WRITE_ALLOCATE_COMPLETE<br>
+                          : BRW_URB_WRITE_EOT_COMPLETE,<br>
                 c->nr_regs + 1, /* msg length */<br>
                 allocate ? 1 : 0, /* response length */<br>
-                allocate ? 0 : 1, /* eot */<br>
-                1,             /* writes_complete */<br>
                 0,             /* urb offset */<br>
                 BRW_URB_SWIZZLE_NONE);<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
index 0131de5..d329bef 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
@@ -491,12 +491,9 @@ void brw_emit_tri_setup(struct brw_sf_compile *c, bool allocate)<br>
                       brw_null_reg(),<br>
                       0,<br>
                       brw_vec8_grf(0, 0), /* r0, will be copied to m0 */<br>
-                      0,       /* allocate */<br>
-                      1,       /* used */<br>
+                       last ? BRW_URB_WRITE_EOT_COMPLETE : 0,<br>
                       4,       /* msg len */<br>
                       0,       /* response len */<br>
-                      last,    /* eot */<br>
-                      last,    /* writes complete */<br>
                       i*4,     /* offset */<br>
                       BRW_URB_SWIZZLE_TRANSPOSE); /* XXX: Swizzle control "SF to windower" */<br>
       }<br>
@@ -565,12 +562,9 @@ void brw_emit_line_setup(struct brw_sf_compile *c, bool allocate)<br>
                       brw_null_reg(),<br>
                       0,<br>
                       brw_vec8_grf(0, 0),<br>
-                      0,       /* allocate */<br>
-                      1,       /* used */<br>
+                       last ? BRW_URB_WRITE_EOT_COMPLETE : 0,<br>
                       4,       /* msg len */<br>
                       0,       /* response len */<br>
-                      last,    /* eot */<br>
-                      last,    /* writes complete */<br>
                       i*4,     /* urb destination offset */<br>
                       BRW_URB_SWIZZLE_TRANSPOSE);<br>
       }<br>
@@ -655,12 +649,9 @@ void brw_emit_point_sprite_setup(struct brw_sf_compile *c, bool allocate)<br>
                    brw_null_reg(),<br>
                    0,<br>
                    brw_vec8_grf(0, 0),<br>
-                   0,  /* allocate */<br>
-                   1,  /* used */<br>
+                    last ? BRW_URB_WRITE_EOT_COMPLETE : 0,<br>
                    4,  /* msg len */<br>
                    0,  /* response len */<br>
-                   last,       /* eot */<br>
-                   last,       /* writes complete */<br>
                    i*4,        /* urb destination offset */<br>
                    BRW_URB_SWIZZLE_TRANSPOSE);<br>
    }<br>
@@ -715,12 +706,9 @@ void brw_emit_point_setup(struct brw_sf_compile *c, bool allocate)<br>
                       brw_null_reg(),<br>
                       0,<br>
                       brw_vec8_grf(0, 0),<br>
-                      0,       /* allocate */<br>
-                      1,       /* used */<br>
+                       last ? BRW_URB_WRITE_EOT_COMPLETE : 0,<br>
                       4,       /* msg len */<br>
                       0,       /* response len */<br>
-                      last,    /* eot */<br>
-                      last,    /* writes complete */<br>
                       i*4,     /* urb destination offset */<br>
                       BRW_URB_SWIZZLE_TRANSPOSE);<br>
       }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
index 171f14d..a398f71 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
@@ -222,7 +222,7 @@ public:<br>
    int target; /**< MRT target. */<br>
    bool shadow_compare;<br>
<br>
-   bool eot;<br>
+   unsigned urb_write_flags;<br>
    bool header_present;<br>
    int mlen; /**< SEND message length */<br>
    int base_mrf; /**< First MRF in the SEND message, if mlen is nonzero. */<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp<br>
index 53b4bf2..89831de 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp<br>
@@ -405,12 +405,9 @@ vec4_generator::generate_urb_write(vec4_instruction *inst)<br>
                 brw_null_reg(), /* dest */<br>
                 inst->base_mrf, /* starting mrf reg nr */<br>
                 brw_vec8_grf(0, 0), /* src */<br>
-                false,         /* allocate */<br>
-                true,          /* used */<br>
+                 inst->urb_write_flags,<br>
                 inst->mlen,<br>
                 0,             /* response len */<br>
-                inst->eot,     /* eot */<br>
-                inst->eot,     /* writes complete */<br>
                 inst->offset,  /* urb destination offset */<br>
                 BRW_URB_SWIZZLE_INTERLEAVE);<br>
 }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
index c307049..72841e7 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
@@ -2788,7 +2788,7 @@ vec4_vs_visitor::emit_urb_write_opcode(bool complete)<br>
    }<br>
<br>
    vec4_instruction *inst = emit(VS_OPCODE_URB_WRITE);<br>
-   inst->eot = complete;<br>
+   inst->urb_write_flags = complete ? BRW_URB_WRITE_EOT_COMPLETE : 0;<br>
<br>
    return inst;<br>
 }<br>
<span class=""><font color="#888888">--<br>
1.8.3.4<br>
<br>
</font></span></blockquote></div><br></div></div>