Merge remote branch 'origin/7.8'
[mesa.git] / src / mesa / drivers / dri / r300 / compiler / radeon_code.h
index 7d8bf483e790d4cbf7810f060864772deff215e3..6d979bbaecf7b17060dc66e426e31b9dcf0dde37 100644 (file)
@@ -23,6 +23,7 @@
 #ifndef RADEON_CODE_H
 #define RADEON_CODE_H
 
+#include <stdint.h>
 
 #define R300_PFS_MAX_ALU_INST     64
 #define R300_PFS_MAX_TEX_INST     32
 
 
 #define STATE_R300_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
-#define STATE_R300_TEXRECT_FACTOR (STATE_INTERNAL_DRIVER+1)
 
+enum {
+       /**
+        * External constants are constants whose meaning is unknown to this
+        * compiler. For example, a Mesa gl_program's constants are turned
+        * into external constants.
+        */
+       RC_CONSTANT_EXTERNAL = 0,
+
+       RC_CONSTANT_IMMEDIATE,
+
+       /**
+        * Constant referring to state that is known by this compiler,
+        * see RC_STATE_xxx, i.e. *not* arbitrary Mesa (or other) state.
+        */
+       RC_CONSTANT_STATE
+};
+
+enum {
+       RC_STATE_SHADOW_AMBIENT = 0,
+
+       RC_STATE_R300_WINDOW_DIMENSION,
+       RC_STATE_R300_TEXRECT_FACTOR,
+       RC_STATE_R300_VIEWPORT_SCALE,
+       RC_STATE_R300_VIEWPORT_OFFSET
+};
+
+struct rc_constant {
+       unsigned Type:2; /**< RC_CONSTANT_xxx */
+       unsigned Size:3;
+
+       union {
+               unsigned External;
+               float Immediate[4];
+               unsigned State[2];
+       } u;
+};
+
+struct rc_constant_list {
+       struct rc_constant * Constants;
+       unsigned Count;
+
+       unsigned _Reserved;
+};
+
+void rc_constants_init(struct rc_constant_list * c);
+void rc_constants_copy(struct rc_constant_list * dst, struct rc_constant_list * src);
+void rc_constants_destroy(struct rc_constant_list * c);
+unsigned rc_constants_add(struct rc_constant_list * c, struct rc_constant * constant);
+unsigned rc_constants_add_state(struct rc_constant_list * c, unsigned state1, unsigned state2);
+unsigned rc_constants_add_immediate_vec4(struct rc_constant_list * c, const float * data);
+unsigned rc_constants_add_immediate_scalar(struct rc_constant_list * c, float data, unsigned * swizzle);
+
+/**
+ * Compare functions.
+ *
+ * \note By design, RC_COMPARE_FUNC_xxx + GL_NEVER gives you
+ * the correct GL compare function.
+ */
+typedef enum {
+       RC_COMPARE_FUNC_NEVER = 0,
+       RC_COMPARE_FUNC_LESS,
+       RC_COMPARE_FUNC_EQUAL,
+       RC_COMPARE_FUNC_LEQUAL,
+       RC_COMPARE_FUNC_GREATER,
+       RC_COMPARE_FUNC_NOTEQUAL,
+       RC_COMPARE_FUNC_GEQUAL,
+       RC_COMPARE_FUNC_ALWAYS
+} rc_compare_func;
 
 /**
  * Stores state that influences the compilation of a fragment program.
@@ -52,16 +120,18 @@ struct r300_fragment_program_external_state {
                 *  2 - GL_ALPHA
                 * depending on the depth texture mode.
                 */
-               GLuint depth_texture_mode : 2;
+               unsigned depth_texture_mode : 2;
 
                /**
                 * If the sampler is used as a shadow sampler,
-                * this field is (texture_compare_func - GL_NEVER).
-                * [e.g. if compare function is GL_LEQUAL, this field is 3]
+                * this field specifies the compare function.
+                *
+                * Otherwise, this field is \ref RC_COMPARE_FUNC_NEVER (aka 0).
                 *
                 * Otherwise, this field is 0.
+                * \sa rc_compare_func
                 */
-               GLuint texture_compare_func : 3;
+               unsigned texture_compare_func : 3;
        } unit[16];
 };
 
@@ -81,55 +151,41 @@ struct r300_fragment_program_node {
 struct r300_fragment_program_code {
        struct {
                int length; /**< total # of texture instructions used */
-               GLuint inst[R300_PFS_MAX_TEX_INST];
+               uint32_t inst[R300_PFS_MAX_TEX_INST];
        } tex;
 
        struct {
                int length; /**< total # of ALU instructions used */
                struct {
-                       GLuint inst0;
-                       GLuint inst1;
-                       GLuint inst2;
-                       GLuint inst3;
+                       uint32_t rgb_inst;
+                       uint32_t rgb_addr;
+                       uint32_t alpha_inst;
+                       uint32_t alpha_addr;
                } inst[R300_PFS_MAX_ALU_INST];
        } alu;
 
-       struct r300_fragment_program_node node[4];
-       int cur_node;
-       int first_node_has_tex;
-
-       /**
-        * Remember which program register a given hardware constant
-        * belongs to.
-        */
-       struct prog_src_register constant[R300_PFS_NUM_CONST_REGS];
-       int const_nr;
-
-       int max_temp_idx;
+       uint32_t config; /* US_CONFIG */
+       uint32_t pixsize; /* US_PIXSIZE */
+       uint32_t code_offset; /* US_CODE_OFFSET */
+       uint32_t code_addr[4]; /* US_CODE_ADDR */
 };
 
 
 struct r500_fragment_program_code {
        struct {
-               GLuint inst0;
-               GLuint inst1;
-               GLuint inst2;
-               GLuint inst3;
-               GLuint inst4;
-               GLuint inst5;
+               uint32_t inst0;
+               uint32_t inst1;
+               uint32_t inst2;
+               uint32_t inst3;
+               uint32_t inst4;
+               uint32_t inst5;
        } inst[R500_PFS_MAX_INST];
 
-       int inst_offset;
-       int inst_end;
-
-       /**
-        * Remember which program register a given hardware constant
-        * belongs to.
-        */
-       struct prog_src_register constant[R500_PFS_NUM_CONST_REGS];
-       int const_nr;
+       int inst_end; /* Number of instructions - 1; also, last instruction to be executed */
 
        int max_temp_idx;
+
+       uint32_t us_fc_ctrl;
 };
 
 struct rX00_fragment_program_code {
@@ -138,13 +194,37 @@ struct rX00_fragment_program_code {
                struct r500_fragment_program_code r500;
        } code;
 
-       GLboolean writes_depth;
+       unsigned writes_depth:1;
 
-       /* attribute that we are sending the WPOS in */
-       gl_frag_attrib wpos_attr;
-       /* attribute that we are sending the fog coordinate in */
-       gl_frag_attrib fog_attr;
+       struct rc_constant_list constants;
 };
 
 
-#endif /* RADEON_CODE_H */
\ No newline at end of file
+#define VSF_MAX_FRAGMENT_LENGTH (255*4)
+#define VSF_MAX_FRAGMENT_TEMPS (14)
+
+#define VSF_MAX_INPUTS 32
+#define VSF_MAX_OUTPUTS 32
+
+struct r300_vertex_program_code {
+       int length;
+       union {
+               uint32_t d[VSF_MAX_FRAGMENT_LENGTH];
+               float f[VSF_MAX_FRAGMENT_LENGTH];
+       } body;
+
+       int pos_end;
+       int num_temporaries;    /* Number of temp vars used by program */
+       int inputs[VSF_MAX_INPUTS];
+       int outputs[VSF_MAX_OUTPUTS];
+
+       struct rc_constant_list constants;
+
+       uint32_t InputsRead;
+       uint32_t OutputsWritten;
+};
+
+void r300_vertex_program_dump(struct r300_vertex_program_code * vs);
+
+#endif /* RADEON_CODE_H */
+