nv50,nvc0: fix 3d blits with mipmap levels
Make sure to normalize the z coordinates as well as the x/y ones when there are mipmaps present. Fixes 3d mipmap generation, which now uses the blit path. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: "10.2" <mesa-stable@lists.freedesktop.org> Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -1142,6 +1142,12 @@ nv50_blit_3d(struct nv50_context *nv50, const struct pipe_blit_info *info)
|
||||
y0 *= (float)(1 << nv50_miptree(src)->ms_y);
|
||||
y1 *= (float)(1 << nv50_miptree(src)->ms_y);
|
||||
|
||||
/* XXX: multiply by 6 for cube arrays ? */
|
||||
dz = (float)info->src.box.depth / (float)info->dst.box.depth;
|
||||
z = (float)info->src.box.z;
|
||||
if (nv50_miptree(src)->layout_3d)
|
||||
z += 0.5f * dz;
|
||||
|
||||
if (src->last_level > 0) {
|
||||
/* If there are mip maps, GPU always assumes normalized coordinates. */
|
||||
const unsigned l = info->src.level;
|
||||
@@ -1151,14 +1157,12 @@ nv50_blit_3d(struct nv50_context *nv50, const struct pipe_blit_info *info)
|
||||
x1 /= fh;
|
||||
y0 /= fv;
|
||||
y1 /= fv;
|
||||
if (nv50_miptree(src)->layout_3d) {
|
||||
z /= u_minify(src->depth0, l);
|
||||
dz /= u_minify(src->depth0, l);
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX: multiply by 6 for cube arrays ? */
|
||||
dz = (float)info->src.box.depth / (float)info->dst.box.depth;
|
||||
z = (float)info->src.box.z;
|
||||
if (nv50_miptree(src)->layout_3d)
|
||||
z += 0.5f * dz;
|
||||
|
||||
BEGIN_NV04(push, NV50_3D(VIEWPORT_TRANSFORM_EN), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
BEGIN_NV04(push, NV50_3D(VIEW_VOLUME_CLIP_CTRL), 1);
|
||||
|
||||
@@ -913,6 +913,11 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
|
||||
y0 *= (float)(1 << nv50_miptree(src)->ms_y);
|
||||
y1 *= (float)(1 << nv50_miptree(src)->ms_y);
|
||||
|
||||
dz = (float)info->src.box.depth / (float)info->dst.box.depth;
|
||||
z = (float)info->src.box.z;
|
||||
if (nv50_miptree(src)->layout_3d)
|
||||
z += 0.5f * dz;
|
||||
|
||||
if (src->last_level > 0) {
|
||||
/* If there are mip maps, GPU always assumes normalized coordinates. */
|
||||
const unsigned l = info->src.level;
|
||||
@@ -922,13 +927,12 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
|
||||
x1 /= fh;
|
||||
y0 /= fv;
|
||||
y1 /= fv;
|
||||
if (nv50_miptree(src)->layout_3d) {
|
||||
z /= u_minify(src->depth0, l);
|
||||
dz /= u_minify(src->depth0, l);
|
||||
}
|
||||
}
|
||||
|
||||
dz = (float)info->src.box.depth / (float)info->dst.box.depth;
|
||||
z = (float)info->src.box.z;
|
||||
if (nv50_miptree(src)->layout_3d)
|
||||
z += 0.5f * dz;
|
||||
|
||||
IMMED_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 0);
|
||||
IMMED_NVC0(push, NVC0_3D(VIEW_VOLUME_CLIP_CTRL), 0x2 |
|
||||
NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_RANGE_0_1);
|
||||
|
||||
Reference in New Issue
Block a user