nv50: use nouveau_bo for query buffers
authorBen Skeggs <bskeggs@redhat.com>
Fri, 5 Jun 2009 10:45:58 +0000 (20:45 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 5 Jun 2009 12:53:24 +0000 (22:53 +1000)
src/gallium/drivers/nv50/nv50_query.c

index f57540150a853038e72c275597472bd40ecbb6a2..940e04365f255498fc278632aac719e3e984faf5 100644 (file)
@@ -26,7 +26,7 @@
 #include "nv50_context.h"
 
 struct nv50_query {
-       struct pipe_buffer *buffer;
+       struct nouveau_bo *bo;
        unsigned type;
        boolean ready;
        uint64_t result;
@@ -41,14 +41,16 @@ nv50_query(struct pipe_query *pipe)
 static struct pipe_query *
 nv50_query_create(struct pipe_context *pipe, unsigned type)
 {
-       struct pipe_screen *screen = pipe->screen;
+       struct nouveau_device *dev = nouveau_screen(pipe->screen)->device;
        struct nv50_query *q = CALLOC_STRUCT(nv50_query);
+       int ret;
 
        assert (q->type == PIPE_QUERY_OCCLUSION_COUNTER);
        q->type = type;
 
-       q->buffer = screen->buffer_create(screen, 256, 0, 16);
-       if (!q->buffer) {
+       ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 256,
+                            16, &q->bo);
+       if (ret) {
                FREE(q);
                return NULL;
        }
@@ -62,7 +64,7 @@ nv50_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
        struct nv50_query *q = nv50_query(pq);
 
        if (q) {
-               pipe_buffer_reference(&q->buffer, NULL);
+               nouveau_bo_ref(NULL, &q->bo);
                FREE(q);
        }
 }
@@ -90,12 +92,11 @@ nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
        struct nouveau_channel *chan = nv50->screen->base.channel;
        struct nouveau_grobj *tesla = nv50->screen->tesla;
        struct nv50_query *q = nv50_query(pq);
-       struct nouveau_bo *bo = nouveau_bo(q->buffer);
 
        WAIT_RING (chan, 5);
        BEGIN_RING(chan, tesla, 0x1b00, 4);
-       OUT_RELOCh(chan, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
-       OUT_RELOCl(chan, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
+       OUT_RELOCh(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
+       OUT_RELOCl(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
        OUT_RING  (chan, 0x00000000);
        OUT_RING  (chan, 0x0100f002);
        FIRE_RING (chan);
@@ -105,7 +106,6 @@ static boolean
 nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
                  boolean wait, uint64_t *result)
 {
-       struct pipe_screen *pscreen = pipe->screen;
        struct nv50_query *q = nv50_query(pq);
 
        /*XXX: Want to be able to return FALSE here instead of blocking
@@ -113,11 +113,10 @@ nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
         */
 
        if (!q->ready) {
-               uint32_t *map = pipe_buffer_map(pscreen, q->buffer,
-                                               PIPE_BUFFER_USAGE_CPU_READ);
-               q->result = map[1];
+               nouveau_bo_map(q->bo, NOUVEAU_BO_RD);
+               q->result = ((uint32_t *)q->bo->map)[1];
                q->ready = TRUE;
-               pipe_buffer_unmap(pscreen, q->buffer);
+               nouveau_bo_unmap(q->bo);
        }
 
        *result = q->result;