draw/tgsi: fix geometry shader input/output swizzling
authorZack Rusin <zackr@vmware.com>
Thu, 24 Dec 2009 13:15:29 +0000 (08:15 -0500)
committerZack Rusin <zackr@vmware.com>
Fri, 25 Dec 2009 10:52:19 +0000 (05:52 -0500)
src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/tgsi/tgsi_exec.c

index 11542286ddb80f0a1b7ccddebc33e693ba8d68a3..0a742cbeef311d9fa37da14cb2bb51776a8dfd26 100644 (file)
@@ -210,6 +210,7 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
                const float (*input)[4];
                input = (const float (*)[4])(
                   (const char *)prim_ptr + (k * input_vertex_stride));
+               vidx = k * TGSI_EXEC_MAX_INPUT_ATTRIBS + slot;
                debug_printf("\t%d)(%d) Input vert:\n", vidx, k);
 #if 1
                assert(!util_is_inf_or_nan(input[vs_slot][0]));
index e2f28783cc296098c1366687516f0eb4ee36d58d..ba89f2fbc3cfeda7419b0c53a57e600403f1dd30 100644 (file)
@@ -292,6 +292,14 @@ tgsi_exec_machine_bind_shader(
                                    * sizeof(struct tgsi_full_declaration));
             maxDeclarations += 10;
          }
+         if (parse.FullToken.FullDeclaration.Declaration.File == TGSI_FILE_OUTPUT) {
+            unsigned reg;
+            for (reg = parse.FullToken.FullDeclaration.Range.First;
+                 reg <= parse.FullToken.FullDeclaration.Range.Last;
+                 ++reg) {
+               ++mach->NumOutputs;
+            }
+         }
          memcpy(declarations + numDeclarations,
                 &parse.FullToken.FullDeclaration,
                 sizeof(declarations[0]));
@@ -1471,7 +1479,7 @@ store_dest(
       dst = &mach->Outputs[offset + index].xyzw[chan_index];
 #if 0
       if (TGSI_PROCESSOR_GEOMETRY == mach->Processor) {
-         fprintf(stderr, "STORING OUT[%d] mask(%d), = (", index, execmask);
+         fprintf(stderr, "STORING OUT[%d] mask(%d), = (", offset + index, execmask);
          for (i = 0; i < QUAD_SIZE; i++)
             if (execmask & (1 << i))
                fprintf(stderr, "%f, ", chan->f[i]);