nv50: make use of TGSI immediate type
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 31 Aug 2010 18:36:45 +0000 (20:36 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 1 Sep 2010 16:02:50 +0000 (18:02 +0200)
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_program.h
src/gallium/drivers/nv50/nv50_tgsi_to_nc.c

index 182a591eb37726a4e74a9473a0636ba6ec07411c..523603ca3af3c730e6d0aa57c8e42989d88b5d59 100644 (file)
@@ -187,13 +187,14 @@ prog_immediate(struct nv50_translation_info *ti,
                const struct tgsi_full_immediate *imm)
 {
    int c;
-   unsigned n = ++ti->immd32_nr;
+   unsigned n = ti->immd32_nr++;
 
-   if (n == (1 << (ffs(n) - 1)))
-      ti->immd32 = REALLOC(ti->immd32, (n / 2) * 16, (n * 2) * 16);
+   assert(ti->immd32_nr <= ti->scan.immediate_count);
 
    for (c = 0; c < 4; ++c)
-      ti->immd32[(n - 1) * 4 + c] = imm->u[c].Uint;
+      ti->immd32[n * 4 + c] = imm->u[c].Uint;
+
+   ti->immd32_ty[n] = imm->Immediate.DataType;
 }
 
 static INLINE unsigned
@@ -495,6 +496,9 @@ nv50_prog_scan(struct nv50_translation_info *ti)
    tgsi_dump(p->pipe.tokens, 0);
 #endif
 
+   ti->immd32 = (uint32_t *)MALLOC(ti->scan.immediate_count * 16);
+   ti->immd32_ty = (ubyte *)MALLOC(ti->scan.immediate_count * sizeof(ubyte));
+
    tgsi_parse_init(&parse, p->pipe.tokens);
    while (!tgsi_parse_end_of_tokens(&parse)) {
       tgsi_parse_token(&parse);
@@ -561,6 +565,8 @@ nv50_program_tx(struct nv50_program *p)
 out:
    if (ti->immd32)
       FREE(ti->immd32);
+   if (ti->immd32_ty)
+      FREE(ti->immd32_ty);
    FREE(ti);
    return ret ? FALSE : TRUE;
 }
index 1184d9be3b44fd37f1bf67b863d36fcfab6137e8..639f06217ed94ab55fbc3eb2734bb26068a328f9 100644 (file)
@@ -116,6 +116,7 @@ struct nv50_translation_info {
    struct tgsi_shader_info scan;
    uint32_t *immd32;
    unsigned immd32_nr;
+   ubyte *immd32_ty;
    ubyte edgeflag_out;
    struct nv50_subroutine subr[NV50_PROG_MAX_SUBROUTINES];
    int subr_nr;
index 27d851e9fdbf31a959f89c49643c65f08427dda9..141d2cd325f6686a05b4f2e4170ab8f8255afdcc 100644 (file)
@@ -1022,7 +1022,15 @@ emit_fetch(struct bld_context *bld, const struct tgsi_full_instruction *insn,
    case TGSI_FILE_IMMEDIATE:
       assert(idx < bld->ti->immd32_nr);
       res = bld_load_imm_u32(bld, bld->ti->immd32[idx * 4 + swz]);
-      res->reg.type = type;
+
+      switch (bld->ti->immd32_ty[idx]) {
+      case TGSI_IMM_FLOAT32: res->reg.type = NV_TYPE_F32; break;
+      case TGSI_IMM_UINT32: res->reg.type = NV_TYPE_U32; break;
+      case TGSI_IMM_INT32: res->reg.type = NV_TYPE_S32; break;
+      default:
+         res->reg.type = type;
+         break;
+      }
       break;
    case TGSI_FILE_INPUT:
       res = bld_saved_input(bld, idx, swz);