diff options
author | Nicolai Hähnle <[email protected]> | 2016-05-17 23:45:24 -0500 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-06-01 22:37:43 +0200 |
commit | 1cb4be94ae1b0ba83a941e707e962110c44b3f1a (patch) | |
tree | 91877b0169740285a472a5783dbc329883442c5e | |
parent | 2bf6dfac8a090fb4a97441cfacdb78b141a3de3a (diff) |
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 <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r-- | src/mesa/state_tracker/st_pbo.c | 19 | ||||
-rw-r--r-- | 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 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; }; |