nv50: create textures with nouveau_bo, for flexibility with tiling later
[mesa.git] / src / gallium / drivers / nv50 / nv50_surface.c
index f2dd2eb30bef112cbbac6fcd578e53ec53581ab9..8db3b6d344dd804ba0ff73926b3b0fd7cb4a6e24 100644 (file)
@@ -51,26 +51,23 @@ nv50_format(enum pipe_format format)
 static int
 nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
 {
-       struct nouveau_channel *chan = screen->nvws->channel;
+       struct nv50_miptree *mt = nv50_miptree(ps->texture);
+       struct nouveau_channel *chan = screen->eng2d->channel;
        struct nouveau_grobj *eng2d = screen->eng2d;
-       struct nouveau_bo *bo;
+       struct nouveau_bo *bo = nv50_miptree(ps->texture)->bo;
        int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
        int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
-       bo = screen->nvws->get_bo(nv50_miptree(ps->texture)->buffer);
-       if (!bo)
-               return 1;
 
        format = nv50_format(ps->format);
        if (format < 0)
                return 1;
   
-       if (!bo->tiled) {
+       if (!bo->tile_flags) {
                BEGIN_RING(chan, eng2d, mthd, 2);
                OUT_RING  (chan, format);
                OUT_RING  (chan, 1);
                BEGIN_RING(chan, eng2d, mthd + 0x14, 5);
-               OUT_RING  (chan, ps->stride);
+               OUT_RING  (chan, mt->level[0].pitch);
                OUT_RING  (chan, ps->width);
                OUT_RING  (chan, ps->height);
                OUT_RELOCh(chan, bo, ps->offset, flags);
@@ -79,7 +76,7 @@ nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
                BEGIN_RING(chan, eng2d, mthd, 5);
                OUT_RING  (chan, format);
                OUT_RING  (chan, 0);
-               OUT_RING  (chan, 0);
+               OUT_RING  (chan, bo->tile_mode << 4);
                OUT_RING  (chan, 1);
                OUT_RING  (chan, 0);
                BEGIN_RING(chan, eng2d, mthd + 0x18, 4);
@@ -107,7 +104,7 @@ nv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst,
                     int dx, int dy, struct pipe_surface *src, int sx, int sy,
                     int w, int h)
 {
-       struct nouveau_channel *chan = screen->nvws->channel;
+       struct nouveau_channel *chan = screen->eng2d->channel;
        struct nouveau_grobj *eng2d = screen->eng2d;
        int ret;
 
@@ -143,7 +140,7 @@ nv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst,
 }
 
 static void
-nv50_surface_copy(struct pipe_context *pipe, boolean flip,
+nv50_surface_copy(struct pipe_context *pipe,
                  struct pipe_surface *dest, unsigned destx, unsigned desty,
                  struct pipe_surface *src, unsigned srcx, unsigned srcy,
                  unsigned width, unsigned height)
@@ -153,16 +150,8 @@ nv50_surface_copy(struct pipe_context *pipe, boolean flip,
 
        assert(src->format == dest->format);
 
-       if (flip) {
-               desty += height;
-               while (height--) {
-                       nv50_surface_do_copy(screen, dest, destx, desty--, src,
-                                            srcx, srcy++, width, 1);
-               }
-       } else {
-               nv50_surface_do_copy(screen, dest, destx, desty, src, srcx,
+       nv50_surface_do_copy(screen, dest, destx, desty, src, srcx,
                                     srcy, width, height);
-       }
 }
 
 static void
@@ -172,7 +161,7 @@ nv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
 {
        struct nv50_context *nv50 = (struct nv50_context *)pipe;
        struct nv50_screen *screen = nv50->screen;
-       struct nouveau_channel *chan = screen->nvws->channel;
+       struct nouveau_channel *chan = screen->eng2d->channel;
        struct nouveau_grobj *eng2d = screen->eng2d;
        int format, ret;
 
@@ -197,23 +186,6 @@ nv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
        OUT_RING  (chan, height);
 }
 
-static void *
-nv50_surface_map(struct pipe_screen *screen, struct pipe_surface *ps,
-                unsigned flags )
-{
-       struct pipe_winsys *ws = screen->winsys;
-
-       return ws->buffer_map(ws, nv50_surface_buffer(ps), flags);
-}
-
-static void
-nv50_surface_unmap(struct pipe_screen *pscreen, struct pipe_surface *ps)
-{
-       struct pipe_winsys *ws = pscreen->winsys;
-
-       ws->buffer_unmap(ws, nv50_surface_buffer(ps));
-}
-
 void
 nv50_init_surface_functions(struct nv50_context *nv50)
 {
@@ -221,10 +193,4 @@ nv50_init_surface_functions(struct nv50_context *nv50)
        nv50->pipe.surface_fill = nv50_surface_fill;
 }
 
-void
-nv50_surface_init_screen_functions(struct pipe_screen *pscreen)
-{
-       pscreen->surface_map = nv50_surface_map;
-       pscreen->surface_unmap = nv50_surface_unmap;
-}