i965/vec4: Only zero out unused message components when there are any.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_vs.h
index 95e0501b1ebb3262bfb12936401aa56040b4b0cc..747ba6caa72542e86d4f24c1946a9ba5ab316038 100644 (file)
 
 #include "brw_context.h"
 #include "brw_eu.h"
-#include "shader/program.h"
-
+#include "brw_vec4.h"
+#include "program/program.h"
+
+/**
+ * The VF can't natively handle certain types of attributes, such as GL_FIXED
+ * or most 10_10_10_2 types.  These flags enable various VS workarounds to
+ * "fix" attributes at the beginning of shaders.
+ */
+#define BRW_ATTRIB_WA_COMPONENT_MASK    7  /* mask for GL_FIXED scale channel count */
+#define BRW_ATTRIB_WA_NORMALIZE     8   /* normalize in shader */
+#define BRW_ATTRIB_WA_BGRA          16  /* swap r/b channels in shader */
+#define BRW_ATTRIB_WA_SIGN          32  /* interpret as signed in shader */
+#define BRW_ATTRIB_WA_SCALE         64  /* interpret as scaled in shader */
 
 struct brw_vs_prog_key {
-   GLuint program_string_id;
-   GLuint nr_userclip:4;
+   struct brw_vec4_prog_key base;
+
+   /*
+    * Per-attribute workaround flags
+    */
+   uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
+
    GLuint copy_edgeflag:1;
-   GLuint pad:26;
+
+   /**
+    * For pre-Gen6 hardware, a bitfield indicating which texture coordinates
+    * are going to be replaced with point coordinates (as a consequence of a
+    * call to glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)).  Because
+    * our SF thread requires exact matching between VS outputs and FS inputs,
+    * these texture coordinates will need to be unconditionally included in
+    * the VUE, even if they aren't written by the vertex shader.
+    */
+   GLuint point_coord_replace:8;
 };
 
 
 struct brw_vs_compile {
-   struct brw_compile func;
+   struct brw_vec4_compile base;
    struct brw_vs_prog_key key;
-   struct brw_vs_prog_data prog_data;
-   int8_t constant_map[1024];
 
    struct brw_vertex_program *vp;
+};
 
-   GLuint nr_inputs;
-
-   GLuint first_output;
-   GLuint nr_outputs;
-   GLuint first_overflow_output; /**< VERT_ATTRIB_x */
-
-   GLuint first_tmp;
-   GLuint last_tmp;
-
-   struct brw_reg r0;
-   struct brw_reg r1;
-   struct brw_reg regs[PROGRAM_ADDRESS+1][128];
-   struct brw_reg tmp;
-   struct brw_reg stack;
-
-   struct {    
-       GLboolean used_in_src;
-       struct brw_reg reg;
-   } output_regs[128];
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-   struct brw_reg userplane[6];
+const unsigned *brw_vs_emit(struct brw_context *brw,
+                            struct gl_shader_program *prog,
+                            struct brw_vs_compile *c,
+                            struct brw_vs_prog_data *prog_data,
+                            void *mem_ctx,
+                            unsigned *program_size);
+bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
+void brw_vs_debug_recompile(struct brw_context *brw,
+                            struct gl_shader_program *prog,
+                            const struct brw_vs_prog_key *key);
+bool brw_vs_prog_data_compare(const void *a, const void *b,
+                              int aux_size, const void *key);
+void brw_vs_prog_data_free(const void *in_prog_data);
+
+#ifdef __cplusplus
+} /* extern "C" */
+
+
+namespace brw {
+
+class vec4_vs_visitor : public vec4_visitor
+{
+public:
+   vec4_vs_visitor(struct brw_context *brw,
+                   struct brw_vs_compile *vs_compile,
+                   struct brw_vs_prog_data *vs_prog_data,
+                   struct gl_shader_program *prog,
+                   struct brw_shader *shader,
+                   void *mem_ctx);
+
+protected:
+   virtual dst_reg *make_reg_for_system_value(ir_variable *ir);
+   virtual void setup_payload();
+   virtual void emit_prolog();
+   virtual void emit_program_code();
+   virtual void emit_thread_end();
+   virtual void emit_urb_write_header(int mrf);
+   virtual vec4_instruction *emit_urb_write_opcode(bool complete);
+
+private:
+   int setup_attributes(int payload_reg);
+   void setup_vp_regs();
+   dst_reg get_vp_dst_reg(const prog_dst_register &dst);
+   src_reg get_vp_src_reg(const prog_src_register &src);
+
+   struct brw_vs_compile * const vs_compile;
+   struct brw_vs_prog_data * const vs_prog_data;
+   src_reg *vp_temp_regs;
+   src_reg vp_addr_reg;
+};
 
-   /** we may need up to 3 constants per instruction (if use_const_buffer) */
-   struct {
-      GLint index;
-      struct brw_reg reg;
-   } current_const[3];
+} /* namespace brw */
 
-   GLboolean needs_stack;
-};
 
-void brw_vs_emit( struct brw_vs_compile *c );
+#endif
 
 #endif