nouveau: call notifier/grobj etc funcs directly
authorBen Skeggs <bskeggs@redhat.com>
Thu, 4 Jun 2009 22:47:42 +0000 (08:47 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 5 Jun 2009 04:37:03 +0000 (14:37 +1000)
libdrm_nouveau is linked with the winsys, there's no good reason to do all
this through yet another layer.

15 files changed:
src/gallium/drivers/nouveau/nouveau_screen.h
src/gallium/drivers/nouveau/nouveau_winsys.h
src/gallium/drivers/nv04/nv04_screen.c
src/gallium/drivers/nv04/nv04_surface_2d.c
src/gallium/drivers/nv10/nv10_screen.c
src/gallium/drivers/nv20/nv20_screen.c
src/gallium/drivers/nv30/nv30_query.c
src/gallium/drivers/nv30/nv30_screen.c
src/gallium/drivers/nv30/nv30_vertprog.c
src/gallium/drivers/nv40/nv40_query.c
src/gallium/drivers/nv40/nv40_screen.c
src/gallium/drivers/nv40/nv40_vertprog.c
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/winsys/drm/nouveau/drm/nouveau_winsys.c

index cffba11762dcfb3fb952d9da3dd9d556346b523b..9968b07896606c6134b8639faf4337da2f10df78 100644 (file)
@@ -4,6 +4,7 @@
 struct nouveau_screen {
        struct pipe_screen base;
        struct nouveau_device *device;
+       struct nouveau_channel *channel;
 };
 
 static inline struct nouveau_screen *
index 762c3a2a218e9b5c3ba9074d77f58a60cf29c968..79984972404a70c0e9386cf68459bc2f2d9cb47b 100644 (file)
@@ -27,33 +27,6 @@ struct nouveau_winsys {
        struct pipe_winsys *ws;
 
        struct nouveau_channel *channel;
-
-       int  (*res_init)(struct nouveau_resource **heap, unsigned start,
-                        unsigned size);
-       int  (*res_alloc)(struct nouveau_resource *heap, int size, void *priv,
-                         struct nouveau_resource **);
-       void (*res_free)(struct nouveau_resource **);
-
-       int       (*grobj_alloc)(struct nouveau_winsys *, int grclass,
-                                struct nouveau_grobj **);
-       void      (*grobj_free)(struct nouveau_grobj **);
-
-       int       (*notifier_alloc)(struct nouveau_winsys *, int count,
-                                   struct nouveau_notifier **);
-       void      (*notifier_free)(struct nouveau_notifier **);
-       void      (*notifier_reset)(struct nouveau_notifier *, int id);
-       uint32_t  (*notifier_status)(struct nouveau_notifier *, int id);
-       uint32_t  (*notifier_retval)(struct nouveau_notifier *, int id);
-       int       (*notifier_wait)(struct nouveau_notifier *, int id,
-                                  int status, double timeout);
-
-       int (*surface_copy)(struct nouveau_winsys *, struct pipe_surface *,
-                           unsigned, unsigned, struct pipe_surface *,
-                           unsigned, unsigned, unsigned, unsigned);
-       int (*surface_fill)(struct nouveau_winsys *, struct pipe_surface *,
-                           unsigned, unsigned, unsigned, unsigned, unsigned);
-
-       struct nouveau_bo *(*get_bo)(struct pipe_buffer *);
 };
 
 extern struct pipe_screen *
index 308f7e5960ca6b625fb9925e8808acc2bdffb151..98e2dafcd8a1bf6edab227828f01b6cf2503bd74 100644 (file)
@@ -105,10 +105,9 @@ static void
 nv04_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv04_screen *screen = nv04_screen(pscreen);
-       struct nouveau_winsys *nvws = screen->nvws;
 
-       nvws->notifier_free(&screen->sync);
-       nvws->grobj_free(&screen->fahrenheit);
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->fahrenheit);
        nv04_surface_2d_takedown(&screen->eng2d);
 
        FREE(pscreen);
@@ -127,6 +126,7 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv04_screen *screen = CALLOC_STRUCT(nv04_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        unsigned fahrenheit_class = 0, sub3d_class = 0;
        int ret;
@@ -135,6 +135,13 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        pscreen = &screen->base.base;
 
+       ret = nouveau_screen_init(&screen->base, dev);
+       if (ret) {
+               nv04_screen_destroy(pscreen);
+               return NULL;
+       }
+       screen->base.channel = chan = nvws->channel;
+
        screen->nvws = nvws;
 
        pscreen->winsys = ws;
@@ -145,7 +152,6 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        nv04_screen_init_miptree_functions(pscreen);
        nv04_screen_init_transfer_functions(pscreen);
-       nouveau_screen_init(&screen->base, dev);
 
        if (dev->chipset >= 0x20) {
                fahrenheit_class = 0;
@@ -163,26 +169,30 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(nvws);
-       screen->eng2d->buf = nv04_surface_buffer;
-
        /* 3D object */
-       ret = nvws->grobj_alloc(nvws, fahrenheit_class, &screen->fahrenheit);
+       ret = nouveau_grobj_alloc(chan, 0xbeef0001, fahrenheit_class,
+                                 &screen->fahrenheit);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                return NULL;
        }
+       BIND_RING(chan, screen->fahrenheit, 7);
 
        /* 3D surface object */
-       ret = nvws->grobj_alloc(nvws, sub3d_class, &screen->context_surfaces_3d);
+       ret = nouveau_grobj_alloc(chan, 0xbeef0002, sub3d_class,
+                                 &screen->context_surfaces_3d);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D surface object: %d\n", ret);
                return NULL;
        }
+       BIND_RING(chan, screen->context_surfaces_3d, 6);
+
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv04_surface_buffer;
 
        /* Notifier for sync purposes */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv04_screen_destroy(pscreen);
index 2133123582cc152fc380f703b4b6a1801e43064b..fcb6501411e0f807259ef94ac408e508b8771bae 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "nouveau/nouveau_winsys.h"
 #include "nouveau/nouveau_util.h"
+#include "nouveau/nouveau_screen.h"
 #include "nv04_surface_2d.h"
 
 static INLINE int
index 5c36bee6e2b6191c0e1b7f664453305eecc733e3..f090d2b0b74940716ce1cf0a02e2ebbce858ea12 100644 (file)
@@ -102,10 +102,9 @@ static void
 nv10_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv10_screen *screen = nv10_screen(pscreen);
-       struct nouveau_winsys *nvws = screen->nvws;
 
-       nvws->notifier_free(&screen->sync);
-       nvws->grobj_free(&screen->celsius);
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->celsius);
 
        FREE(pscreen);
 }
@@ -123,6 +122,7 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv10_screen *screen = CALLOC_STRUCT(nv10_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        unsigned celsius_class;
        int ret;
@@ -131,6 +131,13 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        pscreen = &screen->base.base;
 
+       ret = nouveau_screen_init(&screen->base, dev);
+       if (ret) {
+               nv10_screen_destroy(pscreen);
+               return NULL;
+       }
+       screen->base.channel = chan = nvws->channel;
+
        screen->nvws = nvws;
 
        pscreen->winsys = ws;
@@ -141,11 +148,6 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        nv10_screen_init_miptree_functions(pscreen);
        nv10_screen_init_transfer_functions(pscreen);
-       nouveau_screen_init(&screen->base, dev);
-
-       /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(nvws);
-       screen->eng2d->buf = nv10_surface_buffer;
 
        /* 3D object */
        if (dev->chipset >= 0x20)
@@ -162,14 +164,20 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       ret = nvws->grobj_alloc(nvws, celsius_class, &screen->celsius);
+       ret = nouveau_grobj_alloc(chan, 0xbeef0001, celsius_class,
+                                 &screen->celsius);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                return FALSE;
        }
+       BIND_RING(chan, screen->celsius, 7);
+
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv10_surface_buffer;
 
        /* Notifier for sync purposes */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv10_screen_destroy(pscreen);
index 6f3d73fe16e10dda684807efab698db13710a682..4d991852a1fb82306da950fd3084f175eabfb35c 100644 (file)
@@ -1,5 +1,4 @@
 #include "pipe/p_screen.h"
-#include "util/u_simple_screen.h"
 
 #include "nv20_context.h"
 #include "nv20_screen.h"
@@ -103,10 +102,9 @@ static void
 nv20_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv20_screen *screen = nv20_screen(pscreen);
-       struct nouveau_winsys *nvws = screen->nvws;
 
-       nvws->notifier_free(&screen->sync);
-       nvws->grobj_free(&screen->kelvin);
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->kelvin);
 
        FREE(pscreen);
 }
@@ -124,6 +122,7 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv20_screen *screen = CALLOC_STRUCT(nv20_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        unsigned kelvin_class = 0;
        int ret;
@@ -132,6 +131,13 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        pscreen = &screen->base.base;
 
+       ret = nouveau_screen_init(&screen->base, dev);
+       if (ret) {
+               nv20_screen_destroy(pscreen);
+               return NULL;
+       }
+       screen->base.channel = chan = nvws->channel;
+
        screen->nvws = nvws;
 
        pscreen->winsys = ws;
@@ -142,11 +148,6 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        nv20_screen_init_miptree_functions(pscreen);
        nv20_screen_init_transfer_functions(pscreen);
-       nouveau_screen_init(&screen->base, dev);
-
-       /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(nvws);
-       screen->eng2d->buf = nv20_surface_buffer;
 
        /* 3D object */
        if (dev->chipset >= 0x25)
@@ -159,14 +160,20 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       ret = nvws->grobj_alloc(nvws, kelvin_class, &screen->kelvin);
+       ret = nouveau_grobj_alloc(chan, 0xbeef0097, kelvin_class,
+                                 &screen->kelvin);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                return FALSE;
        }
+       BIND_RING(chan, screen->kelvin, 7);
+
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv20_surface_buffer;
 
        /* Notifier for sync purposes */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv20_screen_destroy(pscreen);
index 2f974cf5c4047685b635f9a944f6045fb23142de..1d1c8a484e1933da0d78cab6297e01bbce5377a4 100644 (file)
@@ -29,11 +29,10 @@ nv30_query_create(struct pipe_context *pipe, unsigned query_type)
 static void
 nv30_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
 {
-       struct nv30_context *nv30 = nv30_context(pipe);
        struct nv30_query *q = nv30_query(pq);
 
        if (q->object)
-               nv30->nvws->res_free(&q->object);
+               nouveau_resource_free(&q->object);
        FREE(q);
 }
 
@@ -54,9 +53,9 @@ nv30_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
                pipe->get_query_result(pipe, pq, 1, &tmp);
        }
 
-       if (nv30->nvws->res_alloc(nv30->screen->query_heap, 1, NULL, &q->object))
+       if (nouveau_resource_alloc(nv30->screen->query_heap, 1, NULL, &q->object))
                assert(0);
-       nv30->nvws->notifier_reset(nv30->screen->query, q->object->start);
+       nouveau_notifier_reset(nv30->screen->query, q->object->start);
 
        BEGIN_RING(rankine, NV34TCL_QUERY_RESET, 1);
        OUT_RING  (1);
@@ -84,27 +83,27 @@ nv30_query_result(struct pipe_context *pipe, struct pipe_query *pq,
 {
        struct nv30_context *nv30 = nv30_context(pipe);
        struct nv30_query *q = nv30_query(pq);
-       struct nouveau_winsys *nvws = nv30->nvws;
 
        assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
 
        if (!q->ready) {
                unsigned status;
 
-               status = nvws->notifier_status(nv30->screen->query,
-                                              q->object->start);
+               status = nouveau_notifier_status(nv30->screen->query,
+                                                q->object->start);
                if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
                        if (wait == FALSE)
                                return FALSE;
-                       nvws->notifier_wait(nv30->screen->query, q->object->start,
-                                           NV_NOTIFY_STATE_STATUS_COMPLETED,
-                                           0);
+
+                       nouveau_notifier_wait_status(nv30->screen->query,
+                                       q->object->start,
+                                       NV_NOTIFY_STATE_STATUS_COMPLETED, 0);
                }
 
-               q->result = nvws->notifier_retval(nv30->screen->query,
-                                                 q->object->start);
+               q->result = nouveau_notifier_return_val(nv30->screen->query,
+                                                       q->object->start);
                q->ready = TRUE;
-               nvws->res_free(&q->object);
+               nouveau_resource_free(&q->object);
        }
 
        *result = q->result;
index f516038b9ca6b95d263925126d8656deb5ef28e6..60e2f0855d6ff7c170273589ce686e71fe686dca 100644 (file)
@@ -124,14 +124,13 @@ static void
 nv30_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv30_screen *screen = nv30_screen(pscreen);
-       struct nouveau_winsys *nvws = screen->nvws;
 
-       nvws->res_free(&screen->vp_exec_heap);
-       nvws->res_free(&screen->vp_data_heap);
-       nvws->res_free(&screen->query_heap);
-       nvws->notifier_free(&screen->query);
-       nvws->notifier_free(&screen->sync);
-       nvws->grobj_free(&screen->rankine);
+       nouveau_resource_free(&screen->vp_exec_heap);
+       nouveau_resource_free(&screen->vp_data_heap);
+       nouveau_resource_free(&screen->query_heap);
+       nouveau_notifier_free(&screen->query);
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->rankine);
 
        FREE(pscreen);
 }
@@ -141,6 +140,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv30_screen *screen = CALLOC_STRUCT(nv30_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        struct nouveau_stateobj *so;
        unsigned rankine_class = 0;
@@ -150,6 +150,13 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        pscreen = &screen->base.base;
 
+       ret = nouveau_screen_init(&screen->base, dev);
+       if (ret) {
+               nv30_screen_destroy(pscreen);
+               return NULL;
+       }
+       screen->base.channel = chan = nvws->channel;
+
        screen->nvws = nvws;
 
        pscreen->winsys = ws;
@@ -160,11 +167,6 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        nv30_screen_init_miptree_functions(pscreen);
        nv30_screen_init_transfer_functions(pscreen);
-       nouveau_screen_init(&screen->base, dev);
-
-       /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(nvws);
-       screen->eng2d->buf = nv30_surface_buffer;
 
        /* 3D object */
        switch (dev->chipset & 0xf0) {
@@ -187,14 +189,20 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       ret = nvws->grobj_alloc(nvws, rankine_class, &screen->rankine);
+       ret = nouveau_grobj_alloc(chan, 0xbeef3097, rankine_class,
+                                 &screen->rankine);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                return FALSE;
        }
+       BIND_RING(chan, screen->rankine, 7);
+
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv30_surface_buffer;
 
        /* Notifier for sync purposes */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv30_screen_destroy(pscreen);
@@ -202,14 +210,14 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        }
 
        /* Query objects */
-       ret = nvws->notifier_alloc(nvws, 32, &screen->query);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
        if (ret) {
                NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
                nv30_screen_destroy(pscreen);
                return NULL;
        }
 
-       ret = nvws->res_init(&screen->query_heap, 0, 32);
+       ret = nouveau_resource_init(&screen->query_heap, 0, 32);
        if (ret) {
                NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
                nv30_screen_destroy(pscreen);
@@ -217,8 +225,8 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        }
 
        /* Vtxprog resources */
-       if (nvws->res_init(&screen->vp_exec_heap, 0, 256) ||
-           nvws->res_init(&screen->vp_data_heap, 0, 256)) {
+       if (nouveau_resource_init(&screen->vp_exec_heap, 0, 256) ||
+           nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
                nv30_screen_destroy(pscreen);
                return NULL;
        }
@@ -228,23 +236,23 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_method(so, screen->rankine, NV34TCL_DMA_NOTIFY, 1);
        so_data  (so, screen->sync->handle);
        so_method(so, screen->rankine, NV34TCL_DMA_TEXTURE0, 2);
-       so_data  (so, nvws->channel->vram->handle);
-       so_data  (so, nvws->channel->gart->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->gart->handle);
        so_method(so, screen->rankine, NV34TCL_DMA_COLOR1, 1);
-       so_data  (so, nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
        so_method(so, screen->rankine, NV34TCL_DMA_COLOR0, 2);
-       so_data  (so, nvws->channel->vram->handle);
-       so_data  (so, nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->vram->handle);
        so_method(so, screen->rankine, NV34TCL_DMA_VTXBUF0, 2);
-       so_data  (so, nvws->channel->vram->handle);
-       so_data  (so, nvws->channel->gart->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->gart->handle);
 /*     so_method(so, screen->rankine, NV34TCL_DMA_FENCE, 2);
        so_data  (so, 0);
        so_data  (so, screen->query->handle);*/
        so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY7, 1);
-       so_data  (so, nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
        so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY8, 1);
-       so_data  (so, nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
 
        for (i=1; i<8; i++) {
                so_method(so, screen->rankine, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1);
@@ -301,7 +309,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        so_emit(nvws, so);
        so_ref(NULL, &so);
-       nouveau_pushbuf_flush(nvws->channel, 0);
+       nouveau_pushbuf_flush(chan, 0);
 
        return pscreen;
 }
index eaf543b8f791568cbf78a43c3ed796505c1d5feb..aec39aae9c9e99e6f6692daf3cf7a58e09a460d4 100644 (file)
@@ -645,7 +645,6 @@ out_err:
 static boolean
 nv30_vertprog_validate(struct nv30_context *nv30)
 { 
-       struct nouveau_winsys *nvws = nv30->nvws;
        struct pipe_winsys *ws = nv30->pipe.winsys;
        struct nouveau_grobj *rankine = nv30->screen->rankine;
        struct nv30_vertex_program *vp;
@@ -669,15 +668,15 @@ nv30_vertprog_validate(struct nv30_context *nv30)
                struct nouveau_stateobj *so;
                uint vplen = vp->nr_insns;
 
-               if (nvws->res_alloc(heap, vplen, vp, &vp->exec)) {
+               if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec)) {
                        while (heap->next && heap->size < vplen) {
                                struct nv30_vertex_program *evict;
                                
                                evict = heap->next->priv;
-                               nvws->res_free(&evict->exec);
+                               nouveau_resource_free(&evict->exec);
                        }
 
-                       if (nvws->res_alloc(heap, vplen, vp, &vp->exec))
+                       if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec))
                                assert(0);
                }
 
@@ -694,15 +693,16 @@ nv30_vertprog_validate(struct nv30_context *nv30)
        if (vp->nr_consts && !vp->data) {
                struct nouveau_resource *heap = nv30->screen->vp_data_heap;
 
-               if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data)) {
+               if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data)) {
                        while (heap->next && heap->size < vp->nr_consts) {
                                struct nv30_vertex_program *evict;
                                
                                evict = heap->next->priv;
-                               nvws->res_free(&evict->data);
+                               nouveau_resource_free(&evict->data);
                        }
 
-                       if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data))
+                       if (nouveau_resource_alloc(heap, vp->nr_consts, vp,
+                                                  &vp->data))
                                assert(0);
                }
 
@@ -804,8 +804,6 @@ nv30_vertprog_validate(struct nv30_context *nv30)
 void
 nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
 {
-       struct nouveau_winsys *nvws = nv30->screen->nvws;
-
        vp->translated = FALSE;
 
        if (vp->nr_insns) {
@@ -820,9 +818,9 @@ nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
                vp->nr_consts = 0;
        }
 
-       nvws->res_free(&vp->exec);
+       nouveau_resource_free(&vp->exec);
        vp->exec_start = 0;
-       nvws->res_free(&vp->data);
+       nouveau_resource_free(&vp->data);
        vp->data_start = 0;
        vp->data_start_min = 0;
 
index 9b9a43f49dffa5aec0b0d45eaba41b0d1c206ee0..7874aedd428ae61e79c47107a3f9b33b865d5a22 100644 (file)
@@ -29,11 +29,10 @@ nv40_query_create(struct pipe_context *pipe, unsigned query_type)
 static void
 nv40_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
 {
-       struct nv40_context *nv40 = nv40_context(pipe);
        struct nv40_query *q = nv40_query(pq);
 
        if (q->object)
-               nv40->nvws->res_free(&q->object);
+               nouveau_resource_free(&q->object);
        FREE(q);
 }
 
@@ -54,9 +53,9 @@ nv40_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
                pipe->get_query_result(pipe, pq, 1, &tmp);
        }
 
-       if (nv40->nvws->res_alloc(nv40->screen->query_heap, 1, NULL, &q->object))
+       if (nouveau_resource_alloc(nv40->screen->query_heap, 1, NULL, &q->object))
                assert(0);
-       nv40->nvws->notifier_reset(nv40->screen->query, q->object->start);
+       nouveau_notifier_reset(nv40->screen->query, q->object->start);
 
        BEGIN_RING(curie, NV40TCL_QUERY_RESET, 1);
        OUT_RING  (1);
@@ -84,27 +83,27 @@ nv40_query_result(struct pipe_context *pipe, struct pipe_query *pq,
 {
        struct nv40_context *nv40 = nv40_context(pipe);
        struct nv40_query *q = nv40_query(pq);
-       struct nouveau_winsys *nvws = nv40->nvws;
 
        assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
 
        if (!q->ready) {
                unsigned status;
 
-               status = nvws->notifier_status(nv40->screen->query,
-                                              q->object->start);
+               status = nouveau_notifier_status(nv40->screen->query,
+                                                q->object->start);
                if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
                        if (wait == FALSE)
                                return FALSE;
-                       nvws->notifier_wait(nv40->screen->query, q->object->start,
-                                           NV_NOTIFY_STATE_STATUS_COMPLETED,
-                                           0);
+                       nouveau_notifier_wait_status(nv40->screen->query,
+                                             q->object->start,
+                                             NV_NOTIFY_STATE_STATUS_COMPLETED,
+                                             0);
                }
 
-               q->result = nvws->notifier_retval(nv40->screen->query,
-                                                 q->object->start);
+               q->result = nouveau_notifier_return_val(nv40->screen->query,
+                                                       q->object->start);
                q->ready = TRUE;
-               nvws->res_free(&q->object);
+               nouveau_resource_free(&q->object);
        }
 
        *result = q->result;
index 3049bd80317a52f3dd59f749f0aa9bacd0abbc97..2114c93cd93849be1e31cb48c3b32a5d01962280 100644 (file)
@@ -130,14 +130,13 @@ static void
 nv40_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv40_screen *screen = nv40_screen(pscreen);
-       struct nouveau_winsys *nvws = screen->nvws;
 
-       nvws->res_free(&screen->vp_exec_heap);
-       nvws->res_free(&screen->vp_data_heap);
-       nvws->res_free(&screen->query_heap);
-       nvws->notifier_free(&screen->query);
-       nvws->notifier_free(&screen->sync);
-       nvws->grobj_free(&screen->curie);
+       nouveau_resource_free(&screen->vp_exec_heap);
+       nouveau_resource_free(&screen->vp_data_heap);
+       nouveau_resource_free(&screen->query_heap);
+       nouveau_notifier_free(&screen->query);
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->curie);
 
        nouveau_screen_fini(&screen->base);
 
@@ -149,6 +148,7 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv40_screen *screen = CALLOC_STRUCT(nv40_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        struct nouveau_stateobj *so;
        unsigned curie_class = 0;
@@ -158,6 +158,13 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        pscreen = &screen->base.base;
 
+       ret = nouveau_screen_init(&screen->base, dev);
+       if (ret) {
+               nv40_screen_destroy(pscreen);
+               return NULL;
+       }
+       screen->base.channel = chan = nvws->channel;
+
        screen->nvws = nvws;
 
        pscreen->winsys = ws;
@@ -168,11 +175,6 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        nv40_screen_init_miptree_functions(pscreen);
        nv40_screen_init_transfer_functions(pscreen);
-       nouveau_screen_init(&screen->base, dev);
-
-       /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(nvws);
-       screen->eng2d->buf = nv40_surface_buffer;
 
        /* 3D object */
        switch (dev->chipset & 0xf0) {
@@ -194,14 +196,19 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       ret = nvws->grobj_alloc(nvws, curie_class, &screen->curie);
+       ret = nouveau_grobj_alloc(chan, 0xbeef3097, curie_class, &screen->curie);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                return FALSE;
        }
+       BIND_RING(chan, screen->curie, 7);
+
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv40_surface_buffer;
 
        /* Notifier for sync purposes */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv40_screen_destroy(pscreen);
@@ -209,14 +216,14 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        }
 
        /* Query objects */
-       ret = nvws->notifier_alloc(nvws, 32, &screen->query);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
        if (ret) {
                NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
                nv40_screen_destroy(pscreen);
                return NULL;
        }
 
-       ret = nvws->res_init(&screen->query_heap, 0, 32);
+       nouveau_resource_init(&screen->query_heap, 0, 32);
        if (ret) {
                NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
                nv40_screen_destroy(pscreen);
@@ -224,8 +231,8 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        }
 
        /* Vtxprog resources */
-       if (nvws->res_init(&screen->vp_exec_heap, 0, 512) ||
-           nvws->res_init(&screen->vp_data_heap, 0, 256)) {
+       if (nouveau_resource_init(&screen->vp_exec_heap, 0, 512) ||
+           nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
                nv40_screen_destroy(pscreen);
                return NULL;
        }
index 7df9a4d3264a9d14e8613d13ba6fcea44faebaf7..f32d4d690ce5cfbb21905d17fb79b997bbe319ac 100644 (file)
@@ -855,7 +855,6 @@ out_err:
 static boolean
 nv40_vertprog_validate(struct nv40_context *nv40)
 { 
-       struct nouveau_winsys *nvws = nv40->nvws;
        struct pipe_winsys *ws = nv40->pipe.winsys;
        struct nouveau_grobj *curie = nv40->screen->curie;
        struct nv40_vertex_program *vp;
@@ -895,15 +894,15 @@ check_gpu_resources:
                struct nouveau_stateobj *so;
                uint vplen = vp->nr_insns;
 
-               if (nvws->res_alloc(heap, vplen, vp, &vp->exec)) {
+               if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec)) {
                        while (heap->next && heap->size < vplen) {
                                struct nv40_vertex_program *evict;
                                
                                evict = heap->next->priv;
-                               nvws->res_free(&evict->exec);
+                               nouveau_resource_free(&evict->exec);
                        }
 
-                       if (nvws->res_alloc(heap, vplen, vp, &vp->exec))
+                       if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec))
                                assert(0);
                }
 
@@ -925,15 +924,15 @@ check_gpu_resources:
        if (vp->nr_consts && !vp->data) {
                struct nouveau_resource *heap = nv40->screen->vp_data_heap;
 
-               if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data)) {
+               if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data)) {
                        while (heap->next && heap->size < vp->nr_consts) {
                                struct nv40_vertex_program *evict;
                                
                                evict = heap->next->priv;
-                               nvws->res_free(&evict->data);
+                               nouveau_resource_free(&evict->data);
                        }
 
-                       if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data))
+                       if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data))
                                assert(0);
                }
 
@@ -1035,8 +1034,6 @@ check_gpu_resources:
 void
 nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
 {
-       struct nouveau_winsys *nvws = nv40->screen->nvws;
-
        vp->translated = FALSE;
 
        if (vp->nr_insns) {
@@ -1051,9 +1048,9 @@ nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
                vp->nr_consts = 0;
        }
 
-       nvws->res_free(&vp->exec);
+       nouveau_resource_free(&vp->exec);
        vp->exec_start = 0;
-       nvws->res_free(&vp->data);
+       nouveau_resource_free(&vp->data);
        vp->data_start = 0;
        vp->data_start_min = 0;
 
index 1576d4295edd959b5680d7397eca01d4f75512f7..bc853296cb6bb46f83faaf0da97cf03fcf7631c9 100644 (file)
@@ -2241,13 +2241,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
        if (!p->data[0] && p->immd_nr) {
                struct nouveau_resource *heap = nv50->screen->immd_heap[0];
 
-               if (nvws->res_alloc(heap, p->immd_nr, p, &p->data[0])) {
+               if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) {
                        while (heap->next && heap->size < p->immd_nr) {
                                struct nv50_program *evict = heap->next->priv;
-                               nvws->res_free(&evict->data[0]);
+                               nouveau_resource_free(&evict->data[0]);
                        }
 
-                       if (nvws->res_alloc(heap, p->immd_nr, p, &p->data[0]))
+                       if (nouveau_resource_alloc(heap, p->immd_nr, p,
+                                                  &p->data[0]))
                                assert(0);
                }
 
@@ -2260,13 +2261,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
                struct nouveau_resource *heap =
                        nv50->screen->parm_heap[p->type];
 
-               if (nvws->res_alloc(heap, p->param_nr, p, &p->data[1])) {
+               if (nouveau_resource_alloc(heap, p->param_nr, p, &p->data[1])) {
                        while (heap->next && heap->size < p->param_nr) {
                                struct nv50_program *evict = heap->next->priv;
-                               nvws->res_free(&evict->data[1]);
+                               nouveau_resource_free(&evict->data[1]);
                        }
 
-                       if (nvws->res_alloc(heap, p->param_nr, p, &p->data[1]))
+                       if (nouveau_resource_alloc(heap, p->param_nr, p,
+                                                  &p->data[1]))
                                assert(0);
                }
        }
@@ -2472,8 +2474,8 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p)
 
        nouveau_bo_ref(NULL, &p->bo);
 
-       nv50->screen->nvws->res_free(&p->data[0]);
-       nv50->screen->nvws->res_free(&p->data[1]);
+       nouveau_resource_free(&p->data[0]);
+       nouveau_resource_free(&p->data[1]);
 
        p->translated = 0;
 }
index 3b830847ca151ab3af226b77c91c29e4194f60f8..709b7419da2c9c3cb996ef764a7c03acc3de3fb4 100644 (file)
@@ -136,6 +136,10 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
 {
        struct nv50_screen *screen = nv50_screen(pscreen);
 
+       nouveau_notifier_free(&screen->sync);
+       nouveau_grobj_free(&screen->tesla);
+       nouveau_grobj_free(&screen->eng2d);
+       nouveau_grobj_free(&screen->m2mf);
        nouveau_screen_fini(&screen->base);
        FREE(screen);
 }
@@ -145,6 +149,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv50_screen *screen = CALLOC_STRUCT(nv50_screen);
        struct nouveau_device *dev = nvws->channel->device;
+       struct nouveau_channel *chan;
        struct pipe_screen *pscreen;
        struct nouveau_stateobj *so;
        unsigned chipset = dev->chipset;
@@ -160,6 +165,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                nv50_screen_destroy(pscreen);
                return NULL;
        }
+       screen->base.channel = chan = nvws->channel;
 
         /* Setup the pipe */
        screen->nvws = nvws;
@@ -174,20 +180,22 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        nv50_transfer_init_screen_functions(pscreen);
 
        /* DMA engine object */
-       ret = nvws->grobj_alloc(nvws, 0x5039, &screen->m2mf);
+       ret = nouveau_grobj_alloc(chan, 0xbeef5039, 0x5039, &screen->m2mf);
        if (ret) {
                NOUVEAU_ERR("Error creating M2MF object: %d\n", ret);
                nv50_screen_destroy(pscreen);
                return NULL;
        }
+       BIND_RING(chan, screen->m2mf, 1);
 
        /* 2D object */
-       ret = nvws->grobj_alloc(nvws, NV50_2D, &screen->eng2d);
+       ret = nouveau_grobj_alloc(chan, 0xbeef502d, 0x502d, &screen->eng2d);
        if (ret) {
                NOUVEAU_ERR("Error creating 2D object: %d\n", ret);
                nv50_screen_destroy(pscreen);
                return NULL;
        }
+       BIND_RING(chan, screen->eng2d, 2);
 
        /* 3D object */
        switch (chipset & 0xf0) {
@@ -213,15 +221,16 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        }
 
-       ret = nvws->grobj_alloc(nvws, tesla_class, &screen->tesla);
+       ret = nouveau_grobj_alloc(chan, 0xbeef5097, tesla_class, &screen->tesla);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                nv50_screen_destroy(pscreen);
                return NULL;
        }
+       BIND_RING(chan, screen->tesla, 3);
 
        /* Sync notifier */
-       ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+       ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        if (ret) {
                NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
                nv50_screen_destroy(pscreen);
@@ -232,8 +241,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so = so_new(32, 0);
        so_method(so, screen->m2mf, 0x0180, 3);
        so_data  (so, screen->sync->handle);
-       so_data  (so, screen->nvws->channel->vram->handle);
-       so_data  (so, screen->nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->vram->handle);
        so_emit(nvws, so);
        so_ref (NULL, &so);
 
@@ -241,9 +250,9 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so = so_new(64, 0);
        so_method(so, screen->eng2d, NV50_2D_DMA_NOTIFY, 4);
        so_data  (so, screen->sync->handle);
-       so_data  (so, screen->nvws->channel->vram->handle);
-       so_data  (so, screen->nvws->channel->vram->handle);
-       so_data  (so, screen->nvws->channel->vram->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->vram->handle);
+       so_data  (so, chan->vram->handle);
        so_method(so, screen->eng2d, NV50_2D_OPERATION, 1);
        so_data  (so, NV50_2D_OPERATION_SRCCOPY);
        so_method(so, screen->eng2d, 0x0290, 1);
@@ -263,11 +272,11 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_method(so, screen->tesla, NV50TCL_DMA_UNK0(0),
                                     NV50TCL_DMA_UNK0__SIZE);
        for (i = 0; i < NV50TCL_DMA_UNK0__SIZE; i++)
-               so_data(so, nvws->channel->vram->handle);
+               so_data(so, chan->vram->handle);
        so_method(so, screen->tesla, NV50TCL_DMA_UNK1(0),
                                     NV50TCL_DMA_UNK1__SIZE);
        for (i = 0; i < NV50TCL_DMA_UNK1__SIZE; i++)
-               so_data(so, nvws->channel->vram->handle);
+               so_data(so, chan->vram->handle);
        so_method(so, screen->tesla, 0x121c, 1);
        so_data  (so, 1);
 
@@ -295,9 +304,9 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                }
        }
 
-       if (nvws->res_init(&screen->immd_heap[0], 0, 128) ||
-               nvws->res_init(&screen->parm_heap[0], 0, 128) ||
-               nvws->res_init(&screen->parm_heap[1], 0, 128))
+       if (nouveau_resource_init(&screen->immd_heap[0], 0, 128) ||
+               nouveau_resource_init(&screen->parm_heap[0], 0, 128) ||
+               nouveau_resource_init(&screen->parm_heap[1], 0, 128))
        {
                NOUVEAU_ERR("Error initialising constant buffers.\n");
                nv50_screen_destroy(pscreen);
@@ -405,7 +414,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_emit(nvws, so);
        so_ref (so, &screen->static_init);
        so_ref (NULL, &so);
-       nouveau_pushbuf_flush(nvws->channel, 0);
+       nouveau_pushbuf_flush(chan, 0);
 
        return pscreen;
 }
index 2e0148543d0b46b29bfe3e65e3aa5a7124e0b7b1..c03e6ddcae616e85722c467f16457f8061f96e36 100644 (file)
@@ -2,40 +2,6 @@
 
 #include "nouveau_winsys_pipe.h"
 
-static int
-nouveau_pipe_notifier_alloc(struct nouveau_winsys *nvws, int count,
-                           struct nouveau_notifier **notify)
-{
-       struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws);
-
-       return nouveau_notifier_alloc(nvpws->channel, nvpws->next_handle++,
-                                     count, notify);
-}
-
-static int
-nouveau_pipe_grobj_alloc(struct nouveau_winsys *nvws, int grclass,
-                        struct nouveau_grobj **grobj)
-{
-       struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws);
-       struct nouveau_channel *chan = nvpws->channel;
-       int ret;
-
-       ret = nouveau_grobj_alloc(chan, nvpws->next_handle++, grclass, grobj);
-       if (ret)
-               return ret;
-
-       BEGIN_RING(chan, *grobj, 0x0000, 1);
-       OUT_RING  (chan, (*grobj)->handle);
-       (*grobj)->bound = NOUVEAU_GROBJ_BOUND_EXPLICIT;
-       return 0;
-}
-
-static struct nouveau_bo *
-nouveau_pipe_get_bo(struct pipe_buffer *pb)
-{
-       return nouveau_pipe_buffer(pb)->bo;
-}
-
 struct nouveau_winsys *
 nouveau_winsys_new(struct pipe_winsys *ws)
 {
@@ -49,22 +15,6 @@ nouveau_winsys_new(struct pipe_winsys *ws)
        nvws->ws                = ws;
        nvws->channel           = nvpws->channel;
 
-       nvws->res_init          = nouveau_resource_init;
-       nvws->res_alloc         = nouveau_resource_alloc;
-       nvws->res_free          = nouveau_resource_free;
-
-       nvws->grobj_alloc       = nouveau_pipe_grobj_alloc;
-       nvws->grobj_free        = nouveau_grobj_free;
-
-       nvws->notifier_alloc    = nouveau_pipe_notifier_alloc;
-       nvws->notifier_free     = nouveau_notifier_free;
-       nvws->notifier_reset    = nouveau_notifier_reset;
-       nvws->notifier_status   = nouveau_notifier_status;
-       nvws->notifier_retval   = nouveau_notifier_return_val;
-       nvws->notifier_wait     = nouveau_notifier_wait_status;
-
-       nvws->get_bo            = nouveau_pipe_get_bo;
-
        return nvws;
 }