nv50: fix occlusion queries
[mesa.git] / src / gallium / drivers / nouveau / nouveau_stateobj.h
index 439c7e4734ad3514bfa15576921a4548acc1c8a7..029b01e17d519c86312db14d269bb1a0f0fe898d 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __NOUVEAU_STATEOBJ_H__
 #define __NOUVEAU_STATEOBJ_H__
 
-#include "pipe/p_util.h"
+#include "util/u_debug.h"
 
 struct nouveau_stateobj_reloc {
        struct pipe_buffer *bo;
@@ -67,6 +67,14 @@ so_data(struct nouveau_stateobj *so, unsigned data)
        so->cur_packet += 4;
 }
 
+static INLINE void
+so_datap(struct nouveau_stateobj *so, unsigned *data, unsigned size)
+{
+       so->cur_packet += (4 * size);
+       while (size--)
+               (*so->cur++) = (*data++);
+}
+
 static INLINE void
 so_method(struct nouveau_stateobj *so, struct nouveau_grobj *gr,
          unsigned mthd, unsigned size)
@@ -91,6 +99,15 @@ so_reloc(struct nouveau_stateobj *so, struct pipe_buffer *bo,
        so_data(so, data);
 }
 
+static INLINE void
+so_dump(struct nouveau_stateobj *so)
+{
+       unsigned i, nr = so->cur - so->push;
+
+       for (i = 0; i < nr; i++)
+               debug_printf("+0x%04x: 0x%08x\n", i, so->push[i]);
+}
+
 static INLINE void
 so_emit(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
 {
@@ -99,14 +116,14 @@ so_emit(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
 
        nr = so->cur - so->push;
        if (pb->remaining < nr)
-               nvws->push_flush(nvws->channel, nr);
+               nvws->push_flush(nvws, nr, NULL);
        pb->remaining -= nr;
 
        memcpy(pb->cur, so->push, nr * 4);
        for (i = 0; i < so->cur_reloc; i++) {
                struct nouveau_stateobj_reloc *r = &so->reloc[i];
 
-               nvws->push_reloc(nvws->channel, pb->cur + r->offset, r->bo,
+               nvws->push_reloc(nvws, pb->cur + r->offset, r->bo,
                                 r->data, r->flags, r->vor, r->tor);
        }
        pb->cur += nr;
@@ -118,19 +135,23 @@ so_emit_reloc_markers(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
        struct nouveau_pushbuf *pb = nvws->channel->pushbuf;
        unsigned i;
 
+       if (!so)
+               return;
+
        i = so->cur_reloc << 1;
        if (nvws->channel->pushbuf->remaining < i)
-               nvws->push_flush(nvws->channel, i);
+               nvws->push_flush(nvws, i, NULL);
        nvws->channel->pushbuf->remaining -= i;
 
        for (i = 0; i < so->cur_reloc; i++) {
                struct nouveau_stateobj_reloc *r = &so->reloc[i];
 
-               nvws->push_reloc(nvws->channel, pb->cur++, r->bo, r->packet,
-                                (r->flags &
-                                 (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)) |
+               nvws->push_reloc(nvws, pb->cur++, r->bo, r->packet,
+                                (r->flags & (NOUVEAU_BO_VRAM |
+                                             NOUVEAU_BO_GART |
+                                             NOUVEAU_BO_RDWR)) |
                                 NOUVEAU_BO_DUMMY, 0, 0);
-               nvws->push_reloc(nvws->channel, pb->cur++, r->bo, r->data,
+               nvws->push_reloc(nvws, pb->cur++, r->bo, r->data,
                                 r->flags | NOUVEAU_BO_DUMMY, r->vor, r->tor);
        }
 }