diff options
Diffstat (limited to 'src')
4 files changed, 29 insertions, 1 deletions
diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c b/src/gallium/drivers/r300/r300_tgsi_to_rc.c index 33448bf0de..15a323989b 100644 --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.c +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.c @@ -57,7 +57,7 @@ static unsigned translate_opcode(unsigned opcode)       /* case TGSI_OPCODE_DP2A: return RC_OPCODE_DP2A; */                                          /* gap */          case TGSI_OPCODE_FRC: return RC_OPCODE_FRC; -     /* case TGSI_OPCODE_CLAMP: return RC_OPCODE_CLAMP; */ +        case TGSI_OPCODE_CLAMP: return RC_OPCODE_CLAMP;          case TGSI_OPCODE_FLR: return RC_OPCODE_FLR;       /* case TGSI_OPCODE_ROUND: return RC_OPCODE_ROUND; */          case TGSI_OPCODE_EX2: return RC_OPCODE_EX2; diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c index da495a3afa..113b27632a 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c @@ -67,6 +67,13 @@ struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {  		.IsComponentwise = 1  	},  	{ +		.Opcode = RC_OPCODE_CLAMP, +		.Name = "CLAMP", +		.NumSrcRegs = 3, +		.HasDstReg = 1, +		.IsComponentwise = 1 +	}, +	{  		.Opcode = RC_OPCODE_CMP,  		.Name = "CMP",  		.NumSrcRegs = 3, diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h index d3f639c870..7e66610127 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h +++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.h @@ -50,6 +50,9 @@ typedef enum {  	/** vec4 instruction: dst.c = ceil(src0.c) */  	RC_OPCODE_CEIL, +	/** vec4 instruction: dst.c = clamp(src0.c, src1.c, src2.c) */ +	RC_OPCODE_CLAMP, +  	/** vec4 instruction: dst.c = src0.c < 0.0 ? src1.c : src2.c */  	RC_OPCODE_CMP, diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c index 106e03495d..01c2e74e7b 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c @@ -217,6 +217,22 @@ static void transform_CEIL(struct radeon_compiler* c,  	rc_remove_instruction(inst);  } +static void transform_CLAMP(struct radeon_compiler *c, +	struct rc_instruction *inst) +{ +	/* CLAMP dst, src, min, max +	 *    into: +	 * MIN tmp, src, max +	 * MAX dst, tmp, min +	 */ +	int tempreg = rc_find_free_temporary(c); +	emit2(c, inst->Prev, RC_OPCODE_MIN, 0, dstreg(RC_FILE_TEMPORARY, tempreg), +		inst->U.I.SrcReg[0], inst->U.I.SrcReg[2]); +	emit2(c, inst->Prev, RC_OPCODE_MAX, inst->U.I.SaturateMode, inst->U.I.DstReg, +		srcreg(RC_FILE_TEMPORARY, tempreg), inst->U.I.SrcReg[1]); +	rc_remove_instruction(inst); +} +  static void transform_DP2(struct radeon_compiler* c,  	struct rc_instruction* inst)  { @@ -554,6 +570,7 @@ int radeonTransformALU(  	switch(inst->U.I.Opcode) {  	case RC_OPCODE_ABS: transform_ABS(c, inst); return 1;  	case RC_OPCODE_CEIL: transform_CEIL(c, inst); return 1; +	case RC_OPCODE_CLAMP: transform_CLAMP(c, inst); return 1;  	case RC_OPCODE_DP2: transform_DP2(c, inst); return 1;  	case RC_OPCODE_DPH: transform_DPH(c, inst); return 1;  	case RC_OPCODE_DST: transform_DST(c, inst); return 1; @@ -782,6 +799,7 @@ int r300_transform_vertex_alu(  	switch(inst->U.I.Opcode) {  	case RC_OPCODE_ABS: transform_r300_vertex_ABS(c, inst); return 1;  	case RC_OPCODE_CEIL: transform_CEIL(c, inst); return 1; +	case RC_OPCODE_CLAMP: transform_CLAMP(c, inst); return 1;  	case RC_OPCODE_CMP: transform_r300_vertex_CMP(c, inst); return 1;  	case RC_OPCODE_DP2: transform_r300_vertex_DP2(c, inst); return 1;  	case RC_OPCODE_DP3: transform_r300_vertex_DP3(c, inst); return 1;  | 
