r600g: add primitive input support for gs
authorDave Airlie <airlied@redhat.com>
Mon, 23 Dec 2013 01:30:03 +0000 (01:30 +0000)
committerDave Airlie <airlied@redhat.com>
Wed, 5 Feb 2014 00:49:39 +0000 (10:49 +1000)
only enable prim id if gs uses it

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/evergreend.h
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h

index e6aa12228f9a60b619b6a54499e4294c1249876c..c206c08c9c97262716ca02ef682a77add727e324 100644 (file)
@@ -2725,7 +2725,7 @@ static void evergreen_emit_shader_stages(struct r600_context *rctx, struct r600_
        struct radeon_winsys_cs *cs = rctx->b.rings.gfx.cs;
        struct r600_shader_stages_state *state = (struct r600_shader_stages_state*)a;
 
-       uint32_t v = 0, v2 = 0;
+       uint32_t v = 0, v2 = 0, primid = 0;
 
        if (state->geom_enable) {
                v = S_028B54_ES_EN(V_028B54_ES_STAGE_REAL) |
@@ -2734,10 +2734,14 @@ static void evergreen_emit_shader_stages(struct r600_context *rctx, struct r600_
 
                v2 = S_028A40_MODE(V_028A40_GS_SCENARIO_G) |
                        S_028A40_CUT_MODE(V_028A40_GS_CUT_128);
+
+               if (rctx->gs_shader->current->shader.gs_prim_id_input)
+                       primid = 1;
        }
 
        r600_write_context_reg(cs, R_028B54_VGT_SHADER_STAGES_EN, v);
        r600_write_context_reg(cs, R_028A40_VGT_GS_MODE, v2);
+       r600_write_context_reg(cs, R_028A84_VGT_PRIMITIVEID_EN, primid);
 }
 
 static void evergreen_emit_gs_rings(struct r600_context *rctx, struct r600_atom *a)
index 73b37c2c9e7c7a9dfa392238c97608bc423cc875..986fd16f1bab13a437e0c4106f681270165d5b38 100644 (file)
 #define R_028A58_ES_PER_GS                           0x00028A58
 #define R_028A5C_GS_PER_VS                           0x00028A5C
 
+#define R_028A84_VGT_PRIMITIVEID_EN                  0x028A84
+#define   S_028A84_PRIMITIVEID_EN(x)                   (((x) & 0x1) << 0)
+#define   G_028A84_PRIMITIVEID_EN(x)                   (((x) >> 0) & 0x1)
+#define   C_028A84_PRIMITIVEID_EN                      0xFFFFFFFE
 #define R_028A94_VGT_MULTI_PRIM_IB_RESET_EN          0x00028A94
 #define   S_028A94_RESET_EN(x)                         (((x) & 0x1) << 0)
 #define   G_028A94_RESET_EN(x)                         (((x) >> 0) & 0x1)
index e24b64d17811ec5fb56cd9ea365a498fe80f8f33..fd11f61792ab55b5448cfdf547cec95d11557435 100644 (file)
@@ -590,6 +590,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
                        /* FIXME probably skip inputs if they aren't passed in the ring */
                        ctx->shader->input[i].ring_offset = ctx->next_ring_offset;
                        ctx->next_ring_offset += 16;
+                       if (ctx->shader->input[i].name == TGSI_SEMANTIC_PRIMID)
+                               ctx->shader->gs_prim_id_input = true;
                }
                for (j = 1; j < count; ++j) {
                        ctx->shader->input[i + j] = ctx->shader->input[i];
@@ -872,6 +874,13 @@ static int tgsi_split_gs_inputs(struct r600_shader_ctx *ctx)
        for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
                struct tgsi_full_src_register *src = &inst->Src[i];
 
+               if (src->Register.File == TGSI_FILE_INPUT) {
+                       if (ctx->shader->input[src->Register.Index].name == TGSI_SEMANTIC_PRIMID) {
+                               /* primitive id is in R0.z */
+                               ctx->src[i].sel = 0;
+                               ctx->src[i].swizzle[0] = 2;
+                       }
+               }
                if (src->Register.File == TGSI_FILE_INPUT && src->Register.Dimension) {
                        int treg = r600_get_temp(ctx);
                        int index = src->Register.Index;
index 0bf8b51fff322c0012dd92a747b29e7a8ad2ab8a..d31c65f4bc865ed936ed02898925ce09af17e269 100644 (file)
@@ -64,6 +64,7 @@ struct r600_shader {
        boolean                 vs_out_point_size;
        boolean                 has_txq_cube_array_z_comp;
        boolean                 uses_tex_buffers;
+       boolean                 gs_prim_id_input;
 
        /* geometry shader properties */
        unsigned                gs_input_prim;