svga: update shader code for GBS
[mesa.git] / src / gallium / drivers / svga / svga_tgsi.h
index 1309c339237d372746c55a6457eb4c4e0edc8aa1..4fe88b3b70d95d62983ca4ee8b109190102402e9 100644 (file)
 
 #include "svga_hw_reg.h"
 
+
+/**
+ * We use a 32-bit mask to keep track of the generic indexes.
+ */
+#define MAX_GENERIC_VARYING 32
+
+
 struct svga_fragment_shader;
 struct svga_vertex_shader;
 struct svga_shader;
@@ -39,52 +46,71 @@ struct tgsi_token;
 
 struct svga_vs_compile_key
 {
-   unsigned zero_stride_vertex_elements;
+   unsigned fs_generic_inputs;
    unsigned need_prescale:1;
    unsigned allow_psiz:1;
-   unsigned num_zero_stride_vertex_elements:6;
 };
 
 struct svga_fs_compile_key
 {
    unsigned light_twoside:1;
-   unsigned front_cw:1;
+   unsigned front_ccw:1;
+   unsigned white_fragments:1;
+   unsigned write_color0_to_n_cbufs:3;
    unsigned num_textures:8;
    unsigned num_unnormalized_coords:8;
+   unsigned sprite_origin_lower_left:1;
    struct {
       unsigned compare_mode:1;
       unsigned compare_func:3;
       unsigned unnormalized:1;
       unsigned width_height_idx:7;
       unsigned texture_target:8;
+      unsigned sprite_texgen:1;
+      unsigned swizzle_r:3;
+      unsigned swizzle_g:3;
+      unsigned swizzle_b:3;
+      unsigned swizzle_a:3;
    } tex[PIPE_MAX_SAMPLERS];
 };
 
-union svga_compile_key {
+/**
+ * Key/index for identifying shader variants.
+ */
+struct svga_compile_key {
    struct svga_vs_compile_key vkey;
    struct svga_fs_compile_key fkey;
+   int8_t generic_remap_table[MAX_GENERIC_VARYING];
 };
 
-struct svga_shader_result
+
+/**
+ * A single TGSI shader may be compiled into different variants of
+ * SVGA3D shaders depending on the compile key.  Each user shader
+ * will have a linked list of these variants.
+ */
+struct svga_shader_variant
 {
    const struct svga_shader *shader;
 
-   /* Parameters used to generate this compilation result:
-    */
-   union svga_compile_key key;
+   /** Parameters used to generate this variant */
+   struct svga_compile_key key;
 
    /* Compiled shader tokens:
     */
    const unsigned *tokens;
    unsigned nr_tokens;
 
-   /* SVGA Shader ID:
+   /** Per-context shader identifier used with SVGA_3D_CMD_SHADER_DEFINE,
+    * SVGA_3D_CMD_SET_SHADER and SVGA_3D_CMD_SHADER_DESTROY.
     */
    unsigned id;
    
-   /* Next compilation result:
-    */
-   struct svga_shader_result *next;
+   /* GB object buffer containing the bytecode */
+   struct svga_winsys_gb_shader *gb_shader;
+
+   /** Next variant */
+   struct svga_shader_variant *next;
 };
 
 
@@ -119,19 +145,30 @@ static INLINE unsigned svga_vs_key_size( const struct svga_vs_compile_key *key )
 
 static INLINE unsigned svga_fs_key_size( const struct svga_fs_compile_key *key )
 {
-   return (const char *)&key->tex[key->num_textures].texture_target -
-      (const char *)key;
+   return (const char *)&key->tex[key->num_textures] - (const char *)key;
 }
 
-struct svga_shader_result *
+struct svga_shader_variant *
 svga_translate_fragment_program( const struct svga_fragment_shader *fs,
                                  const struct svga_fs_compile_key *fkey );
 
-struct svga_shader_result *
+struct svga_shader_variant *
 svga_translate_vertex_program( const struct svga_vertex_shader *fs,
                                const struct svga_vs_compile_key *vkey );
 
 
-void svga_destroy_shader_result( struct svga_shader_result *result );
+unsigned
+svga_get_generic_inputs_mask(const struct tgsi_shader_info *info);
+
+unsigned
+svga_get_generic_outputs_mask(const struct tgsi_shader_info *info);
+
+void
+svga_remap_generics(unsigned generics_mask,
+                    int8_t remap_table[MAX_GENERIC_VARYING]);
+
+int
+svga_remap_generic_index(int8_t remap_table[MAX_GENERIC_VARYING],
+                         int generic_index);
 
 #endif