[Mesa-dev] [PATCH 12/14] st/mesa: add layer_offset to PBO fragment shader

Marek Olšák maraeo at gmail.com
Fri May 20 14:47:39 UTC 2016


On Wed, May 18, 2016 at 5:25 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> This will be used to select a slice of a 3D texture.
> ---
>  src/mesa/state_tracker/st_pbo.c | 19 +++++++++++++++----
>  src/mesa/state_tracker/st_pbo.h |  1 +
>  2 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
> index c7735f7..31a0c19 100644
> --- a/src/mesa/state_tracker/st_pbo.c
> +++ b/src/mesa/state_tracker/st_pbo.c
> @@ -83,6 +83,7 @@ st_pbo_addresses_setup(struct st_context *st,
>     addr->constants.yoffset = -addr->yoffset;
>     addr->constants.stride = addr->pixels_per_row;
>     addr->constants.image_size = addr->pixels_per_row * addr->image_height;
> +   addr->constants.layer_offset = 0;
>
>     return true;
>  }
> @@ -370,6 +371,7 @@ create_fs(struct st_context *st, bool download, enum pipe_texture_target target)
>     struct ureg_src pos;
>     struct ureg_src layer;
>     struct ureg_src const0;
> +   struct ureg_src const1;
>     struct ureg_dst temp0;
>
>     have_layer =
> @@ -407,6 +409,7 @@ create_fs(struct st_context *st, bool download, enum pipe_texture_target target)
>                                         TGSI_INTERPOLATE_CONSTANT);
>     }
>     const0  = ureg_DECL_constant(ureg, 0);
> +   const1  = ureg_DECL_constant(ureg, 1);
>     temp0   = ureg_DECL_temporary(ureg);
>
>     /* Note: const0 = [ -xoffset + skip_pixels, -yoffset, stride, image_height ] */
> @@ -456,11 +459,19 @@ create_fs(struct st_context *st, bool download, enum pipe_texture_target target)
>        ureg_MOV(ureg, ureg_writemask(temp1, TGSI_WRITEMASK_ZW), ureg_imm1u(ureg, 0));
>
>        if (have_layer) {
> +         struct ureg_dst temp1_layer =
> +            ureg_writemask(temp1, target == PIPE_TEXTURE_1D_ARRAY ? TGSI_WRITEMASK_Y
> +                                                                  : TGSI_WRITEMASK_Z);
> +
>           /* temp1.y/z = layer */
> -         ureg_MOV(ureg, ureg_writemask(temp1,
> -                                       target == PIPE_TEXTURE_1D_ARRAY ? TGSI_WRITEMASK_Y
> -                                                                       : TGSI_WRITEMASK_Z),
> -                        ureg_scalar(layer, TGSI_SWIZZLE_X));
> +         ureg_MOV(ureg, temp1_layer, ureg_scalar(layer, TGSI_SWIZZLE_X));
> +
> +         if (target == PIPE_TEXTURE_3D) {
> +            /* temp1.y/z += layer_offset */

Y isn't written to here, so: /* temp1.z += layer_offset */

Marek


More information about the mesa-dev mailing list