diff options
| author | Dave Airlie <airlied@redhat.com> | 2010-08-30 14:41:09 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2010-08-30 15:04:40 +1000 | 
| commit | 4502b17901ad491e0598ee59a12d372c008ae03b (patch) | |
| tree | 68f9196ccbd8cee575f99ddcf87c54d754d78324 /src | |
| parent | cb08b9fa84bf432dcca2e685daadd2df651b3025 (diff) | |
r600g: add KILP support
passes glsl1-discard tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 25 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_shader.h | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_state.c | 2 | 
3 files changed, 23 insertions, 5 deletions
| diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 4ff705622e..514288bc8c 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -861,12 +861,20 @@ static int tgsi_kill(struct r600_shader_ctx *ctx)  	for (i = 0; i < 4; i++) {  		memset(&alu, 0, sizeof(struct r600_bc_alu));  		alu.inst = ctx->inst_info->r600_opcode; +  		alu.dst.chan = i; +  		alu.src[0].sel = V_SQ_ALU_SRC_0; -		r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); -		if (r) -			return r; -		alu.src[1].chan = tgsi_chan(&inst->Src[0], i); + +		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { +			alu.src[1].sel = V_SQ_ALU_SRC_1; +			alu.src[1].neg = 1; +		} else { +			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); +			if (r) +				return r; +			alu.src[1].chan = tgsi_chan(&inst->Src[0], i); +		}  		if (i == 3) {  			alu.last = 1;  		} @@ -874,6 +882,13 @@ static int tgsi_kill(struct r600_shader_ctx *ctx)  		if (r)  			return r;  	} +	r = r600_bc_add_literal(ctx->bc, ctx->value); +	if (r) +		return r; + +	/* kill must be last in ALU */ +	ctx->bc->force_add_cf = 1; +	ctx->shader->uses_kill = TRUE;  	return 0;  } @@ -2074,7 +2089,7 @@ static struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {  	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},  	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},  	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, -	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */ +	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */  	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 2ee7780ead..7c722c07cb 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -42,6 +42,7 @@ struct r600_shader {  	struct r600_shader_io	input[32];  	struct r600_shader_io	output[32];  	enum radeon_family	family; +	boolean                 uses_kill;  };  #endif diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index b5e5346163..441be8fd6d 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -999,6 +999,8 @@ static struct radeon_state *r600_dsa(struct r600_context *rctx)  	db_shader_control = 0x210;  	rshader = &rctx->ps_shader->shader; +	if (rshader->uses_kill) +		db_shader_control |= (1 << 6);  	for (i = 0; i < rshader->noutput; i++) {  		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)  			db_shader_control |= 1; | 
