X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_vec4.h;h=649dc6112b7df8cc069e044a19d3b9a9cac5baf2;hb=639696aa05df0b7f4bfb9e2e255863cd72effba3;hp=a8e972aed5108a7a54edee74f343ceeb9146ede7;hpb=cb0ba848d4176c1ed2c4542fd5875867f460fc3b;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index a8e972aed51..649dc6112b7 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -31,6 +31,8 @@ #include "brw_program.h" #ifdef __cplusplus +#include "brw_ir_vec4.h" + extern "C" { #endif @@ -49,194 +51,21 @@ struct brw_vec4_compile { GLuint last_scratch; /**< measured in 32-byte (register size) units */ }; - -struct brw_vec4_prog_key { - GLuint program_string_id; - - /** - * True if at least one clip flag is enabled, regardless of whether the - * shader uses clip planes or gl_ClipDistance. - */ - GLuint userclip_active:1; - - /** - * How many user clipping planes are being uploaded to the vertex shader as - * push constants. - */ - GLuint nr_userclip_plane_consts:4; - - GLuint clamp_vertex_color:1; - - struct brw_sampler_prog_key_data tex; -}; - - #ifdef __cplusplus extern "C" { #endif void -brw_vec4_setup_prog_key_for_precompile(struct gl_context *ctx, - struct brw_vec4_prog_key *key, - GLuint id, struct gl_program *prog); +brw_vue_setup_prog_key_for_precompile(struct gl_context *ctx, + struct brw_vue_prog_key *key, + GLuint id, struct gl_program *prog); #ifdef __cplusplus } /* extern "C" */ namespace brw { -class dst_reg; - -unsigned -swizzle_for_size(int size); - -class src_reg : public backend_reg -{ -public: - DECLARE_RALLOC_CXX_OPERATORS(src_reg) - - void init(); - - src_reg(register_file file, int reg, const glsl_type *type); - src_reg(); - src_reg(float f); - src_reg(uint32_t u); - src_reg(int32_t i); - src_reg(uint8_t vf0, uint8_t vf1, uint8_t vf2, uint8_t vf3); - src_reg(struct brw_reg reg); - - bool equals(const src_reg &r) const; - - src_reg(class vec4_visitor *v, const struct glsl_type *type); - src_reg(class vec4_visitor *v, const struct glsl_type *type, int size); - - explicit src_reg(dst_reg reg); - - GLuint swizzle; /**< BRW_SWIZZLE_XYZW macros from brw_reg.h. */ - - src_reg *reladdr; -}; - -static inline src_reg -retype(src_reg reg, enum brw_reg_type type) -{ - reg.fixed_hw_reg.type = reg.type = type; - return reg; -} - -static inline src_reg -offset(src_reg reg, unsigned delta) -{ - assert(delta == 0 || (reg.file != HW_REG && reg.file != IMM)); - reg.reg_offset += delta; - return reg; -} - -/** - * Reswizzle a given source register. - * \sa brw_swizzle(). - */ -static inline src_reg -swizzle(src_reg reg, unsigned swizzle) -{ - assert(reg.file != HW_REG); - reg.swizzle = BRW_SWIZZLE4( - BRW_GET_SWZ(reg.swizzle, BRW_GET_SWZ(swizzle, 0)), - BRW_GET_SWZ(reg.swizzle, BRW_GET_SWZ(swizzle, 1)), - BRW_GET_SWZ(reg.swizzle, BRW_GET_SWZ(swizzle, 2)), - BRW_GET_SWZ(reg.swizzle, BRW_GET_SWZ(swizzle, 3))); - return reg; -} - -static inline src_reg -negate(src_reg reg) -{ - assert(reg.file != HW_REG && reg.file != IMM); - reg.negate = !reg.negate; - return reg; -} - -class dst_reg : public backend_reg -{ -public: - DECLARE_RALLOC_CXX_OPERATORS(dst_reg) - - void init(); - - dst_reg(); - dst_reg(register_file file, int reg); - dst_reg(register_file file, int reg, const glsl_type *type, int writemask); - dst_reg(struct brw_reg reg); - dst_reg(class vec4_visitor *v, const struct glsl_type *type); - - explicit dst_reg(src_reg reg); - - int writemask; /**< Bitfield of WRITEMASK_[XYZW] */ - - src_reg *reladdr; -}; - -static inline dst_reg -retype(dst_reg reg, enum brw_reg_type type) -{ - reg.fixed_hw_reg.type = reg.type = type; - return reg; -} - -static inline dst_reg -offset(dst_reg reg, unsigned delta) -{ - assert(delta == 0 || (reg.file != HW_REG && reg.file != IMM)); - reg.reg_offset += delta; - return reg; -} - -static inline dst_reg -writemask(dst_reg reg, unsigned mask) -{ - assert(reg.file != HW_REG && reg.file != IMM); - assert((reg.writemask & mask) != 0); - reg.writemask &= mask; - return reg; -} - -class vec4_instruction : public backend_instruction { -public: - DECLARE_RALLOC_CXX_OPERATORS(vec4_instruction) - - vec4_instruction(vec4_visitor *v, enum opcode opcode, - const dst_reg &dst = dst_reg(), - const src_reg &src0 = src_reg(), - const src_reg &src1 = src_reg(), - const src_reg &src2 = src_reg()); - - struct brw_reg get_dst(void); - struct brw_reg get_src(const struct brw_vec4_prog_data *prog_data, int i); - - dst_reg dst; - src_reg src[3]; - - enum brw_urb_write_flags urb_write_flags; - - unsigned sol_binding; /**< gen6: SOL binding table index */ - bool sol_final_write; /**< gen6: send commit message */ - unsigned sol_vertex; /**< gen6: used for setting dst index in SVB header */ - - bool is_send_from_grf(); - bool can_reswizzle(int dst_writemask, int swizzle, int swizzle_mask); - void reswizzle(int dst_writemask, int swizzle); - bool can_do_source_mods(struct brw_context *brw); - - bool reads_flag() - { - return predicate || opcode == VS_OPCODE_UNPACK_FLAGS_SIMD4X2; - } - - bool writes_flag() - { - return conditional_mod && opcode != BRW_OPCODE_SEL; - } -}; +class vec4_live_variables; /** * The vertex shader front-end. @@ -250,8 +79,8 @@ public: vec4_visitor(struct brw_context *brw, struct brw_vec4_compile *c, struct gl_program *prog, - const struct brw_vec4_prog_key *key, - struct brw_vec4_prog_data *prog_data, + const struct brw_vue_prog_key *key, + struct brw_vue_prog_data *prog_data, struct gl_shader_program *shader_prog, gl_shader_stage stage, void *mem_ctx, @@ -278,8 +107,8 @@ public: } struct brw_vec4_compile * const c; - const struct brw_vec4_prog_key * const key; - struct brw_vec4_prog_data * const prog_data; + const struct brw_vue_prog_key * const key; + struct brw_vue_prog_data * const prog_data; unsigned int sanity_param_count; char *fail_msg; @@ -292,25 +121,13 @@ public: const void *base_ir; const char *current_annotation; - int *virtual_grf_sizes; - int virtual_grf_count; - int virtual_grf_array_size; int first_non_payload_grf; unsigned int max_grf; int *virtual_grf_start; int *virtual_grf_end; + brw::vec4_live_variables *live_intervals; dst_reg userplane[MAX_CLIP_PLANES]; - /** - * This is the size to be used for an array with an element per - * reg_offset - */ - int virtual_grf_reg_count; - /** Per-virtual-grf indices into an array of size virtual_grf_reg_count */ - int *virtual_grf_reg_map; - - bool live_intervals_valid; - dst_reg *variable_storage(ir_variable *var); void reladdr_to_temp(ir_instruction *ir, src_reg *reg, int *num_reladdr); @@ -365,7 +182,6 @@ public: bool run(void); void fail(const char *msg, ...); - int virtual_grf_alloc(int size); void setup_uniform_clipplane_values(); void setup_uniform_values(ir_variable *ir); void setup_builtin_uniform_values(ir_variable *ir); @@ -383,10 +199,11 @@ public: void calculate_live_intervals(); void invalidate_live_intervals(); void split_virtual_grfs(); + bool opt_vector_float(); bool opt_reduce_swizzle(); bool dead_code_eliminate(); bool virtual_grf_interferes(int a, int b); - bool opt_copy_propagation(); + bool opt_copy_propagation(bool do_constant_prop = true); bool opt_cse_local(bblock_t *block); bool opt_cse(); bool opt_algebraic(); @@ -508,6 +325,10 @@ public: void emit_pack_half_2x16(dst_reg dst, src_reg src0); void emit_unpack_half_2x16(dst_reg dst, src_reg src0); + void emit_unpack_unorm_4x8(const dst_reg &dst, src_reg src0); + void emit_unpack_snorm_4x8(const dst_reg &dst, src_reg src0); + void emit_pack_unorm_4x8(const dst_reg &dst, const src_reg &src0); + void emit_pack_snorm_4x8(const dst_reg &dst, const src_reg &src0); uint32_t gather_channel(ir_texture *ir, uint32_t sampler); src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, src_reg sampler); @@ -517,7 +338,7 @@ public: void emit_ndc_computation(); void emit_psiz_and_flags(dst_reg reg); void emit_clip_distances(dst_reg reg, int offset); - void emit_generic_urb_slot(dst_reg reg, int varying); + vec4_instruction *emit_generic_urb_slot(dst_reg reg, int varying); void emit_urb_slot(dst_reg reg, int varying); void emit_shader_time_begin(); @@ -550,6 +371,7 @@ public: bool try_emit_mad(ir_expression *ir); bool try_emit_b2f_of_compare(ir_expression *ir); void resolve_ud_negate(src_reg *reg); + void resolve_bool_comparison(ir_rvalue *rvalue, src_reg *reg); src_reg get_timestamp(); @@ -601,9 +423,11 @@ public: vec4_generator(struct brw_context *brw, struct gl_shader_program *shader_prog, struct gl_program *prog, - struct brw_vec4_prog_data *prog_data, + struct brw_vue_prog_data *prog_data, void *mem_ctx, - bool debug_flag); + bool debug_flag, + const char *stage_name, + const char *stage_abbrev); ~vec4_generator(); const unsigned *generate_assembly(const cfg_t *cfg, unsigned *asm_size); @@ -693,9 +517,11 @@ private: struct gl_shader_program *shader_prog; const struct gl_program *prog; - struct brw_vec4_prog_data *prog_data; + struct brw_vue_prog_data *prog_data; void *mem_ctx; + const char *stage_name; + const char *stage_abbrev; const bool debug_flag; };