summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2009-06-05 10:28:13 +1000
committerBen Skeggs <bskeggs@redhat.com>2009-06-05 14:37:03 +1000
commit80e9e1ee8172d1e5a81d702681897dddd9d815f1 (patch)
tree8104fc6523428a52598f026f566bab7e29939309 /src/gallium/drivers/nouveau
parent1b207d9bb81ae3385e5658a81c71fbf2fe15c18f (diff)
nouveau: move channel creation into pipe drivers
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r--src/gallium/drivers/nouveau/nouveau_push.h21
-rw-r--r--src/gallium/drivers/nouveau/nouveau_screen.c5
-rw-r--r--src/gallium/drivers/nouveau/nouveau_stateobj.h25
-rw-r--r--src/gallium/drivers/nouveau/nouveau_winsys.h18
4 files changed, 33 insertions, 36 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_push.h b/src/gallium/drivers/nouveau/nouveau_push.h
index afe4668fcd..0f2c42915b 100644
--- a/src/gallium/drivers/nouveau/nouveau_push.h
+++ b/src/gallium/drivers/nouveau/nouveau_push.h
@@ -9,13 +9,13 @@
#define OUT_RING(data) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- (*pc->nvws->channel->pushbuf->cur++) = (data); \
+ (*pc->base.channel->pushbuf->cur++) = (data); \
} while(0)
#define OUT_RINGp(src,size) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- memcpy(pc->nvws->channel->pushbuf->cur, (src), (size) * 4); \
- pc->nvws->channel->pushbuf->cur += (size); \
+ memcpy(pc->base.channel->pushbuf->cur, (src), (size) * 4); \
+ pc->base.channel->pushbuf->cur += (size); \
} while(0)
#define OUT_RINGf(data) do { \
@@ -26,7 +26,7 @@
#define BEGIN_RING(obj,mthd,size) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- struct nouveau_channel *chan = pc->nvws->channel; \
+ struct nouveau_channel *chan = pc->base.channel; \
if (chan->pushbuf->remaining < ((size) + 1)) \
nouveau_pushbuf_flush(chan, ((size) + 1)); \
OUT_RING((pc->obj->subc << 13) | ((size) << 18) | (mthd)); \
@@ -47,14 +47,13 @@ DO_FIRE_RING(struct nouveau_channel *chan, struct pipe_fence_handle **fence)
#define FIRE_RING(fence) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- DO_FIRE_RING(pc->nvws->channel, fence); \
+ DO_FIRE_RING(pc->base.channel, fence); \
} while(0)
#define OUT_RELOC(bo,data,flags,vor,tor) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- struct nouveau_channel *chan = pc->nvws->channel; \
- nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, \
- pc->nvws->get_bo(bo), \
+ struct nouveau_channel *chan = pc->base.channel; \
+ nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, nouveau_bo(bo), \
(data), (flags), (vor), (tor)); \
} while(0)
@@ -66,8 +65,8 @@ DO_FIRE_RING(struct nouveau_channel *chan, struct pipe_fence_handle **fence)
/* FB/TT object handle */
#define OUT_RELOCo(bo,flags) do { \
OUT_RELOC((bo), 0, (flags) | NOUVEAU_BO_OR, \
- pc->nvws->channel->vram->handle, \
- pc->nvws->channel->gart->handle); \
+ pc->base.channel->vram->handle, \
+ pc->base.channel->gart->handle); \
} while(0)
/* Low 32-bits of offset */
@@ -83,7 +82,7 @@ DO_FIRE_RING(struct nouveau_channel *chan, struct pipe_fence_handle **fence)
/* A reloc which'll recombine into a NV_DMA_METHOD packet header */
#define OUT_RELOCm(bo, flags, obj, mthd, size) do { \
NOUVEAU_PUSH_CONTEXT(pc); \
- struct nouveau_channel *chan = pc->nvws->channel; \
+ struct nouveau_channel *chan = pc->base.channel; \
if (chan->pushbuf->remaining < ((size) + 1)) \
nouveau_pushbuf_flush(chan, ((size) + 1)); \
OUT_RELOCd((bo), (pc->obj->subc << 13) | ((size) << 18) | (mthd), \
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c
index 3cab83eec0..ab522a124a 100644
--- a/src/gallium/drivers/nouveau/nouveau_screen.c
+++ b/src/gallium/drivers/nouveau/nouveau_screen.c
@@ -212,7 +212,12 @@ int
nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)
{
struct pipe_screen *pscreen = &screen->base;
+ int ret;
+ ret = nouveau_channel_alloc(dev, 0xbeef0201, 0xbeef0202,
+ &screen->channel);
+ if (ret)
+ return ret;
screen->device = dev;
pscreen->get_name = nouveau_screen_get_name;
diff --git a/src/gallium/drivers/nouveau/nouveau_stateobj.h b/src/gallium/drivers/nouveau/nouveau_stateobj.h
index de3ba9cf14..8e818d9d38 100644
--- a/src/gallium/drivers/nouveau/nouveau_stateobj.h
+++ b/src/gallium/drivers/nouveau/nouveau_stateobj.h
@@ -107,21 +107,21 @@ so_dump(struct nouveau_stateobj *so)
}
static INLINE void
-so_emit(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
+so_emit(struct nouveau_channel *chan, struct nouveau_stateobj *so)
{
- struct nouveau_pushbuf *pb = nvws->channel->pushbuf;
+ struct nouveau_pushbuf *pb = chan->pushbuf;
unsigned nr, i;
nr = so->cur - so->push;
if (pb->remaining < nr)
- nouveau_pushbuf_flush(nvws->channel, nr);
+ nouveau_pushbuf_flush(chan, nr);
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];
- nouveau_pushbuf_emit_reloc(nvws->channel, pb->cur + r->offset,
+ nouveau_pushbuf_emit_reloc(chan, pb->cur + r->offset,
r->bo, r->data, r->flags, r->vor,
r->tor);
}
@@ -129,30 +129,29 @@ so_emit(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
}
static INLINE void
-so_emit_reloc_markers(struct nouveau_winsys *nvws, struct nouveau_stateobj *so)
+so_emit_reloc_markers(struct nouveau_channel *chan, struct nouveau_stateobj *so)
{
- struct nouveau_pushbuf *pb = nvws->channel->pushbuf;
+ struct nouveau_pushbuf *pb = chan->pushbuf;
unsigned i;
if (!so)
return;
i = so->cur_reloc << 1;
- if (nvws->channel->pushbuf->remaining < i)
- nouveau_pushbuf_flush(nvws->channel, i);
- nvws->channel->pushbuf->remaining -= i;
+ if (pb->remaining < i)
+ nouveau_pushbuf_flush(chan, i);
+ pb->remaining -= i;
for (i = 0; i < so->cur_reloc; i++) {
struct nouveau_stateobj_reloc *r = &so->reloc[i];
- nouveau_pushbuf_emit_reloc(nvws->channel, pb->cur++, r->bo,
- r->packet,
+ nouveau_pushbuf_emit_reloc(chan, pb->cur++, r->bo, r->packet,
(r->flags & (NOUVEAU_BO_VRAM |
NOUVEAU_BO_GART |
NOUVEAU_BO_RDWR)) |
NOUVEAU_BO_DUMMY, 0, 0);
- nouveau_pushbuf_emit_reloc(nvws->channel, pb->cur++, r->bo,
- r->data, r->flags | NOUVEAU_BO_DUMMY,
+ nouveau_pushbuf_emit_reloc(chan, pb->cur++, r->bo, r->data,
+ r->flags | NOUVEAU_BO_DUMMY,
r->vor, r->tor);
}
}
diff --git a/src/gallium/drivers/nouveau/nouveau_winsys.h b/src/gallium/drivers/nouveau/nouveau_winsys.h
index 7998497240..42c77e5e77 100644
--- a/src/gallium/drivers/nouveau/nouveau_winsys.h
+++ b/src/gallium/drivers/nouveau/nouveau_winsys.h
@@ -23,44 +23,38 @@
#define NOUVEAU_BUFFER_USAGE_ZETA (1 << 17)
#define NOUVEAU_BUFFER_USAGE_TRANSFER (1 << 18)
-struct nouveau_winsys {
- struct pipe_winsys *ws;
-
- struct nouveau_channel *channel;
-};
-
extern struct pipe_screen *
-nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv04_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv04_create(struct pipe_screen *, unsigned pctx_id);
extern struct pipe_screen *
-nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv10_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv10_create(struct pipe_screen *, unsigned pctx_id);
extern struct pipe_screen *
-nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv20_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv20_create(struct pipe_screen *, unsigned pctx_id);
extern struct pipe_screen *
-nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv30_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv30_create(struct pipe_screen *, unsigned pctx_id);
extern struct pipe_screen *
-nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv40_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv40_create(struct pipe_screen *, unsigned pctx_id);
extern struct pipe_screen *
-nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *);
+nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *);
extern struct pipe_context *
nv50_create(struct pipe_screen *, unsigned pctx_id);