Mesa (master): mesa: get the translation from mesa 2d regs to tgsi working

Zack Rusin zack at kemper.freedesktop.org
Wed Jul 14 01:50:24 UTC 2010


Module: Mesa
Branch: master
Commit: 425870c5fdb40f7daf2e25323fa28c90c4367bae
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=425870c5fdb40f7daf2e25323fa28c90c4367bae

Author: Zack Rusin <zackr at vmware.com>
Date:   Sat Jul 10 02:02:35 2010 -0400

mesa: get the translation from mesa 2d regs to tgsi working

first working version of arb_geometry_shader4

---

 src/gallium/auxiliary/draw/draw_pt.c     |    2 +-
 src/mesa/slang/slang_emit.c              |    8 +++++++-
 src/mesa/slang/slang_link.c              |   12 +++++++++---
 src/mesa/state_tracker/st_mesa_to_tgsi.c |   19 ++++++++++---------
 src/mesa/state_tracker/st_program.c      |    3 +++
 5 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c
index 6234272..32bd3d9 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -102,7 +102,7 @@ draw_pt_arrays(struct draw_context *draw,
       opt |= PT_SHADE;
    }
 
-   if (draw->pt.middle.llvm && !draw->gs.geometry_shader) {
+   if (draw->pt.middle.llvm) {
       middle = draw->pt.middle.llvm;
    } else {
       if (opt == 0)
diff --git a/src/mesa/slang/slang_emit.c b/src/mesa/slang/slang_emit.c
index 4a02ba6..6cd9ce6 100644
--- a/src/mesa/slang/slang_emit.c
+++ b/src/mesa/slang/slang_emit.c
@@ -2320,7 +2320,13 @@ emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n)
    }
    else if (n->Store->File == PROGRAM_INPUT) {
       assert(n->Store->Index >= 0);
-      emitInfo->prog->InputsRead |= (1 << n->Store->Index);
+      /* geometry shaders have the input index in the second
+       * index */
+      if (emitInfo->prog->Target == MESA_GEOMETRY_PROGRAM &&
+          n->Store->Is2D) {
+         emitInfo->prog->InputsRead |= (1 << n->Store->Index2D);
+      } else
+         emitInfo->prog->InputsRead |= (1 << n->Store->Index);
    }
 
    if (n->Store->Index < 0) {
diff --git a/src/mesa/slang/slang_link.c b/src/mesa/slang/slang_link.c
index bc2bd31..8d5a9e9 100644
--- a/src/mesa/slang/slang_link.c
+++ b/src/mesa/slang/slang_link.c
@@ -761,9 +761,15 @@ _slang_update_inputs_outputs(struct gl_program *prog)
       const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
       for (j = 0; j < numSrc; j++) {
          if (inst->SrcReg[j].File == PROGRAM_INPUT) {
-            prog->InputsRead |= get_inputs_read_mask(prog->Target,
-                                                     inst->SrcReg[j].Index,
-                                                     inst->SrcReg[j].RelAddr);
+            if (prog->Target == MESA_GEOMETRY_PROGRAM &&
+                inst->SrcReg[j].HasIndex2D)
+               prog->InputsRead |= get_inputs_read_mask(prog->Target,
+                                                        inst->SrcReg[j].Index2D,
+                                                        inst->SrcReg[j].RelAddr2D);
+            else
+               prog->InputsRead |= get_inputs_read_mask(prog->Target,
+                                                        inst->SrcReg[j].Index,
+                                                        inst->SrcReg[j].RelAddr);
          }
          else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) {
             maxAddrReg = MAX2(maxAddrReg, (GLuint) (inst->SrcReg[j].Index + 1));
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index 050b5d1..c870db2 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -176,7 +176,7 @@ dst_register( struct st_translate *t,
       else if (t->procType == TGSI_PROCESSOR_FRAGMENT)
          assert(index < FRAG_RESULT_MAX);
       else
-         assert(0 && "geom shaders not handled in dst_register() yet");
+         assert(index < GEOM_RESULT_MAX);
 
       assert(t->outputMapping[index] < Elements(t->outputs));
 
@@ -305,6 +305,15 @@ translate_src( struct st_translate *t,
 {
    struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index );
 
+   if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2D) {
+      src = src_register( t, SrcReg->File, SrcReg->Index2D );
+      if (SrcReg->RelAddr2D)
+         src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]),
+                                            SrcReg->Index);
+      else
+         src = ureg_src_dimension( src, SrcReg->Index);
+   }
+
    src = ureg_swizzle( src,
                        GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3,
                        GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3,
@@ -330,14 +339,6 @@ translate_src( struct st_translate *t,
       }
    }
 
-   if (SrcReg->HasIndex2D) {
-      if (SrcReg->RelAddr2D)
-         src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]),
-                                            SrcReg->Index2D);
-      else
-         src = ureg_src_dimension( src, SrcReg->Index2D);
-   }
-
    return src;
 }
 
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 1d74896..6f3ecdb 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -492,6 +492,9 @@ st_translate_geometry_program(struct st_context *st,
    /* which vertex output goes to the first geometry input */
    vslot = 0;
 
+   memset(inputMapping, 0, sizeof(inputMapping));
+   memset(outputMapping, 0, sizeof(outputMapping));
+
    /*
     * Convert Mesa program inputs to TGSI input register semantics.
     */




More information about the mesa-commit mailing list