X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fradeon%2Fradeon_llvm.h;h=ec16def204da2f7a681cc4086461eb65b9a02635;hb=d794072b3e1f27b96aaf2c476fcd5dcc5fd9d445;hp=b8dc771226a3c6cef5fb8bf7fb431f24150aaef6;hpb=8cf552b1823e6c0ea8ce0465937920b4cab83465;p=mesa.git diff --git a/src/gallium/drivers/radeon/radeon_llvm.h b/src/gallium/drivers/radeon/radeon_llvm.h index b8dc771226a..ec16def204d 100644 --- a/src/gallium/drivers/radeon/radeon_llvm.h +++ b/src/gallium/drivers/radeon/radeon_llvm.h @@ -31,10 +31,10 @@ #include "gallivm/lp_bld_init.h" #include "gallivm/lp_bld_tgsi.h" -#define RADEON_LLVM_MAX_INPUTS 16 * 4 -#define RADEON_LLVM_MAX_OUTPUTS 16 * 4 -#define RADEON_LLVM_MAX_BRANCH_DEPTH 16 -#define RADEON_LLVM_MAX_LOOP_DEPTH 16 +#define RADEON_LLVM_MAX_INPUTS 32 * 4 +#define RADEON_LLVM_MAX_OUTPUTS 32 * 4 + +#define RADEON_LLVM_INITIAL_CF_DEPTH 4 #define RADEON_LLVM_MAX_SYSTEM_VALUES 4 @@ -51,35 +51,10 @@ struct radeon_llvm_loop { }; struct radeon_llvm_context { - struct lp_build_tgsi_soa_context soa; - unsigned chip_class; - unsigned type; - unsigned face_input; - unsigned two_side; - struct r600_shader_io * r600_inputs; - struct r600_shader_io * r600_outputs; - unsigned color_buffer_count; - unsigned fs_color_all; - /*=== Front end configuration ===*/ - /* Special Intrinsics */ - - /** Write to an output register: float store_output(float, i32) */ - const char * store_output_intr; - - /** Swizzle a vector value: <4 x float> swizzle(<4 x float>, i32) - * The swizzle is an unsigned integer that encodes a TGSI_SWIZZLE_* value - * in 2-bits. - * Swizzle{0-1} = X Channel - * Swizzle{2-3} = Y Channel - * Swizzle{4-5} = Z Channel - * Swizzle{6-7} = W Channel - */ - const char * swizzle_intr; - /* Instructions that are not described by any of the TGSI opcodes. */ /** This function is responsible for initilizing the inputs array and will be @@ -93,8 +68,8 @@ struct radeon_llvm_context { unsigned index, const struct tgsi_full_declaration *decl); - /** User data to use with the callbacks */ - void * userdata; + void (*declare_memory_region)(struct radeon_llvm_context *, + const struct tgsi_full_declaration *decl); /** This array contains the input values for the shader. Typically these * values will be in the form of a target intrinsic that will inform the @@ -102,48 +77,61 @@ struct radeon_llvm_context { */ LLVMValueRef inputs[RADEON_LLVM_MAX_INPUTS]; LLVMValueRef outputs[RADEON_LLVM_MAX_OUTPUTS][TGSI_NUM_CHANNELS]; - unsigned output_reg_count; + /** This pointer is used to contain the temporary values. + * The amount of temporary used in tgsi can't be bound to a max value and + * thus we must allocate this array at runtime. + */ + LLVMValueRef *temps; + unsigned temps_count; LLVMValueRef system_values[RADEON_LLVM_MAX_SYSTEM_VALUES]; - unsigned reserved_reg_count; /*=== Private Members ===*/ - struct radeon_llvm_branch branch[RADEON_LLVM_MAX_BRANCH_DEPTH]; - struct radeon_llvm_loop loop[RADEON_LLVM_MAX_LOOP_DEPTH]; + struct radeon_llvm_branch *branch; + struct radeon_llvm_loop *loop; unsigned branch_depth; + unsigned branch_depth_max; unsigned loop_depth; + unsigned loop_depth_max; + struct tgsi_declaration_range *arrays; LLVMValueRef main_fn; + LLVMTypeRef return_type; struct gallivm_state gallivm; }; -static inline LLVMValueRef bitcast( +static inline LLVMTypeRef tgsi2llvmtype( struct lp_build_tgsi_context * bld_base, - enum tgsi_opcode_type type, - LLVMValueRef value -) + enum tgsi_opcode_type type) { - LLVMBuilderRef builder = bld_base->base.gallivm->builder; LLVMContextRef ctx = bld_base->base.gallivm->context; - LLVMTypeRef dst_type; switch (type) { case TGSI_TYPE_UNSIGNED: case TGSI_TYPE_SIGNED: - dst_type = LLVMInt32TypeInContext(ctx); - break; + return LLVMInt32TypeInContext(ctx); + case TGSI_TYPE_DOUBLE: + return LLVMDoubleTypeInContext(ctx); case TGSI_TYPE_UNTYPED: case TGSI_TYPE_FLOAT: - dst_type = LLVMFloatTypeInContext(ctx); - break; - default: - dst_type = 0; - break; + return LLVMFloatTypeInContext(ctx); + default: break; } + return 0; +} + +static inline LLVMValueRef bitcast( + struct lp_build_tgsi_context * bld_base, + enum tgsi_opcode_type type, + LLVMValueRef value +) +{ + LLVMBuilderRef builder = bld_base->base.gallivm->builder; + LLVMTypeRef dst_type = tgsi2llvmtype(bld_base, type); if (dst_type) return LLVMBuildBitCast(builder, value, dst_type, ""); @@ -153,10 +141,16 @@ static inline LLVMValueRef bitcast( void radeon_llvm_emit_prepare_cube_coords(struct lp_build_tgsi_context * bld_base, - struct lp_build_emit_data * emit_data, - unsigned coord_arg); + struct lp_build_emit_data * emit_data, + LLVMValueRef *coords_arg, + LLVMValueRef *derivs_arg); + +void radeon_llvm_context_init(struct radeon_llvm_context * ctx, + const char *triple); -void radeon_llvm_context_init(struct radeon_llvm_context * ctx); +void radeon_llvm_create_func(struct radeon_llvm_context * ctx, + LLVMTypeRef *return_types, unsigned num_return_elems, + LLVMTypeRef *ParamTypes, unsigned ParamCount); void radeon_llvm_dispose(struct radeon_llvm_context * ctx); @@ -170,20 +164,30 @@ unsigned radeon_llvm_reg_index_soa(unsigned index, unsigned chan); void radeon_llvm_finalize_module(struct radeon_llvm_context * ctx); -LLVMValueRef -build_intrinsic(LLVMBuilderRef builder, - const char *name, - LLVMTypeRef ret_type, - LLVMValueRef *args, - unsigned num_args, - LLVMAttribute attr); - void build_tgsi_intrinsic_nomem( const struct lp_build_tgsi_action * action, struct lp_build_tgsi_context * bld_base, struct lp_build_emit_data * emit_data); - +LLVMValueRef +radeon_llvm_emit_fetch_64bit(struct lp_build_tgsi_context *bld_base, + enum tgsi_opcode_type type, + LLVMValueRef ptr, + LLVMValueRef ptr2); + +LLVMValueRef radeon_llvm_saturate(struct lp_build_tgsi_context *bld_base, + LLVMValueRef value); + +LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base, + const struct tgsi_full_src_register *reg, + enum tgsi_opcode_type type, + unsigned swizzle); + +void radeon_llvm_emit_store( + struct lp_build_tgsi_context * bld_base, + const struct tgsi_full_instruction * inst, + const struct tgsi_opcode_info * info, + LLVMValueRef dst[4]); #endif /* RADEON_LLVM_H */