nv50/ir/tgsi: generate UCPs with actual outputs instead of SVs
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 7 Apr 2012 20:46:35 +0000 (22:46 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 14 Apr 2012 19:54:04 +0000 (21:54 +0200)
gl_ClipDistance is treated the same way, this is just nicer and
easier assign slots for them on nv50.

src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp

index 9fab1c3..1cfaf3a 100644 (file)
@@ -700,9 +700,18 @@ bool Source::scanSource()
    if (mainTempsInLMem)
       info->bin.tlsSpace += (scan.file_max[TGSI_FILE_TEMPORARY] + 1) * 16;
 
-   if (info->io.genUserClip > 0)
+   if (info->io.genUserClip > 0) {
       info->io.clipDistanceMask = (1 << info->io.genUserClip) - 1;
 
+      for (unsigned int n = 0; n < ((info->io.genUserClip + 3) / 4); ++n) {
+         unsigned int i = info->numOutputs++;
+         info->out[i].id = i;
+         info->out[i].sn = TGSI_SEMANTIC_CLIPDIST;
+         info->out[i].si = n;
+         info->out[i].mask = info->io.clipDistanceMask >> (n * 4);
+      }
+   }
+
    return info->assignSlots(info) == 0;
 }
 
@@ -2234,7 +2243,7 @@ void
 Converter::handleUserClipPlanes()
 {
    Value *res[8];
-   int i, c;
+   int n, i, c;
 
    for (c = 0; c < 4; ++c) {
       for (i = 0; i < info->io.genUserClip; ++i) {
@@ -2248,8 +2257,15 @@ Converter::handleUserClipPlanes()
       }
    }
 
-   for (i = 0; i < info->io.genUserClip; ++i)
-      mkOp2(OP_WRSV, TYPE_F32, NULL, mkSysVal(SV_CLIP_DISTANCE, i), res[i]);
+   const int first = info->numOutputs - (info->io.genUserClip + 3) / 4;
+
+   for (i = 0; i < info->io.genUserClip; ++i) {
+      n = i / 4 + first;
+      c = i % 4;
+      Symbol *sym =
+         mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, info->out[n].slot[c] * 4);
+      mkStore(OP_EXPORT, TYPE_F32, sym, NULL, res[i]);
+   }
 }
 
 void