From: Nicolai Hähnle Date: Wed, 18 May 2016 04:45:24 +0000 (-0500) Subject: st/mesa: add layer_offset to PBO fragment shader X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1cb4be94ae1b0ba83a941e707e962110c44b3f1a;p=mesa.git st/mesa: add layer_offset to PBO fragment shader This will be used to select a slice of a 3D texture. v2: fix a comment (Marek) Reviewed-by: Brian Paul Reviewed-by: Marek Olšák --- diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index 7c43b9fc61b..f8787148ea6 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -84,6 +84,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; } @@ -371,6 +372,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 = @@ -408,6 +410,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 ] */ @@ -457,11 +460,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.z += layer_offset */ + ureg_UADD(ureg, temp1_layer, + ureg_scalar(ureg_src(temp1), TGSI_SWIZZLE_Z), + ureg_scalar(const1, TGSI_SWIZZLE_X)); + } } /* temp1 = txf(sampler, temp1) */ diff --git a/src/mesa/state_tracker/st_pbo.h b/src/mesa/state_tracker/st_pbo.h index c17ac1702e3..14ae6ba23e6 100644 --- a/src/mesa/state_tracker/st_pbo.h +++ b/src/mesa/state_tracker/st_pbo.h @@ -54,6 +54,7 @@ struct st_pbo_addresses { int32_t yoffset; int32_t stride; int32_t image_size; + int32_t layer_offset; } constants; };