Merge remote branch 'origin/opengl-es-v2'
[mesa.git] / src / gallium / auxiliary / translate / translate.h
index b8210af50cf96f788beda4099d04021151754c08..54ed2c1a4bebb67e404fb6a158f9beda9c369f0f 100644 (file)
 #include "pipe/p_format.h"
 #include "pipe/p_state.h"
 
+enum translate_element_type {
+   TRANSLATE_ELEMENT_NORMAL,
+   TRANSLATE_ELEMENT_INSTANCE_ID
+};
+
 struct translate_element 
 {
+   enum translate_element_type type;
    enum pipe_format input_format;
    enum pipe_format output_format;
-   unsigned input_buffer;
-   unsigned input_offset;       /* can't really reduce the size of these */
+   unsigned input_buffer:8;
+   unsigned input_offset:24;
+   unsigned instance_divisor;
    unsigned output_offset;
 };
 
@@ -57,7 +64,7 @@ struct translate_element
 struct translate_key {
    unsigned output_stride;
    unsigned nr_elements;
-   struct translate_element element[PIPE_MAX_ATTRIBS];
+   struct translate_element element[PIPE_MAX_ATTRIBS + 1];
 };
 
 
@@ -71,15 +78,17 @@ struct translate {
                       const void *ptr,
                       unsigned stride );
 
-   void (*run_elts)( struct translate *,
-                    const unsigned *elts,
-                    unsigned count,
-                    void *output_buffer);
-
-   void (*run)( struct translate *,
-               unsigned start,
-               unsigned count,
-               void *output_buffer);
+   void (PIPE_CDECL *run_elts)( struct translate *,
+                                const unsigned *elts,
+                                unsigned count,
+                                unsigned instance_id,
+                                void *output_buffer);
+
+   void (PIPE_CDECL *run)( struct translate *,
+                           unsigned start,
+                           unsigned count,
+                           unsigned instance_id,
+                           void *output_buffer);
 };
 
 
@@ -103,8 +112,13 @@ static INLINE int translate_keysize( const struct translate_key *key )
 static INLINE int translate_key_compare( const struct translate_key *a,
                                          const struct translate_key *b )
 {
-   int keysize = translate_keysize(a);
-   return memcmp(a, b, keysize);
+   int keysize_a = translate_keysize(a);
+   int keysize_b = translate_keysize(b);
+
+   if (keysize_a != keysize_b) {
+      return keysize_a - keysize_b;
+   }
+   return memcmp(a, b, keysize_a);
 }