nv50,nvc0: take level into account when doing eng2d multi-layer blits
This fixes arb_get_texture_sub_image-get, and any situation where the 2d engine was being used for multi-layer blits to a non-0 level. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: "10.6" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -1387,18 +1387,24 @@ nv50_blit_eng2d(struct nv50_context *nv50, const struct pipe_blit_info *info)
|
||||
PUSH_DATA (push, info->dst.box.z + i);
|
||||
} else {
|
||||
const unsigned z = info->dst.box.z + i;
|
||||
const uint64_t address = dst->base.address +
|
||||
dst->level[info->dst.level].offset +
|
||||
z * dst->layer_stride;
|
||||
BEGIN_NV04(push, NV50_2D(DST_ADDRESS_HIGH), 2);
|
||||
PUSH_DATAh(push, dst->base.address + z * dst->layer_stride);
|
||||
PUSH_DATA (push, dst->base.address + z * dst->layer_stride);
|
||||
PUSH_DATAh(push, address);
|
||||
PUSH_DATA (push, address);
|
||||
}
|
||||
if (src->layout_3d) {
|
||||
/* not possible because of depth tiling */
|
||||
assert(0);
|
||||
} else {
|
||||
const unsigned z = info->src.box.z + i;
|
||||
const uint64_t address = src->base.address +
|
||||
src->level[info->src.level].offset +
|
||||
z * src->layer_stride;
|
||||
BEGIN_NV04(push, NV50_2D(SRC_ADDRESS_HIGH), 2);
|
||||
PUSH_DATAh(push, src->base.address + z * src->layer_stride);
|
||||
PUSH_DATA (push, src->base.address + z * src->layer_stride);
|
||||
PUSH_DATAh(push, address);
|
||||
PUSH_DATA (push, address);
|
||||
}
|
||||
BEGIN_NV04(push, NV50_2D(BLIT_SRC_Y_INT), 1); /* trigger */
|
||||
PUSH_DATA (push, srcy >> 32);
|
||||
|
||||
@@ -1336,18 +1336,24 @@ nvc0_blit_eng2d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
|
||||
PUSH_DATA (push, info->dst.box.z + i);
|
||||
} else {
|
||||
const unsigned z = info->dst.box.z + i;
|
||||
const uint64_t address = dst->base.address +
|
||||
dst->level[info->dst.level].offset +
|
||||
z * dst->layer_stride;
|
||||
BEGIN_NVC0(push, NVC0_2D(DST_ADDRESS_HIGH), 2);
|
||||
PUSH_DATAh(push, dst->base.address + z * dst->layer_stride);
|
||||
PUSH_DATA (push, dst->base.address + z * dst->layer_stride);
|
||||
PUSH_DATAh(push, address);
|
||||
PUSH_DATA (push, address);
|
||||
}
|
||||
if (src->layout_3d) {
|
||||
/* not possible because of depth tiling */
|
||||
assert(0);
|
||||
} else {
|
||||
const unsigned z = info->src.box.z + i;
|
||||
const uint64_t address = src->base.address +
|
||||
src->level[info->src.level].offset +
|
||||
z * src->layer_stride;
|
||||
BEGIN_NVC0(push, NVC0_2D(SRC_ADDRESS_HIGH), 2);
|
||||
PUSH_DATAh(push, src->base.address + z * src->layer_stride);
|
||||
PUSH_DATA (push, src->base.address + z * src->layer_stride);
|
||||
PUSH_DATAh(push, address);
|
||||
PUSH_DATA (push, address);
|
||||
}
|
||||
BEGIN_NVC0(push, NVC0_2D(BLIT_SRC_Y_INT), 1); /* trigger */
|
||||
PUSH_DATA (push, srcy >> 32);
|
||||
|
||||
Reference in New Issue
Block a user