util: remove LIST_DEL macro
[mesa.git] / src / gallium / drivers / svga / svga_tgsi_emit.h
index 949c39dd3ee35aff86a0444a8e3254069366cccd..357d772e7a6c7a4402229ecbb0e169bfc803617b 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "tgsi/tgsi_scan.h"
 #include "svga_hw_reg.h"
+#include "svga_shader.h"
 #include "svga_tgsi.h"
 #include "svga3d_shaderdefs.h"
 
@@ -38,16 +39,18 @@ struct src_register
 };
 
 
-struct svga_arl_consts {
+struct svga_arl_consts
+{
    int number;
    int idx;
    int swizzle;
    int arl_num;
 };
 
-/* Internal functions:
- */
 
+/**
+ * This is the context/state used during TGSI->SVGA shader translation.
+ */
 struct svga_shader_emitter
 {
    unsigned size;
@@ -63,7 +66,7 @@ struct svga_shader_emitter
    int nr_hw_float_const;
    int nr_hw_int_const;
    int nr_hw_temp;
-   
+
    int insn_offset;
 
    int internal_temp_count;
@@ -81,10 +84,13 @@ struct svga_shader_emitter
 
    int dynamic_branching_level;
 
+   unsigned num_output_writes;
+   boolean constant_color_output;
+
    boolean in_main_func;
 
-   boolean created_zero_immediate;
-   int zero_immediate_idx;
+   boolean created_common_immediate;
+   int common_immediate_idx[2];
 
    boolean created_loop_const;
    int loop_const_idx;
@@ -97,6 +103,7 @@ struct svga_shader_emitter
    unsigned label[32];
    unsigned nr_labels;
 
+   /** input/output register mappings, indexed by register number */
    struct src_register input_map[PIPE_MAX_ATTRIBS];
    SVGA3dShaderDestToken output_map[PIPE_MAX_ATTRIBS];
 
@@ -117,8 +124,9 @@ struct svga_shader_emitter
    /* shared output for depth and fog */
    SVGA3dShaderDestToken vs_depth_fog;
 
-   SVGA3dShaderDestToken temp_col[PIPE_MAX_COLOR_BUFS];
-   SVGA3dShaderDestToken true_col[PIPE_MAX_COLOR_BUFS];
+   /* PS output colors (indexed by color semantic index) */
+   SVGA3dShaderDestToken temp_color_output[PIPE_MAX_COLOR_BUFS];
+   SVGA3dShaderDestToken true_color_output[PIPE_MAX_COLOR_BUFS];
 
    SVGA3dShaderDestToken temp_psiz;
    SVGA3dShaderDestToken true_psiz;
@@ -126,31 +134,35 @@ struct svga_shader_emitter
    struct svga_arl_consts arl_consts[12];
    int num_arl_consts;
    int current_arl;
-};
 
+   unsigned pstipple_sampler_unit;
 
-boolean svga_shader_emit_dword( struct svga_shader_emitter *emit,
-                                unsigned dword );
+   int num_samplers;
+   uint8_t sampler_target[PIPE_MAX_SAMPLERS];
+};
 
-boolean svga_shader_emit_dwords( struct svga_shader_emitter *emit,
-                                 const unsigned *dwords,
-                                 unsigned nr );
 
-boolean svga_shader_emit_opcode( struct svga_shader_emitter *emit,
-                                 unsigned opcode );
+boolean
+svga_shader_emit_dword(struct svga_shader_emitter *emit, unsigned dword);
 
-boolean svga_shader_emit_instructions( struct svga_shader_emitter *emit,
-                                       const struct tgsi_token *tokens );
+boolean
+svga_shader_emit_dwords(struct svga_shader_emitter *emit,
+                        const unsigned *dwords, unsigned nr);
 
-boolean svga_translate_decl_sm30( struct svga_shader_emitter *emit,
-                               const struct tgsi_full_declaration *decl );
+boolean
+svga_shader_emit_opcode(struct svga_shader_emitter *emit,
+                        unsigned opcode);
 
+boolean
+svga_shader_emit_instructions(struct svga_shader_emitter *emit,
+                              const struct tgsi_token *tokens);
 
-static INLINE boolean emit_instruction( struct svga_shader_emitter *emit,
-                                 SVGA3dShaderInstToken opcode )
-{
-   return svga_shader_emit_opcode( emit, opcode.value );
-}
+boolean
+svga_shader_emit_samplers_decl(struct svga_shader_emitter *emit);
+
+boolean
+svga_translate_decl_sm30(struct svga_shader_emitter *emit,
+                         const struct tgsi_full_declaration *decl);
 
 
 #define TRANSLATE_SWIZZLE(x,y,z,w)  ((x) | ((y) << 2) | ((z) << 4) | ((w) << 6))
@@ -166,14 +178,57 @@ static INLINE boolean emit_instruction( struct svga_shader_emitter *emit,
  TRANSLATE_SWIZZLE(TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W)
 
 
+/** Emit the given SVGA3dShaderInstToken opcode */
+static inline boolean
+emit_instruction(struct svga_shader_emitter *emit,
+                 SVGA3dShaderInstToken opcode)
+{
+   return svga_shader_emit_opcode(emit, opcode.value);
+}
+
+
+/** Generate a SVGA3dShaderInstToken for the given SVGA3D shader opcode */
+static inline SVGA3dShaderInstToken
+inst_token(SVGA3dShaderOpCodeType opcode)
+{
+   SVGA3dShaderInstToken inst;
+
+   inst.value = 0;
+   inst.op = opcode;
+
+   return inst;
+}
+
 
-static INLINE SVGA3dShaderInstToken
-inst_token( unsigned opcode )
+/**
+ * Generate a SVGA3dShaderInstToken for the given SVGA3D shader opcode
+ * with the predication flag set.
+ */
+static inline SVGA3dShaderInstToken
+inst_token_predicated(SVGA3dShaderOpCodeType opcode)
 {
    SVGA3dShaderInstToken inst;
 
    inst.value = 0;
    inst.op = opcode;
+   inst.predicated = 1;
+
+   return inst;
+}
+
+
+/**
+ * Generate a SVGA3dShaderInstToken for a SETP instruction (set predicate)
+ * using the given comparison operator (one of SVGA3DOPCOMP_xx).
+ */
+static inline SVGA3dShaderInstToken
+inst_token_setp(SVGA3dShaderOpCodeCompFnType operator)
+{
+   SVGA3dShaderInstToken inst;
+
+   inst.value = 0;
+   inst.op = SVGA3DOP_SETP;
+   inst.control = operator;
 
    return inst;
 }
@@ -184,9 +239,8 @@ inst_token( unsigned opcode )
  * Note that this function is used to create tokens for output registers,
  * temp registers AND constants (see emit_def_const()).
  */
-static INLINE SVGA3dShaderDestToken 
-dst_register( unsigned file,
-              int number )
+static inline SVGA3dShaderDestToken
+dst_register(SVGA3dShaderRegType file, int number)
 {
    SVGA3dShaderDestToken dest;
 
@@ -204,13 +258,17 @@ dst_register( unsigned file,
    dest.shfScale = 0;
    dest.type_lower = file & 0x7;
    dest.reserved0 = 1;          /* is_reg */
-   
+
    return dest;
 }
 
-static INLINE SVGA3dShaderDestToken
-writemask( SVGA3dShaderDestToken dest,
-           unsigned mask )
+
+/**
+ * Apply a writemask to the given SVGA3dShaderDestToken, returning a
+ * new SVGA3dShaderDestToken.
+ */
+static inline SVGA3dShaderDestToken
+writemask(SVGA3dShaderDestToken dest, unsigned mask)
 {
    assert(dest.mask & mask);
    dest.mask &= mask;
@@ -218,8 +276,9 @@ writemask( SVGA3dShaderDestToken dest,
 }
 
 
-static INLINE SVGA3dShaderSrcToken 
-src_token( unsigned file, int number )
+/** Create a SVGA3dShaderSrcToken given a register file and number */
+static inline SVGA3dShaderSrcToken
+src_token(SVGA3dShaderRegType file, int number)
 {
    SVGA3dShaderSrcToken src;
 
@@ -241,28 +300,31 @@ src_token( unsigned file, int number )
 }
 
 
-static INLINE struct src_register 
-src_register( unsigned file, int number )
+/** Create a src_register given a register file and register number */
+static inline struct src_register
+src_register(SVGA3dShaderRegType file, int number)
 {
    struct src_register src;
-   
-   src.base = src_token( file, number );
+
+   src.base = src_token(file, number);
    src.indirect.value = 0;
 
    return src;
 }
 
-static INLINE SVGA3dShaderDestToken dst( struct src_register src )
+/** Translate src_register into SVGA3dShaderDestToken */
+static inline SVGA3dShaderDestToken
+dst(struct src_register src)
 {
-   return dst_register( SVGA3dShaderGetRegType( src.base.value ),
-                        src.base.num );
+   return dst_register(SVGA3dShaderGetRegType(src.base.value), src.base.num);
 }
 
-static INLINE struct src_register src( SVGA3dShaderDestToken dst )
+
+/** Translate SVGA3dShaderDestToken to a src_register */
+static inline struct src_register
+src(SVGA3dShaderDestToken dst)
 {
-   return src_register( SVGA3dShaderGetRegType( dst.value ),
-                        dst.num );
+   return src_register(SVGA3dShaderGetRegType(dst.value), dst.num);
 }
 
-
 #endif