[Mesa-dev] [PATCH v2] r600g: allow viewport index/layer to be sent to fs

Ilia Mirkin imirkin at alum.mit.edu
Tue Jul 1 08:25:48 PDT 2014


On Tue, Jul 1, 2014 at 11:13 AM, Alex Deucher <alexdeucher at gmail.com> wrote:
> On Tue, Jun 24, 2014 at 8:43 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> In order to support ARB_fragment_layer_viewport, we need to explicitly
>> send these along to the fragment shader, since it has no other way to
>> retrieve them.
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> Tested-by: Tobias Droste <tdroste at gmx.de>
>> ---
>>
>> v1 -> v2:
>>
>>   - Add forgotten copy to initialize new output with the settings of the
>>     previous one for vertex layer
>>
>> Tobias was able to test this version with the vertex shader setting the layer
>> as well. (And it passed. The first version crashed his box.)
>>
>> I would like to reiterate my disclaimers from the v1 commit... I don't know
>> much about r600, don't have the hw, and was just going on the advice of Alex
>> Deucher and Jerome Glisse. I largely copied how clipvertex was handled.
>
> This looks good to me.
>
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

Great! Marek had indicated on IRC that it'd be a while before he could
look at it. Should I wait for him, or is this good to go in? [Not sure
who the experts are on the radeon side of things...] Please note that
the testing that was done was only on the ARB_fragment_layer_viewport
tests, on only one card (evergreen, if memory serves), not a full
piglit run.

>
>>
>> It's unclear to me whether these outputs will be eliminated in the
>> (overwhelmingly common) case where the fragment shader does not actually
>> consume them, but I was told they would be.
>>
>>  src/gallium/drivers/r600/r600_shader.c | 22 ++++++++++++++++++++--
>>  1 file changed, 20 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
>> index b3d1998..3767e5f 100644
>> --- a/src/gallium/drivers/r600/r600_shader.c
>> +++ b/src/gallium/drivers/r600/r600_shader.c
>> @@ -498,8 +498,6 @@ 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_LAYER ||
>> -           name == TGSI_SEMANTIC_VIEWPORT_INDEX ||
>>             name == TGSI_SEMANTIC_FACE)
>>                 index = 0;
>>         else {
>> @@ -1337,6 +1335,12 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
>>                         ctx.shader->vs_out_point_size = 1;
>>                         break;
>>                 case TGSI_SEMANTIC_LAYER:
>> +                       if (out->spi_sid) {
>> +                               /* duplicate it as PARAM to pass to the pixel shader */
>> +                               output.array_base = next_param++;
>> +                               r600_bytecode_add_output(ctx.bc, &output);
>> +                               last_exp_param = ctx.bc->cf_last;
>> +                       }
>>                         output.array_base = 61;
>>                         if (next_clip_pos == 61)
>>                                 next_clip_pos = 62;
>> @@ -1349,6 +1353,12 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
>>                         ctx.shader->vs_out_layer = 1;
>>                         break;
>>                 case TGSI_SEMANTIC_VIEWPORT_INDEX:
>> +                       if (out->spi_sid) {
>> +                               /* duplicate it as PARAM to pass to the pixel shader */
>> +                               output.array_base = next_param++;
>> +                               r600_bytecode_add_output(ctx.bc, &output);
>> +                               last_exp_param = ctx.bc->cf_last;
>> +                       }
>>                         output.array_base = 61;
>>                         if (next_clip_pos == 61)
>>                                 next_clip_pos = 62;
>> @@ -2016,6 +2026,14 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
>>                                         pos_emitted = true;
>>                                         break;
>>                                 case TGSI_SEMANTIC_LAYER:
>> +                                       /* spi_sid is 0 for outputs that are
>> +                                        * not consumed by PS */
>> +                                       if (shader->output[i].spi_sid) {
>> +                                               output[j].array_base = next_param_base++;
>> +                                               output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
>> +                                               j++;
>> +                                               memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
>> +                                       }
>>                                         output[j].array_base = 61;
>>                                         output[j].swizzle_x = 7;
>>                                         output[j].swizzle_y = 7;
>> --
>> 1.8.5.5
>>
>> _______________________________________________
>> 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