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

Alex Deucher alexdeucher at gmail.com
Tue Jul 1 08:13:41 PDT 2014


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>

>
> 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