radv/ac: handle primitive id
authorDave Airlie <airlied@redhat.com>
Thu, 19 Jan 2017 05:23:02 +0000 (15:23 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 30 Jan 2017 23:30:08 +0000 (09:30 +1000)
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_nir_to_llvm.h

index c5c32eb80fd1e125790166a4303357cf03a83311..15ea727755a432796989956cfcc07f547e58c7d1 100644 (file)
@@ -4113,7 +4113,8 @@ handle_fs_inputs_pre(struct nir_to_llvm_context *ctx,
                if (!(ctx->input_mask & (1ull << i)))
                        continue;
 
-               if (i >= VARYING_SLOT_VAR0 || i == VARYING_SLOT_PNTC) {
+               if (i >= VARYING_SLOT_VAR0 || i == VARYING_SLOT_PNTC ||
+                   i == VARYING_SLOT_PRIMITIVE_ID) {
                        interp_param = *inputs;
                        interp_fs_input(ctx, index, interp_param, ctx->prim_mask,
                                        inputs);
@@ -4131,6 +4132,8 @@ handle_fs_inputs_pre(struct nir_to_llvm_context *ctx,
        ctx->shader_info->fs.num_interp = index;
        if (ctx->input_mask & (1 << VARYING_SLOT_PNTC))
                ctx->shader_info->fs.has_pcoord = true;
+       if (ctx->input_mask & (1 << VARYING_SLOT_PRIMITIVE_ID))
+               ctx->shader_info->fs.prim_id_input = true;
        ctx->shader_info->fs.input_mask = ctx->input_mask >> VARYING_SLOT_VAR0;
 }
 
@@ -4418,6 +4421,7 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx)
                                                       (1ull << VARYING_SLOT_CULL_DIST0) |
                                                       (1ull << VARYING_SLOT_CULL_DIST1));
 
+       ctx->shader_info->vs.prim_id_output = 0xffffffff;
        if (clip_mask) {
                LLVMValueRef slots[8];
                unsigned j;
@@ -4479,6 +4483,10 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx)
                        ctx->shader_info->vs.writes_viewport_index = true;
                        viewport_index_value = values[0];
                        continue;
+               } else if (i == VARYING_SLOT_PRIMITIVE_ID) {
+                       ctx->shader_info->vs.prim_id_output = param_count;
+                       target = V_008DFC_SQ_EXP_PARAM + param_count;
+                       param_count++;
                } else if (i >= VARYING_SLOT_VAR0) {
                        ctx->shader_info->vs.export_mask |= 1u << (i - VARYING_SLOT_VAR0);
                        target = V_008DFC_SQ_EXP_PARAM + param_count;
index ab6ce5a5c6ab67b1318be9e890f963f19fc6e314..4a6572d5d7c1d53ca6c173f8646df14bc68d28b8 100644 (file)
@@ -106,6 +106,7 @@ struct ac_shader_variant_info {
                        uint8_t clip_dist_mask;
                        uint8_t cull_dist_mask;
                        uint32_t esgs_itemsize;
+                       uint32_t prim_id_output;
                } vs;
                struct {
                        unsigned num_interp;
@@ -119,6 +120,7 @@ struct ac_shader_variant_info {
                        bool early_fragment_test;
                        bool writes_memory;
                        bool force_persample;
+                       bool prim_id_input;
                } fs;
                struct {
                        unsigned block_size[3];