r600g: add KILP support
authorDave Airlie <airlied@redhat.com>
Mon, 30 Aug 2010 04:41:09 +0000 (14:41 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 30 Aug 2010 05:04:40 +0000 (15:04 +1000)
passes glsl1-discard tests

src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h
src/gallium/drivers/r600/r600_state.c

index 4ff705622ed29d4a082768c647ce015d0a764c41..514288bc8cdf6e2aae0cfda33e1c434ebf5e08a4 100644 (file)
@@ -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},
index 2ee7780ead0a6e611d10aeb6556c9ec8c5f05afd..7c722c07cbe365d96c03fd4f0dee9a027092d0d9 100644 (file)
@@ -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
index b5e5346163c749a615a301c5be10544301699c6f..441be8fd6df68d5d0783708b83f313c266d9036e 100644 (file)
@@ -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;