trace: Use u_time.
[mesa.git] / src / gallium / drivers / nv50 / nv50_surface.c
index 0cc5168144d644923ed6e3da7978e5e7135206ab..ac0c1d02703f419395b9b59c4a4cc90481cac335 100644 (file)
@@ -25,8 +25,8 @@
 #include "nouveau/nouveau_pushbuf.h"
 #include "nv50_context.h"
 #include "pipe/p_defines.h"
-#include "pipe/internal/p_winsys_screen.h"
-#include "pipe/p_inlines.h"
+#include "util/u_simple_screen.h"
+#include "util/u_inlines.h"
 
 #include "util/u_tile.h"
 
@@ -35,14 +35,13 @@ nv50_format(enum pipe_format format)
 {
        switch (format) {
        case PIPE_FORMAT_A8R8G8B8_UNORM:
-       case PIPE_FORMAT_Z24S8_UNORM:
-               return NV50_2D_DST_FORMAT_32BPP;
+               return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
        case PIPE_FORMAT_X8R8G8B8_UNORM:
-               return NV50_2D_DST_FORMAT_24BPP;
+               return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
        case PIPE_FORMAT_R5G6B5_UNORM:
-               return NV50_2D_DST_FORMAT_16BPP;
+               return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
        case PIPE_FORMAT_A8_UNORM:
-               return NV50_2D_DST_FORMAT_8BPP;
+               return NV50_2D_DST_FORMAT_R8_UNORM;
        default:
                return -1;
        }
@@ -52,35 +51,33 @@ static int
 nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
 {
        struct nv50_miptree *mt = nv50_miptree(ps->texture);
-       struct nouveau_channel *chan = screen->nvws->channel;
+       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)->base.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) {
+               MARK_RING (chan, 9, 2); /* flush on lack of space or relocs */
                BEGIN_RING(chan, eng2d, mthd, 2);
                OUT_RING  (chan, format);
                OUT_RING  (chan, 1);
                BEGIN_RING(chan, eng2d, mthd + 0x14, 5);
-               OUT_RING  (chan, mt->level[0].pitch);
+               OUT_RING  (chan, mt->level[ps->level].pitch);
                OUT_RING  (chan, ps->width);
                OUT_RING  (chan, ps->height);
                OUT_RELOCh(chan, bo, ps->offset, flags);
                OUT_RELOCl(chan, bo, ps->offset, flags);
        } else {
+               MARK_RING (chan, 11, 2); /* flush on lack of space or relocs */
                BEGIN_RING(chan, eng2d, mthd, 5);
                OUT_RING  (chan, format);
                OUT_RING  (chan, 0);
-               OUT_RING  (chan, 0);
+               OUT_RING  (chan, mt->level[ps->level].tile_mode << 4);
                OUT_RING  (chan, 1);
                OUT_RING  (chan, 0);
                BEGIN_RING(chan, eng2d, mthd + 0x18, 4);
@@ -108,7 +105,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;
 
@@ -149,7 +146,7 @@ nv50_surface_copy(struct pipe_context *pipe,
                  struct pipe_surface *src, unsigned srcx, unsigned srcy,
                  unsigned width, unsigned height)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
+       struct nv50_context *nv50 = nv50_context(pipe);
        struct nv50_screen *screen = nv50->screen;
 
        assert(src->format == dest->format);
@@ -163,9 +160,9 @@ nv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
                  unsigned destx, unsigned desty, unsigned width,
                  unsigned height, unsigned value)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
+       struct nv50_context *nv50 = 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;
 
@@ -179,11 +176,11 @@ nv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
        if (ret)
                return;
 
-       BEGIN_RING(chan, eng2d, 0x0580, 3);
-       OUT_RING  (chan, 4);
+       BEGIN_RING(chan, eng2d, NV50_2D_DRAW_SHAPE, 3);
+       OUT_RING  (chan, NV50_2D_DRAW_SHAPE_RECTANGLES);
        OUT_RING  (chan, format);
        OUT_RING  (chan, value);
-       BEGIN_RING(chan, eng2d, NV50_2D_RECT_X1, 4);
+       BEGIN_RING(chan, eng2d, NV50_2D_DRAW_POINT32_X(0), 4);
        OUT_RING  (chan, destx);
        OUT_RING  (chan, desty);
        OUT_RING  (chan, width);