[Mesa-dev] [PATCH mesa v2 1/2] nv30: Fix color resolving for nv3x cards
Ilia Mirkin
imirkin at alum.mit.edu
Wed Sep 9 09:14:42 PDT 2015
On Wed, Sep 9, 2015 at 9:52 AM, Hans de Goede <hdegoede at redhat.com> wrote:
> We do not have a generic blitter on nv3x cards, so we must use the
> sifm object for color resolving.
>
> This commit divides the sources and dest surfaces in to tiles which
> match the constraints of the sifm object, so that color resolving
> will work properly on nv3x cards.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> Changes in v2:
> -Use 1024x1024 blocks
> -Use the sifm on both nv3x and nv4x cards instead of only on nv3x cards
Thanks, pushed.
> ---
> src/gallium/drivers/nouveau/nv30/nv30_miptree.c | 38 ++++++++++++++++++++++++-
> 1 file changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
> index 76bb8b8..735c718 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_miptree.c
> @@ -149,14 +149,50 @@ static void
> nv30_resource_resolve(struct nv30_context *nv30,
> const struct pipe_blit_info *info)
> {
> + struct nv30_miptree *src_mt = nv30_miptree(info->src.resource);
> struct nv30_rect src, dst;
> + unsigned x, x0, x1, y, y1, w, h;
>
> define_rect(info->src.resource, 0, info->src.box.z, info->src.box.x,
> info->src.box.y, info->src.box.width, info->src.box.height, &src);
> define_rect(info->dst.resource, 0, info->dst.box.z, info->dst.box.x,
> info->dst.box.y, info->dst.box.width, info->dst.box.height, &dst);
>
> - nv30_transfer_rect(nv30, BILINEAR, &src, &dst);
> + x0 = src.x0;
> + x1 = src.x1;
> + y1 = src.y1;
> +
> + /* On nv3x we must use sifm which is restricted to 1024x1024 tiles */
> + for (y = src.y0; y < y1; y += h) {
> + h = y1 - y;
> + if (h > 1024)
> + h = 1024;
> +
> + src.y0 = 0;
> + src.y1 = h;
> + src.h = h;
> +
> + dst.y1 = dst.y0 + (h >> src_mt->ms_y);
> + dst.h = h >> src_mt->ms_y;
> +
> + for (x = x0; x < x1; x += w) {
> + w = x1 - x;
> + if (w > 1024)
> + w = 1024;
> +
> + src.offset = y * src.pitch + x * src.cpp;
> + src.x0 = 0;
> + src.x1 = w;
> + src.w = w;
> +
> + dst.offset = (y >> src_mt->ms_y) * dst.pitch +
> + (x >> src_mt->ms_x) * dst.cpp;
> + dst.x1 = dst.x0 + (w >> src_mt->ms_x);
> + dst.w = w >> src_mt->ms_x;
> +
> + nv30_transfer_rect(nv30, BILINEAR, &src, &dst);
> + }
> + }
> }
>
> void
> --
> 2.4.3
>
More information about the mesa-dev
mailing list