[Mesa-dev] [PATCH] radeonsi: add support for geometry shader invocations.

Ilia Mirkin imirkin at alum.mit.edu
Thu Jun 25 14:22:29 PDT 2015


On Thu, Jun 25, 2015 at 4:29 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Thu, Jun 25, 2015 at 4:26 PM, Dave Airlie <airlied at gmail.com> wrote:
>> From: Dave Airlie <airlied at redhat.com>
>>
>> Signed-off-by: Dave Airlie <airlied at redhat.com>
>> ---
>>  src/gallium/drivers/radeonsi/si_shader.c        | 5 +++++
>>  src/gallium/drivers/radeonsi/si_shader.h        | 1 +
>>  src/gallium/drivers/radeonsi/si_state.c         | 1 -
>>  src/gallium/drivers/radeonsi/si_state_shaders.c | 7 +++++++
>>  4 files changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
>> index 87608a1..665ce83 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>> @@ -630,6 +630,11 @@ static void declare_system_value(
>>                                      SI_PARAM_BASE_VERTEX);
>>                 break;
>>
>> +       case TGSI_SEMANTIC_INVOCATIONID:
>> +               value = LLVMGetParam(radeon_bld->main_fn,
>> +                                    SI_PARAM_GS_INSTANCE_ID);
>> +               break;
>> +
>>         case TGSI_SEMANTIC_SAMPLEID:
>>                 value = get_sample_id(radeon_bld);
>>                 break;
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
>> index 51055af..b4339ae 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.h
>> +++ b/src/gallium/drivers/radeonsi/si_shader.h
>> @@ -115,6 +115,7 @@ struct si_shader_selector {
>>
>>         unsigned        gs_output_prim;
>>         unsigned        gs_max_out_vertices;
>> +       unsigned        gs_num_invocations;
>>         uint64_t        gs_used_inputs; /* mask of "get_unique_index" bits */
>>  };
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
>> index 752467b..0dd08a2 100644
>> --- a/src/gallium/drivers/radeonsi/si_state.c
>> +++ b/src/gallium/drivers/radeonsi/si_state.c
>> @@ -3078,7 +3078,6 @@ void si_init_config(struct si_context *sctx)
>>         si_pm4_set_reg(pm4, R_028B60_VGT_GS_VERT_ITEMSIZE_1, 0);
>>         si_pm4_set_reg(pm4, R_028B64_VGT_GS_VERT_ITEMSIZE_2, 0);
>>         si_pm4_set_reg(pm4, R_028B68_VGT_GS_VERT_ITEMSIZE_3, 0);
>> -       si_pm4_set_reg(pm4, R_028B90_VGT_GS_INSTANCE_CNT, 0);
>>
>>         si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0);
>>         si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0);
>> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
>> index 48128fa..eef3baa 100644
>> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
>> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
>> @@ -76,6 +76,7 @@ static void si_shader_gs(struct si_shader *shader)
>>         unsigned gs_vert_itemsize = shader->selector->info.num_outputs * (16 >> 2);
>>         unsigned gs_max_vert_out = shader->selector->gs_max_out_vertices;
>>         unsigned gsvs_itemsize = gs_vert_itemsize * gs_max_vert_out;
>> +       unsigned gs_num_invocations = shader->selector->gs_num_invocations;
>>         unsigned cut_mode;
>>         struct si_pm4_state *pm4;
>>         unsigned num_sgprs, num_user_sgprs;
>> @@ -118,6 +119,10 @@ static void si_shader_gs(struct si_shader *shader)
>>
>>         si_pm4_set_reg(pm4, R_028B5C_VGT_GS_VERT_ITEMSIZE, gs_vert_itemsize);
>>
>> +       si_pm4_set_reg(pm4, R_028B90_VGT_GS_INSTANCE_CNT,
>> +                      S_028B90_CNT(MIN2(gs_num_invocations, 127)) |
>> +                      S_028B90_ENABLE(gs_num_invocations > 0));
>
> Without knowing how radeonsi works, just want to point out that
> previously GS_INSTANCE_CNT was being always set to 0, even though a
> single invocation was still being run. Perhaps this really needs to be
> gs_num_invocations_minus_one?
>
> GS_INVOCATIONS will always be at least 1.

OK, I looked at the docs. Looks like the enable is for instance id
generation, and if invocations == 0, that's also treated as a disable.

This may end up generating the instanceid unnecessarily, but that's
probably OK. I might try changing that enable to be > 1, but probably
not a big deal either way.

  -ilia

>
>> +
>>         va = shader->bo->gpu_address;
>>         si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ, RADEON_PRIO_SHADER_DATA);
>>         si_pm4_set_reg(pm4, R_00B220_SPI_SHADER_PGM_LO_GS, va >> 8);
>> @@ -490,6 +495,8 @@ static void *si_create_shader_state(struct pipe_context *ctx,
>>                         sel->info.properties[TGSI_PROPERTY_GS_OUTPUT_PRIM];
>>                 sel->gs_max_out_vertices =
>>                         sel->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES];
>> +               sel->gs_num_invocations =
>> +                       sel->info.properties[TGSI_PROPERTY_GS_INVOCATIONS];
>>
>>                 for (i = 0; i < sel->info.num_inputs; i++) {
>>                         unsigned name = sel->info.input_semantic_name[i];
>> --
>> 2.4.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list