[Mesa-dev] [PATCH] r600g: gpu_shader5 gl_SampleMaskIn support

Andreas Boll andreas.boll.dev at gmail.com
Thu Jul 31 02:59:29 PDT 2014


Thanks!
Pushed.

2014-07-23 18:32 GMT+02:00 Alex Deucher <alexdeucher at gmail.com>:
> On Wed, Jul 23, 2014 at 5:57 AM, Glenn Kennard <glenn.kennard at gmail.com> wrote:
>> Map TGSI_SEMANTIC_SAMPLEMASK to register/component.
>> Enable face register when sample mask is needed by shader.
>> Requires Evergreen/Cayman
>> ---
>> I think the rest of the sample related bits in gpu_shader5 are
>> from GL_ARB_sample_shading which isn't implemented yet in r600.
>>
>> Passes samplemaskin-basic piglit, no regressions, on radeon 6670
>
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
>
>>
>>  docs/GL3.txt                               |  2 +-
>>  src/gallium/drivers/r600/evergreen_state.c | 10 ++++++--
>>  src/gallium/drivers/r600/r600_shader.c     | 37 ++++++++++++++++++++++++++----
>>  3 files changed, 41 insertions(+), 8 deletions(-)
>>
>> diff --git a/docs/GL3.txt b/docs/GL3.txt
>> index 8128692..53e19e0 100644
>> --- a/docs/GL3.txt
>> +++ b/docs/GL3.txt
>> @@ -109,7 +109,7 @@ GL 4.0:
>>    - Enhanced textureGather                             DONE (i965, nvc0, radeonsi)
>>    - Geometry shader instancing                         DONE (i965, nvc0)
>>    - Geometry shader multiple streams                   DONE (i965, nvc0)
>> -  - Enhanced per-sample shading                        DONE (i965)
>> +  - Enhanced per-sample shading                        DONE (i965, r600)
>>    - Interpolation functions                            DONE (i965)
>>    - New overload resolution rules                      DONE
>>    GL_ARB_gpu_shader_fp64                               started (Dave)
>> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
>> index 8f5ba5f..839d2ae 100644
>> --- a/src/gallium/drivers/r600/evergreen_state.c
>> +++ b/src/gallium/drivers/r600/evergreen_state.c
>> @@ -2843,8 +2843,14 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader
>>                    POSITION goes via GPRs from the SC so isn't counted */
>>                 if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
>>                         pos_index = i;
>> -               else if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
>> -                       face_index = i;
>> +               else if (rshader->input[i].name == TGSI_SEMANTIC_FACE) {
>> +                       if (face_index == -1)
>> +                               face_index = i;
>> +               }
>> +               else if (rshader->input[i].name == TGSI_SEMANTIC_SAMPLEMASK) {
>> +                       if (face_index == -1)
>> +                               face_index = i; /* lives in same register, same enable bit */
>> +               }
>>                 else {
>>                         ninterp++;
>>                         if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
>> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
>> index db928f3..c8ab4dd 100644
>> --- a/src/gallium/drivers/r600/r600_shader.c
>> +++ b/src/gallium/drivers/r600/r600_shader.c
>> @@ -287,7 +287,9 @@ struct r600_shader_ctx {
>>         boolean                                 input_linear;
>>         boolean                                 input_perspective;
>>         int                                     num_interp_gpr;
>> +       /* evergreen/cayman also store sample mask in face register */
>>         int                                     face_gpr;
>> +       boolean                                 has_samplemask;
>>         int                                     colors_used;
>>         boolean                 clip_vertex_write;
>>         unsigned                cv_output;
>> @@ -498,7 +500,8 @@ static int r600_spi_sid(struct r600_shader_io * io)
>>         if (name == TGSI_SEMANTIC_POSITION ||
>>             name == TGSI_SEMANTIC_PSIZE ||
>>             name == TGSI_SEMANTIC_EDGEFLAG ||
>> -           name == TGSI_SEMANTIC_FACE)
>> +           name == TGSI_SEMANTIC_FACE ||
>> +           name == TGSI_SEMANTIC_SAMPLEMASK)
>>                 index = 0;
>>         else {
>>                 if (name == TGSI_SEMANTIC_GENERIC) {
>> @@ -585,7 +588,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
>>                         ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
>>                         switch (ctx->shader->input[i].name) {
>>                         case TGSI_SEMANTIC_FACE:
>> -                               ctx->face_gpr = ctx->shader->input[i].gpr;
>> +                               if (ctx->face_gpr == -1)
>> +                                       ctx->face_gpr = ctx->shader->input[i].gpr;
>>                                 break;
>>                         case TGSI_SEMANTIC_COLOR:
>>                                 ctx->colors_used++;
>> @@ -675,7 +679,14 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
>>                 break;
>>
>>         case TGSI_FILE_SYSTEM_VALUE:
>> -               if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
>> +               if (d->Semantic.Name == TGSI_SEMANTIC_SAMPLEMASK) {
>> +                       ctx->has_samplemask = true;
>> +                       /* lives in Front Face GPR */
>> +                       if (ctx->face_gpr == -1)
>> +                               ctx->face_gpr = ctx->file_offset[TGSI_FILE_SYSTEM_VALUE] + d->Range.First;
>> +                       break;
>> +               }
>> +               else if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
>>                         if (!ctx->native_integers) {
>>                                 struct r600_bytecode_alu alu;
>>                                 memset(&alu, 0, sizeof(struct r600_bytecode_alu));
>> @@ -729,7 +740,8 @@ static int evergreen_gpr_count(struct r600_shader_ctx *ctx)
>>         for (i = 0; i < ctx->info.num_inputs; i++) {
>>                 /* skip position/face */
>>                 if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
>> -                   ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
>> +                   ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE ||
>> +                   ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_SAMPLEMASK)
>>                         continue;
>>                 if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
>>                         ctx->input_linear = TRUE;
>> @@ -781,7 +793,13 @@ static void tgsi_src(struct r600_shader_ctx *ctx,
>>                 r600_src->sel = V_SQ_ALU_SRC_LITERAL;
>>                 memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
>>         } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
>> -               if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
>> +               if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_SAMPLEMASK) {
>> +                       r600_src->swizzle[0] = 2; // Z value
>> +                       r600_src->swizzle[0] = 2;
>> +                       r600_src->swizzle[0] = 2;
>> +                       r600_src->swizzle[0] = 2;
>> +                       r600_src->sel = ctx->face_gpr;
>> +               } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
>>                         r600_src->swizzle[0] = 3;
>>                         r600_src->swizzle[1] = 3;
>>                         r600_src->swizzle[2] = 3;
>> @@ -1586,6 +1604,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
>>         ctx.gs_next_vertex = 0;
>>
>>         ctx.face_gpr = -1;
>> +       ctx.has_samplemask = false;
>>         ctx.fragcoord_input = -1;
>>         ctx.colors_used = 0;
>>         ctx.clip_vertex_write = 0;
>> @@ -1745,6 +1764,14 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
>>
>>         shader->ring_item_size = ctx.next_ring_offset;
>>
>> +       /* Need to tell setup to program FACE register */
>> +       if (ctx.has_samplemask && ctx.face_gpr != -1) {
>> +               i = ctx.shader->ninput++;
>> +               ctx.shader->input[i].name = TGSI_SEMANTIC_SAMPLEMASK;
>> +               ctx.shader->input[i].spi_sid = 0;
>> +               ctx.shader->input[i].gpr = ctx.face_gpr;
>> +       }
>> +
>>         /* Process two side if needed */
>>         if (shader->two_side && ctx.colors_used) {
>>                 int i, count = ctx.shader->ninput;
>> --
>> 1.8.3.2
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> 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