diff options
author | Luca Barbieri <luca@luca-barbieri.com> | 2010-02-23 11:06:31 +0100 |
---|---|---|
committer | Luca Barbieri <luca@luca-barbieri.com> | 2010-04-12 12:13:15 +0200 |
commit | e0af5c9b5457d560ab075118881de01e0277ed14 (patch) | |
tree | b3ffc3090c9b2b6a211bc663c6d24f9741195a44 | |
parent | 507dc546c3da415036521fcf91e76af88c2cbf69 (diff) |
nouveau: bind the 3D engine to subchannel 7 and add RING_3D
RING_3D creates a method start for subchannel 7.
Bind the 3D engine to a fixed subchannel to make it work
This is much faster than the old BEGIN_RING, since we don't need
to waste cycles trying to "autobind" stuff, when a fast static binding
is perfectly good.
Subchannel 7 is chosen because the kernel takes up the lowest ones.
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_screen.h | 12 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_screen.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/nvfx/nvfx_screen.c | 2 |
3 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h b/src/gallium/drivers/nouveau/nouveau_screen.h index c0ec6e4895..f32ecd0b69 100644 --- a/src/gallium/drivers/nouveau/nouveau_screen.h +++ b/src/gallium/drivers/nouveau/nouveau_screen.h @@ -60,4 +60,16 @@ void nouveau_screen_fini(struct nouveau_screen *); +static __inline__ unsigned +RING_3D(unsigned mthd, unsigned size) +{ + return (7 << 13) | (size << 18) | mthd; +} + +static __inline__ unsigned +RING_3D_NI(unsigned mthd, unsigned size) +{ + return 0x40000000 | (7 << 13) | (size << 18) | mthd; +} + #endif diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c index a0fe4c5913..425786f00f 100644 --- a/src/gallium/drivers/nv50/nv50_screen.c +++ b/src/gallium/drivers/nv50/nv50_screen.c @@ -335,6 +335,9 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev) return NULL; } + /* this is necessary for the new RING_3D / statebuffer code */ + BIND_RING(chan, screen->tesla, 7); + /* Sync notifier */ ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync); if (ret) { diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c index 1f6e6e3497..e63e1abcea 100644 --- a/src/gallium/drivers/nvfx/nvfx_screen.c +++ b/src/gallium/drivers/nvfx/nvfx_screen.c @@ -418,6 +418,8 @@ nvfx_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev) return NULL; } + BIND_RING(chan, screen->eng3d, 7); + /* Static eng3d initialisation */ /* make the so big and don't worry about exact values since we it will be thrown away immediately after use */ |