nouveau: track last validated offsets, so we know when relocs can be avoided.
[mesa.git] / src / mesa / drivers / dri / nouveau_winsys / nouveau_local.h
index 4ada5d014bfd4aec72c2801b7a4cc39fe7a32788..e7111de4dc137d37fe4638725d1413b39f27e85e 100644 (file)
 //#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
 
 /* Push buffer access macros */
 #define BEGIN_RING(obj,mthd,size) do {                                         \
-       BEGIN_RING_CH(nv->channel, nv->obj, (mthd), (size));                   \
+       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 {                                                    \
-       OUT_RING_CH(nv->channel, (data));                                      \
+       (*nv->pushbuf++) = (data);                                             \
 } while(0)
 
 #define OUT_RINGp(src,size) do {                                               \
-       OUT_RINGp_CH(nv->channel, (src), (size));                              \
+       memcpy(nv->pushbuf, (src), (size)<<2);                                 \
+       nv->pushbuf += (size);                                                 \
 } while(0)
 
 #define OUT_RINGf(data) do {                                                   \
        OUT_RING(c.u);                                                         \
 } while(0)
 
-#define WAIT_RING(size) do {                                                   \
-       WAIT_RING_CH(nv->channel, (size));                                     \
+#define FIRE_RING() do {                                                       \
+       nouveau_pipe_dma_kickoff(nv->channel);                                 \
 } while(0)
 
-#define FIRE_RING() do {                                                       \
-       FIRE_RING_CH(nv->channel);                                             \
+#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 {                                  \
-       struct nouveau_channel_priv *chan = nouveau_channel(nv->channel);      \
-       nouveau_bo_emit_reloc(nv->channel, &chan->pushbuf[chan->dma.cur],      \
-                             (void*)(bo), (data), (flags), (vor), (tor));     \
+       nouveau_pushbuf_emit_reloc(nv->channel, nv->pushbuf, (void*)(bo),      \
+                                  (data), (flags), (vor), (tor));             \
        OUT_RING(0);                                                           \
 } while(0)