summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2007-12-19 19:40:38 +1100
committerBen Skeggs <skeggsb@gmail.com>2007-12-19 19:40:38 +1100
commitbf2410ca73d1eabc7134e51855d0b603897229e4 (patch)
tree0431451f5de5a8cddfbef100605d78fe9918df9f /src/mesa/drivers/dri
parentd67c2c1cd5d0bb77a08a46d2e9a2bdae6b2c8ff3 (diff)
nouveau: nuke subchan auto-assign.
It's annoying for several reasons, especially in its current form. May possibly be reincarnated later (DDX depends on it these days), but in not quite the same way.
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_context.h1
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.c28
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.h26
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h6
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c11
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_local.h11
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys.c17
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nv04_surface.c4
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nv50_surface.c2
9 files changed, 36 insertions, 70 deletions
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_context.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_context.h
index cd59b7cc43..294b66e518 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_context.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_context.h
@@ -54,6 +54,7 @@ struct nouveau_context {
struct nouveau_grobj *NvM2MF;
struct nouveau_grobj *Nv2D;
uint32_t next_handle;
+ uint32_t next_subchannel;
uint32_t next_sequence;
/* pipe_surface accel */
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.c
index b89f1b5cf5..d00fddbff2 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.c
@@ -126,34 +126,6 @@ nouveau_dma_wait(struct nouveau_channel *chan, int size)
return 0;
}
-#ifdef NOUVEAU_DMA_SUBCHAN_LRU
-void
-nouveau_dma_subc_bind(struct nouveau_grobj *grobj)
-{
- struct nouveau_channel_priv *nvchan = nouveau_channel(grobj->channel);
- int subc = -1, i;
-
- for (i = 0; i < 8; i++) {
- if (nvchan->subchannel[i].grobj &&
- nvchan->subchannel[i].grobj->bound ==
- NOUVEAU_GROBJ_EXPLICIT_BIND)
- continue;
- if (nvchan->subchannel[i].seq < nvchan->subchannel[subc].seq)
- subc = i;
- }
- assert(subc >= 0);
-
- if (nvchan->subchannel[subc].grobj)
- nvchan->subchannel[subc].grobj->bound = 0;
- nvchan->subchannel[subc].grobj = grobj;
- grobj->subc = subc;
- grobj->bound = NOUVEAU_GROBJ_BOUND;
-
- BEGIN_RING_CH(grobj->channel, grobj, 0, 1);
- nouveau_dma_out (grobj->channel, grobj->handle);
-}
-#endif
-
#ifdef NOUVEAU_DMA_DUMP_POSTRELOC_PUSHBUF
static void
nouveau_dma_parse_pushbuf(struct nouveau_channel *chan, int get, int put)
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.h
index d4dd3054f3..c4667cc5c0 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_dma.h
@@ -94,12 +94,6 @@ nouveau_dma_begin(struct nouveau_channel *chan, struct nouveau_grobj *grobj,
struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
int push_size = size + 1;
-#ifdef NOUVEAU_DMA_SUBCHAN_LRU
- if (grobj->bound == NOUVEAU_GROBJ_UNBOUND)
- nouveau_dma_subc_bind(grobj);
- nvchan->subchannel[grobj->subc].seq = nvchan->subc_sequence++;
-#endif
-
#ifdef NOUVEAU_DMA_TRACE
NOUVEAU_MSG("BEGIN_RING %d/%08x/%d/0x%04x/%d\n", nvchan->drm.channel,
grobj->handle, grobj->subc, method, size);
@@ -128,26 +122,6 @@ nouveau_dma_begin(struct nouveau_channel *chan, struct nouveau_grobj *grobj,
nouveau_dma_out(chan, (size << 18) | (grobj->subc << 13) | method);
}
-static inline void
-nouveau_dma_bind(struct nouveau_channel *chan, struct nouveau_grobj *grobj,
- int subc)
-{
- struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
-
- if (nvchan->subchannel[subc].grobj == grobj)
- return;
-
- if (nvchan->subchannel[subc].grobj)
- nvchan->subchannel[subc].grobj->bound = NOUVEAU_GROBJ_UNBOUND;
- nvchan->subchannel[subc].grobj = grobj;
- grobj->subc = subc;
- grobj->bound = NOUVEAU_GROBJ_EXPLICIT_BIND;
-
- nouveau_dma_begin(chan, grobj, 0x0000, 1, __FUNCTION__, __LINE__);
- nouveau_dma_out (chan, grobj->handle);
-}
-
-#define BIND_RING_CH(ch,gr,sc) nouveau_dma_bind((ch), (gr), (sc))
#define BEGIN_RING_CH(ch,gr,m,sz) nouveau_dma_begin((ch), (gr), (m), (sz), __FUNCTION__, __LINE__ )
#define OUT_RING_CH(ch, data) nouveau_dma_out((ch), (data))
#define OUT_RINGp_CH(ch,ptr,dwords) nouveau_dma_outp((ch), (void*)(ptr), \
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
index 9978652dd6..7e52de4323 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
@@ -161,12 +161,6 @@ struct nouveau_channel_priv {
struct drm_nouveau_channel_alloc drm;
- struct {
- struct nouveau_grobj *grobj;
- uint32_t seq;
- } subchannel[8];
- uint32_t subc_sequence;
-
uint32_t *pushbuf;
void *notifier_block;
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
index 7861b6f84d..c9f0903e27 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
@@ -108,8 +108,15 @@ nouveau_fence_emit(struct nouveau_fence *fence)
if (nvfence->sequence == 0xffffffff)
NOUVEAU_ERR("AII wrap unhandled\n");
- BEGIN_RING_CH(&nvchan->base, nvchan->subchannel[0].grobj, 0x50, 1);
- OUT_RING_CH (&nvchan->base, nvfence->sequence);
+ /*XXX: assumes subc 0 is populated */
+ if (nvchan->dma.free < 2)
+ WAIT_RING_CH(&nvchan->base, 2);
+ nvchan->dma.free -= 2;
+#ifdef NOUVEAU_DMA_DEBUG
+ nvchan->dma.push_free += 2;
+#endif
+ OUT_RING_CH(&nvchan->base, 0x00040050);
+ OUT_RING_CH(&nvchan->base, nvfence->sequence);
if (nvchan->fence_tail) {
nouveau_fence(nvchan->fence_tail)->next = fence;
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_local.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_local.h
index 1978edea02..e7111de4dc 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_local.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_local.h
@@ -20,7 +20,6 @@
//#define NOUVEAU_DMA_TRACE
//#define NOUVEAU_DMA_DEBUG
//#define NOUVEAU_DMA_DUMP_POSTRELOC_PUSHBUF
-#define NOUVEAU_DMA_SUBCHAN_LRU
#define NOUVEAU_DMA_BARRIER
#define NOUVEAU_DMA_TIMEOUT 2000
@@ -29,6 +28,10 @@
nv->pushbuf = nouveau_pipe_dma_beginp(nv->obj, (mthd), (size)); \
} while(0)
+#define BEGIN_RING_GR(obj,mthd,size) do { \
+ nv->pushbuf = nouveau_pipe_dma_beginp(obj, (mthd), (size)); \
+} while(0)
+
#define OUT_RING(data) do { \
(*nv->pushbuf++) = (data); \
} while(0)
@@ -48,6 +51,12 @@
nouveau_pipe_dma_kickoff(nv->channel); \
} while(0)
+#define BIND_RING(o,s) do { \
+ nv->o->subc = (s); \
+ BEGIN_RING(o, 0x0000, 1); \
+ OUT_RING (nv->o->handle); \
+} while(0)
+
#define OUT_RELOC(bo,data,flags,vor,tor) do { \
nouveau_pushbuf_emit_reloc(nv->channel, nv->pushbuf, (void*)(bo), \
(data), (flags), (vor), (tor)); \
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys.c
index e6481a20f2..f588c956ca 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys.c
@@ -20,9 +20,18 @@ nouveau_pipe_grobj_alloc(struct nouveau_winsys *nvws, int grclass,
struct nouveau_grobj **grobj)
{
struct nouveau_context *nv = nvws->nv;
+ int ret;
- return nouveau_grobj_alloc(nv->channel, nv->next_handle++,
- grclass, grobj);
+ ret = nouveau_grobj_alloc(nv->channel, nv->next_handle++,
+ grclass, grobj);
+ if (ret)
+ return ret;
+
+ (*grobj)->subc = nv->next_subchannel++;
+ assert((*grobj)->subc <= 7);
+ BEGIN_RING_GR(*grobj, 0x0000, 1);
+ OUT_RING ((*grobj)->handle);
+ return 0;
}
uint32_t *
@@ -34,10 +43,6 @@ nouveau_pipe_dma_beginp(struct nouveau_grobj *grobj, int mthd, int size)
if (!nvchan->pb_tail || nvchan->pb_tail->remaining < (size + 1))
nouveau_pushbuf_flush(grobj->channel);
- if (grobj->bound == NOUVEAU_GROBJ_UNBOUND)
- nouveau_dma_subc_bind(grobj);
- nvchan->subchannel[grobj->subc].seq = nvchan->subc_sequence++;
-
pushbuf = nvchan->pb_tail->cur;
nvchan->pb_tail->cur += (size + 1);
nvchan->pb_tail->remaining -= (size + 1);
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nv04_surface.c b/src/mesa/drivers/dri/nouveau_winsys/nv04_surface.c
index 67e2514026..b50e744d0d 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nv04_surface.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nv04_surface.c
@@ -178,6 +178,7 @@ nouveau_surface_init_nv04(struct nouveau_context *nv)
NOUVEAU_ERR("Error creating m2mf object: %d\n", ret);
return 1;
}
+ BIND_RING (NvM2MF, nv->next_subchannel++);
BEGIN_RING(NvM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
OUT_RING (nv->sync_notifier->handle);
@@ -188,6 +189,7 @@ nouveau_surface_init_nv04(struct nouveau_context *nv)
NOUVEAU_ERR("Error creating 2D surface object: %d\n", ret);
return 1;
}
+ BIND_RING (NvCtxSurf2D, nv->next_subchannel++);
BEGIN_RING(NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D_DMA_IMAGE_SOURCE, 2);
OUT_RING (nv->channel->vram->handle);
OUT_RING (nv->channel->vram->handle);
@@ -199,6 +201,7 @@ nouveau_surface_init_nv04(struct nouveau_context *nv)
NOUVEAU_ERR("Error creating blit object: %d\n", ret);
return 1;
}
+ BIND_RING (NvImageBlit, nv->next_subchannel++);
BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_DMA_NOTIFY, 1);
OUT_RING (nv->sync_notifier->handle);
BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_SURFACE, 1);
@@ -212,6 +215,7 @@ nouveau_surface_init_nv04(struct nouveau_context *nv)
NOUVEAU_ERR("Error creating rect object: %d\n", ret);
return 1;
}
+ BIND_RING (NvGdiRect, nv->next_subchannel++);
BEGIN_RING(NvGdiRect, NV04_GDI_RECTANGLE_TEXT_DMA_NOTIFY, 1);
OUT_RING (nv->sync_notifier->handle);
BEGIN_RING(NvGdiRect, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nv50_surface.c b/src/mesa/drivers/dri/nouveau_winsys/nv50_surface.c
index 2a95b1fcd3..d00378d904 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nv50_surface.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nv50_surface.c
@@ -151,7 +151,7 @@ nouveau_surface_init_nv50(struct nouveau_context *nv)
&nv->Nv2D);
if (ret)
return ret;
-
+ BIND_RING (Nv2D, 0);
BEGIN_RING(Nv2D, NV50_2D_DMA_NOTIFY, 1);
OUT_RING (nv->sync_notifier->handle);
BEGIN_RING(Nv2D, NV50_2D_DMA_IN_MEMORY0, 2);