gallium: the other drivers don't support ARB_buffer_storage
[mesa.git] / src / gallium / drivers / svga / svga_tgsi.h
index 896c90a89aeec7a0d1d661c52992c938ae4c95aa..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,54 +46,71 @@ struct tgsi_token;
 
 struct svga_vs_compile_key
 {
-   ubyte need_prescale:1;
-   ubyte allow_psiz:1;
-   unsigned zero_stride_vertex_elements;
-   ubyte num_zero_stride_vertex_elements:6;
+   unsigned fs_generic_inputs;
+   unsigned need_prescale:1;
+   unsigned allow_psiz:1;
 };
 
 struct svga_fs_compile_key
 {
-   boolean light_twoside:1;
-   boolean front_cw:1;
-   ubyte num_textures;
-   ubyte num_unnormalized_coords;
+   unsigned light_twoside: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 {
-      ubyte compare_mode       : 1;
-      ubyte compare_func       : 3;
-      ubyte unnormalized       : 1;
-
-      ubyte width_height_idx   : 7;
-
-      ubyte texture_target;
+      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;
 };
 
 
@@ -121,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