tgsi: Support system values in ureg.
authorMichal Krol <michal@vmware.com>
Wed, 30 Dec 2009 20:52:01 +0000 (21:52 +0100)
committerMichal Krol <michal@vmware.com>
Wed, 30 Dec 2009 20:52:01 +0000 (21:52 +0100)
src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/auxiliary/tgsi/tgsi_ureg.h

index 1e730e534276be4d20d50a48063a3ef0a9f0f029..2713372b05979edb71c8ddf9fe6656b5bb665896 100644 (file)
@@ -64,6 +64,7 @@ struct ureg_tokens {
 };
 
 #define UREG_MAX_INPUT PIPE_MAX_ATTRIBS
+#define UREG_MAX_SYSTEM_VALUE PIPE_MAX_ATTRIBS
 #define UREG_MAX_OUTPUT PIPE_MAX_ATTRIBS
 #define UREG_MAX_CONSTANT_RANGE 32
 #define UREG_MAX_IMMEDIATE 32
@@ -94,6 +95,13 @@ struct ureg_program
    } gs_input[UREG_MAX_INPUT];
    unsigned nr_gs_inputs;
 
+   struct {
+      unsigned index;
+      unsigned semantic_name;
+      unsigned semantic_index;
+   } system_value[UREG_MAX_SYSTEM_VALUE];
+   unsigned nr_system_values;
+
    struct {
       unsigned semantic_name;
       unsigned semantic_index;
@@ -299,6 +307,25 @@ ureg_DECL_gs_input(struct ureg_program *ureg,
 }
 
 
+struct ureg_src
+ureg_DECL_system_value(struct ureg_program *ureg,
+                       unsigned index,
+                       unsigned semantic_name,
+                       unsigned semantic_index)
+{
+   if (ureg->nr_system_values < UREG_MAX_SYSTEM_VALUE) {
+      ureg->system_value[ureg->nr_system_values].index = index;
+      ureg->system_value[ureg->nr_system_values].semantic_name = semantic_name;
+      ureg->system_value[ureg->nr_system_values].semantic_index = semantic_index;
+      ureg->nr_system_values++;
+   } else {
+      set_bad(ureg);
+   }
+
+   return ureg_src_register(TGSI_FILE_SYSTEM_VALUE, index);
+}
+
+
 struct ureg_dst 
 ureg_DECL_output( struct ureg_program *ureg,
                   unsigned name,
@@ -1003,6 +1030,15 @@ static void emit_decls( struct ureg_program *ureg )
       }
    }
 
+   for (i = 0; i < ureg->nr_system_values; i++) {
+      emit_decl(ureg,
+                TGSI_FILE_SYSTEM_VALUE,
+                ureg->system_value[i].index,
+                ureg->system_value[i].semantic_name,
+                ureg->system_value[i].semantic_index,
+                TGSI_INTERPOLATE_CONSTANT);
+   }
+
    for (i = 0; i < ureg->nr_outputs; i++) {
       emit_decl( ureg, 
                  TGSI_FILE_OUTPUT, 
index 7e3e7bcf1d36aea5f04e90987c44b42214d67489..179862d4e27220e7b75fee60fcb5b5ec8d89019c 100644 (file)
@@ -137,6 +137,12 @@ struct ureg_src
 ureg_DECL_gs_input(struct ureg_program *,
                    unsigned index);
 
+struct ureg_src
+ureg_DECL_system_value(struct ureg_program *,
+                       unsigned index,
+                       unsigned semantic_name,
+                       unsigned semantic_index);
+
 struct ureg_dst
 ureg_DECL_output( struct ureg_program *,
                   unsigned semantic_name,