OSDN Git Service

i965: a little better way of handling immediates
authorZack Rusin <zack@tungstengraphics.com>
Mon, 24 Dec 2007 12:57:34 +0000 (07:57 -0500)
committerZack Rusin <zack@tungstengraphics.com>
Mon, 24 Dec 2007 12:57:34 +0000 (07:57 -0500)
src/mesa/pipe/i965simple/brw_context.h
src/mesa/pipe/i965simple/brw_curbe.c
src/mesa/pipe/i965simple/brw_vs_emit.c

index 139f13a..c610a43 100644 (file)
@@ -329,6 +329,7 @@ struct brw_vs_prog_data {
 
    float    imm_buf[PIPE_MAX_CONSTANT][4];
    unsigned num_imm;
+   unsigned num_consts;
 
    /* Used for calculating urb partitions:
     */
index 603116c..4d79a7a 100644 (file)
@@ -252,9 +252,14 @@ static void upload_constant_buffer(struct brw_context *brw)
       /*unsigned nr = vp->max_const;*/
       const struct pipe_constant_buffer *cbuffer = brw->attribs.Constants[0];
       struct pipe_winsys *ws = brw->pipe.winsys;
-      if (cbuffer->size) {
+      /* FIXME: buffer size is num_consts + num_immediates */
+      if (brw->vs.prog_data->num_consts) {
          /* map the vertex constant buffer and copy to curbe: */
          ws->buffer_map(ws, cbuffer->buffer, 0);
+         /* FIXME: this is wrong. the cbuffer->size currently
+          * represents size of consts + immediates. so if we'll
+          * have both we'll copy over the end of the buffer
+          * with the subsequent memcpy */
          ws->buffer_get_subdata(ws, cbuffer->buffer,
                                 0,
                                 cbuffer->size,
@@ -263,12 +268,10 @@ static void upload_constant_buffer(struct brw_context *brw)
          offset += cbuffer->size;
       }
       /*immediates*/
-#if 0
       if (brw->vs.prog_data->num_imm) {
          memcpy(&buf[offset], brw->vs.prog_data->imm_buf,
                 brw->vs.prog_data->num_imm * 4 * sizeof(float));
       }
-#endif
    }
 
    if (1) {
index f3507f6..0cc0a43 100644 (file)
@@ -630,6 +630,8 @@ static struct brw_reg get_reg( struct brw_vs_compile *c,
       assert(c->regs[file][index].nr != 0);
       return c->regs[file][index];
    case TGSI_FILE_CONSTANT:
+      assert(c->regs[TGSI_FILE_CONSTANT][index + c->prog_data.num_consts].nr != 0);
+      return c->regs[TGSI_FILE_CONSTANT][index + c->prog_data.num_consts];
    case TGSI_FILE_IMMEDIATE:
       assert(c->regs[TGSI_FILE_CONSTANT][index].nr != 0);
       return c->regs[TGSI_FILE_CONSTANT][index];
@@ -1317,6 +1319,7 @@ void brw_vs_emit(struct brw_vs_compile *c)
             /* first instruction (declerations finished).
              * now that we know what vars are being used allocate
              * registers for them.*/
+            c->prog_data.num_consts = prog_info.num_consts;
             c->prog_data.max_const = prog_info.num_consts + c->prog_data.num_imm;
             brw_vs_alloc_regs(c, &prog_info);