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

Marek Olšák maraeo at gmail.com
Tue Jul 1 09:25:57 PDT 2014


If the tests pass, the patch can be merged.

Marek

On Tue, Jul 1, 2014 at 5:25 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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
> _______________________________________________
> 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