Hi Cooper,

I'm not sure exactly what problem you're seeing, can you be more specific?

Basically this change restores the behaviour that existed before switching to 
tgsi_ureg.c for building Mesa's shaders -- vertex shader inputs didn't have 
semantic tags before, and they don't now, but there were a few weeks in the 
middle where we were emitting them.

The purpose of semantics is as a tag to match vertex shader outputs to fragment 
shader inputs, and for various special handling in between VS and FS (eg 
clipping).   We don't have them for vertex shader inputs because there is  (a) 
nothing to match them against, and (b) no special handling prior to the vertex 
shader.

We match vertex_element's to vertex shader inputs by number, ie vs INPUT[0] 
matches vertex_element 0, INPUT[1] <--> ve[1], etc.

What problem are you seeing exactly?  What shaders work before and after?  Does 
any driver other than r300g have the same problem, eg softpipe or llvmpipe?

Keith
________________________________________
From: [email protected] 
[[email protected]] On Behalf Of Cooper Yuan 
[[email protected]]
Sent: Sunday, September 27, 2009 7:15 AM
To: Keith Whitwell
Cc: [email protected]
Subject: Re: Mesa (master): tgsi/ureg: VS inputs don't have any semantic tags,  
just an index

Hi Keith,
Will this patch only affect VS input declaration? it breaks r300 gallium 
texture function, but both VS and PS seem OK.

Cooper
On Sun, Sep 13, 2009 at 5:46 AM, Keith Whitwell 
<[email protected]<mailto:[email protected]>> wrote:
Module: Mesa
Branch: master
Commit: 6d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2b

Author: Keith Whitwell <[email protected]<mailto:[email protected]>>
Date:   Sat Sep 12 14:12:35 2009 -0700

tgsi/ureg: VS inputs don't have any semantic tags, just an index

Fix ureg_DECL_vs_input to reflect this and fix up all callers.

---

 src/gallium/auxiliary/tgsi/tgsi_ureg.c          |   72 +++++++++++-----------
 src/gallium/auxiliary/tgsi/tgsi_ureg.h          |    3 +-
 src/gallium/auxiliary/util/u_simple_shaders.c   |    4 +-
 src/gallium/state_trackers/xorg/xorg_exa_tgsi.c |   15 ++---
 4 files changed, 44 insertions(+), 50 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index e24a0ad..55a4e5b 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -87,8 +87,10 @@ struct ureg_program
      unsigned semantic_name;
      unsigned semantic_index;
      unsigned interp;
-   } input[UREG_MAX_INPUT];
-   unsigned nr_inputs;
+   } fs_input[UREG_MAX_INPUT];
+   unsigned nr_fs_inputs;
+
+   unsigned vs_inputs[UREG_MAX_INPUT/32];

   struct {
      unsigned semantic_name;
@@ -232,25 +234,25 @@ ureg_src_register( unsigned file,



-static struct ureg_src
-ureg_DECL_input( struct ureg_program *ureg,
-                 unsigned name,
-                 unsigned index,
-                 unsigned interp_mode )
+struct ureg_src
+ureg_DECL_fs_input( struct ureg_program *ureg,
+                    unsigned name,
+                    unsigned index,
+                    unsigned interp_mode )
 {
   unsigned i;

-   for (i = 0; i < ureg->nr_inputs; i++) {
-      if (ureg->input[i].semantic_name == name &&
-          ureg->input[i].semantic_index == index)
+   for (i = 0; i < ureg->nr_fs_inputs; i++) {
+      if (ureg->fs_input[i].semantic_name == name &&
+          ureg->fs_input[i].semantic_index == index)
         goto out;
   }

-   if (ureg->nr_inputs < UREG_MAX_INPUT) {
-      ureg->input[i].semantic_name = name;
-      ureg->input[i].semantic_index = index;
-      ureg->input[i].interp = interp_mode;
-      ureg->nr_inputs++;
+   if (ureg->nr_fs_inputs < UREG_MAX_INPUT) {
+      ureg->fs_input[i].semantic_name = name;
+      ureg->fs_input[i].semantic_index = index;
+      ureg->fs_input[i].interp = interp_mode;
+      ureg->nr_fs_inputs++;
   }
   else {
      set_bad( ureg );
@@ -261,25 +263,14 @@ out:
 }


-
-struct ureg_src
-ureg_DECL_fs_input( struct ureg_program *ureg,
-                    unsigned name,
-                    unsigned index,
-                    unsigned interp )
-{
-   assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
-   return ureg_DECL_input( ureg, name, index, interp );
-}
-
-
 struct ureg_src
 ureg_DECL_vs_input( struct ureg_program *ureg,
-                    unsigned name,
                    unsigned index )
 {
   assert(ureg->processor == TGSI_PROCESSOR_VERTEX);
-   return ureg_DECL_input( ureg, name, index, TGSI_INTERPOLATE_CONSTANT );
+
+   ureg->vs_inputs[index/32] |= 1 << (index % 32);
+   return ureg_src_register( TGSI_FILE_INPUT, index );
 }


@@ -781,13 +772,22 @@ static void emit_decls( struct ureg_program *ureg )
 {
   unsigned i;

-   for (i = 0; i < ureg->nr_inputs; i++) {
-      emit_decl( ureg,
-                 TGSI_FILE_INPUT,
-                 i,
-                 ureg->input[i].semantic_name,
-                 ureg->input[i].semantic_index,
-                 ureg->input[i].interp );
+   if (ureg->processor == TGSI_PROCESSOR_VERTEX) {
+      for (i = 0; i < UREG_MAX_INPUT; i++) {
+         if (ureg->vs_inputs[i/32] & (1 << (i%32))) {
+            emit_decl_range( ureg, TGSI_FILE_INPUT, i, 1 );
+         }
+      }
+   }
+   else {
+      for (i = 0; i < ureg->nr_fs_inputs; i++) {
+         emit_decl( ureg,
+                    TGSI_FILE_INPUT,
+                    i,
+                    ureg->fs_input[i].semantic_name,
+                    ureg->fs_input[i].semantic_index,
+                    ureg->fs_input[i].interp );
+      }
   }

   for (i = 0; i < ureg->nr_outputs; i++) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index acbca59..3bc1b77 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -116,8 +116,7 @@ ureg_DECL_fs_input( struct ureg_program *,

 struct ureg_src
 ureg_DECL_vs_input( struct ureg_program *,
-                    unsigned semantic_name,
-                    unsigned semantic_index );
+                    unsigned index );

 struct ureg_dst
 ureg_DECL_output( struct ureg_program *,
diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c 
b/src/gallium/auxiliary/util/u_simple_shaders.c
index e5fc9b0..0d706f9 100644
--- a/src/gallium/auxiliary/util/u_simple_shaders.c
+++ b/src/gallium/auxiliary/util/u_simple_shaders.c
@@ -61,9 +61,7 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
      struct ureg_src src;
      struct ureg_dst dst;

-      src = ureg_DECL_vs_input( ureg,
-                                semantic_names[i],
-                                semantic_indexes[i]);
+      src = ureg_DECL_vs_input( ureg, i );

      dst = ureg_DECL_output( ureg,
                              semantic_names[i],
diff --git a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c 
b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c
index 694eded..978dc20 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c
@@ -241,6 +241,7 @@ create_vs(struct pipe_context *pipe,
   boolean is_fill = vs_traits & VS_FILL;
   boolean is_composite = vs_traits & VS_COMPOSITE;
   boolean has_mask = vs_traits & VS_MASK;
+   unsigned input_slot = 0;

   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
   if (ureg == NULL)
@@ -252,30 +253,26 @@ create_vs(struct pipe_context *pipe,
   /* it has to be either a fill or a composite op */
   debug_assert(is_fill ^ is_composite);

-   src = ureg_DECL_vs_input(ureg,
-                            TGSI_SEMANTIC_POSITION, 0);
+   src = ureg_DECL_vs_input(ureg, input_slot++);
   dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
   src = vs_normalize_coords(ureg, src,
                             const0, const1);
   ureg_MOV(ureg, dst, src);

-
   if (is_composite) {
-      src = ureg_DECL_vs_input(ureg,
-                               TGSI_SEMANTIC_GENERIC, 1);
+      src = ureg_DECL_vs_input(ureg, input_slot++);
      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 1);
      ureg_MOV(ureg, dst, src);
   }
+
   if (is_fill) {
-      src = ureg_DECL_vs_input(ureg,
-                               TGSI_SEMANTIC_COLOR, 0);
+      src = ureg_DECL_vs_input(ureg, input_slot++);
      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
      ureg_MOV(ureg, dst, src);
   }

   if (has_mask) {
-      src = ureg_DECL_vs_input(ureg,
-                               TGSI_SEMANTIC_GENERIC, 2);
+      src = ureg_DECL_vs_input(ureg, input_slot++);
      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 2);
      ureg_MOV(ureg, dst, src);
   }

_______________________________________________
mesa-commit mailing list
[email protected]<mailto:[email protected]>
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to