mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-14 14:28:08 +02:00
svga: use new adjust_z_layer() helper in svga_pipe_blit.c
To handle z/layer fix-ups for blitting and copying. Note that we weren't doing this properly in svga_blit() before. Also, remove redundant stex, dtex assignments. Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
parent
c42000545d
commit
14639cdf8f
1 changed files with 28 additions and 44 deletions
|
|
@ -86,6 +86,28 @@ copy_region_vgpu10(struct svga_context *svga, struct pipe_resource *src_tex,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For some texture types, we need to move the z (slice) coordinate
|
||||||
|
* to the layer value. For example, to select the z=3 slice of a 2D ARRAY
|
||||||
|
* texture, we need to use layer=3 and set z=0.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
adjust_z_layer(enum pipe_texture_target target,
|
||||||
|
int z_in, unsigned *layer_out, unsigned *z_out)
|
||||||
|
{
|
||||||
|
if (target == PIPE_TEXTURE_CUBE ||
|
||||||
|
target == PIPE_TEXTURE_2D_ARRAY ||
|
||||||
|
target == PIPE_TEXTURE_1D_ARRAY) {
|
||||||
|
*layer_out = z_in;
|
||||||
|
*z_out = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*layer_out = 0;
|
||||||
|
*z_out = z_in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
svga_resource_copy_region(struct pipe_context *pipe,
|
svga_resource_copy_region(struct pipe_context *pipe,
|
||||||
struct pipe_resource *dst_tex,
|
struct pipe_resource *dst_tex,
|
||||||
|
|
@ -136,32 +158,8 @@ svga_resource_copy_region(struct pipe_context *pipe,
|
||||||
stex = svga_texture(src_tex);
|
stex = svga_texture(src_tex);
|
||||||
dtex = svga_texture(dst_tex);
|
dtex = svga_texture(dst_tex);
|
||||||
|
|
||||||
if (src_tex->target == PIPE_TEXTURE_CUBE ||
|
adjust_z_layer(src_tex->target, src_box->z, &src_face_layer, &src_z);
|
||||||
src_tex->target == PIPE_TEXTURE_2D_ARRAY ||
|
adjust_z_layer(dst_tex->target, dstz, &dst_face_layer, &dst_z);
|
||||||
src_tex->target == PIPE_TEXTURE_1D_ARRAY) {
|
|
||||||
src_face_layer = src_box->z;
|
|
||||||
src_z = 0;
|
|
||||||
assert(src_box->depth == 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
src_face_layer = 0;
|
|
||||||
src_z = src_box->z;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dst_tex->target == PIPE_TEXTURE_CUBE ||
|
|
||||||
dst_tex->target == PIPE_TEXTURE_2D_ARRAY ||
|
|
||||||
dst_tex->target == PIPE_TEXTURE_1D_ARRAY) {
|
|
||||||
dst_face_layer = dstz;
|
|
||||||
dst_z = 0;
|
|
||||||
assert(src_box->depth == 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dst_face_layer = 0;
|
|
||||||
dst_z = dstz;
|
|
||||||
}
|
|
||||||
|
|
||||||
stex = svga_texture(src_tex);
|
|
||||||
dtex = svga_texture(dst_tex);
|
|
||||||
|
|
||||||
if (svga_have_vgpu10(svga)) {
|
if (svga_have_vgpu10(svga)) {
|
||||||
/* vgpu10 */
|
/* vgpu10 */
|
||||||
|
|
@ -295,25 +293,11 @@ svga_blit(struct pipe_context *pipe,
|
||||||
if (can_blit_via_copy_region_vgpu10(svga, blit_info)) {
|
if (can_blit_via_copy_region_vgpu10(svga, blit_info)) {
|
||||||
unsigned src_face, src_z, dst_face, dst_z;
|
unsigned src_face, src_z, dst_face, dst_z;
|
||||||
|
|
||||||
if (blit.src.resource->target == PIPE_TEXTURE_CUBE) {
|
adjust_z_layer(blit.src.resource->target, blit.src.box.z,
|
||||||
src_face = blit.src.box.z;
|
&src_face, &src_z);
|
||||||
src_z = 0;
|
|
||||||
assert(blit.src.box.depth == 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
src_face = 0;
|
|
||||||
src_z = blit.src.box.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blit.dst.resource->target == PIPE_TEXTURE_CUBE) {
|
adjust_z_layer(blit.dst.resource->target, blit.dst.box.z,
|
||||||
dst_face = blit.dst.box.z;
|
&dst_face, &dst_z);
|
||||||
dst_z = 0;
|
|
||||||
assert(blit.src.box.depth == 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dst_face = 0;
|
|
||||||
dst_z = blit.dst.box.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_region_vgpu10(svga,
|
copy_region_vgpu10(svga,
|
||||||
blit.src.resource,
|
blit.src.resource,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue