nv50,nvc0: fix 3d engine blit for nvc0
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 30 Sep 2012 20:59:34 +0000 (22:59 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 30 Sep 2012 21:09:29 +0000 (23:09 +0200)
src/gallium/drivers/nv50/nv50_surface.c
src/gallium/drivers/nvc0/nvc0_surface.c

index e64a2badd7785361f833efc4817048cff9f39fd0..f315a235aef0bb9a09c0df707da4509b70bffd3b 100644 (file)
@@ -483,6 +483,7 @@ nv50_blitter_make_vp(struct nv50_blitter *blit)
    blit->vp.out[1].hw = 2;
    blit->vp.out[1].mask = 0x7;
    blit->vp.out[1].sn = TGSI_SEMANTIC_GENERIC;
+   blit->vp.out[1].si = 8;
    blit->vp.vp.attrs[0] = 0x73;
    blit->vp.vp.psiz = 0x40;
    blit->vp.vp.edgeflag = 0x40;
@@ -524,8 +525,9 @@ nv50_blitter_make_fp(struct pipe_context *pipe,
       return NULL;
 
    out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
+   /* NOTE: use GENERIC[8] so we don't use the TEXCOORD slots on nvc0 */
    tc = ureg_DECL_fs_input(
-      ureg, TGSI_SEMANTIC_GENERIC, 0, TGSI_INTERPOLATE_LINEAR);
+      ureg, TGSI_SEMANTIC_GENERIC, 8, TGSI_INTERPOLATE_LINEAR);
 
    data = ureg_DECL_temporary(ureg);
 
index dcf008537ec714a7810f8fcdf653d70c906d6d40..4f79020518e3567c018b51c0c220da12aac7c7e1 100644 (file)
@@ -618,7 +618,7 @@ nvc0_blit_set_src(struct nvc0_blitctx *ctx,
          (res->target == PIPE_TEXTURE_3D ? res->depth0 : res->array_size) - 1;
    }
 
-   flags = NV50_TEXVIEW_SCALED_COORDS;
+   flags = res->last_level ? 0 : NV50_TEXVIEW_SCALED_COORDS;
    if (filter && res->nr_samples == 8)
       flags |= NV50_TEXVIEW_FILTER_MSAA8;
 
@@ -826,8 +826,8 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
    x0 = (float)info->src.box.x - x_range * (float)info->dst.box.x;
    y0 = (float)info->src.box.y - y_range * (float)info->dst.box.y;
 
-   x1 = info->src.box.x + 16384.0f * x_range;
-   y1 = info->src.box.y + 16384.0f * y_range;
+   x1 = x0 + 16384.0f * x_range;
+   y1 = y0 + 16384.0f * y_range;
 
    x0 *= (float)(1 << nv50_miptree(src)->ms_x);
    x1 *= (float)(1 << nv50_miptree(src)->ms_x);
@@ -851,6 +851,9 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
       z += 0.5f * dz;
 
    IMMED_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 0);
+   BEGIN_NVC0(push, NVC0_3D(VIEWPORT_HORIZ(0)), 2);
+   PUSH_DATA (push, nvc0->framebuffer.width << 16);
+   PUSH_DATA (push, nvc0->framebuffer.height << 16);
 
    /* Draw a large triangle in screen coordinates covering the whole
     * render target, with scissors defining the destination region.