small simplification for reading and writing DMAGET and DMAPUT, gives a minor speedup (a few percent max).

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11167 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen 2005-01-31 10:53:21 +00:00
parent eb5bc5f924
commit 8d2dfc64ee
1 changed files with 19 additions and 17 deletions

View File

@ -47,9 +47,11 @@ status_t nv_acc_wait_idle_dma()
* we hit a timeout; abort if we failed at least three times before:
* if DMA stalls, we have to forget about it alltogether at some point, or
* the system will almost come to a complete halt.. */
while ((NV_REG32(NVACC_FIFO + NV_GENERAL_DMAGET +
si->engine.fifo.handle[(si->engine.fifo.ch_ptr[NV_ROP5_SOLID])])
!= (si->engine.dma.put << 2)) &&
/* note:
* it doesn't matter which FIFO channel's DMA registers we access, they are in
* fact all the same set. It also doesn't matter if the channel was assigned a
* command or not. */
while ((NV_REG32(NVACC_FIFO + NV_GENERAL_DMAGET) != (si->engine.dma.put << 2)) &&
(cnt < 10000) && (err < 3))
{
/* snooze a bit so I do not hammer the bus */
@ -710,7 +712,9 @@ status_t nv_acc_init_dma()
/*** init FIFO via DMA command buffer. ***/
/* wait for room in fifo for new FIFO assigment cmds if needed: */
if (nv_acc_fifofree_dma(16) != B_OK) return B_ERROR;
//fixme if CH6 and CH7 are assigned..
// if (nv_acc_fifofree_dma(16) != B_OK) return B_ERROR;
if (nv_acc_fifofree_dma(12) != B_OK) return B_ERROR;
/* program new FIFO assignments */
/* Raster OPeration: */
@ -726,13 +730,11 @@ status_t nv_acc_init_dma()
/* Bitmap: */
nv_acc_set_ch_dma(NV_GENERAL_FIFO_CH5, si->engine.fifo.handle[5]);
/* Line: (not used or 3D only?) */
//fixme: temporary so there's something valid here.. (maybe needed, don't yet know)
//fixme..
// nv_acc_set_ch_dma(NV_GENERAL_FIFO_CH6, si->engine.fifo.handle[6]);
nv_acc_set_ch_dma(NV_GENERAL_FIFO_CH6, si->engine.fifo.handle[0]);
/* Textured Triangle: (3D only) */
//fixme: temporary so there's something valid here.. (maybe needed, don't yet know)
//fixme..
// nv_acc_set_ch_dma(NV_GENERAL_FIFO_CH7, si->engine.fifo.handle[7]);
nv_acc_set_ch_dma(NV_GENERAL_FIFO_CH7, si->engine.fifo.handle[0]);
/*** Set pixel width ***/
switch(si->dm.space)
@ -795,20 +797,17 @@ static void nv_start_dma(void)
if (si->engine.dma.current != si->engine.dma.put)
{
si->engine.dma.put = si->engine.dma.current;
/* fixme: is this actually needed? (force some flush somewhere) */
// ISAWB(0x03d0, 0x00);
/* dummy read the first adress of the framebuffer: flushes MTRR-WC buffers so
* we know for sure the DMA command buffer received all data. */
dummy = *((char *)(si->framebuffer));
/* actually start DMA to execute all commands now in buffer */
/* note:
* the actual FIFO channel that gets activated does not really matter:
* all FIFO fill-level info actually points at the same registers. */
* it doesn't matter which FIFO channel's DMA registers we access, they are in
* fact all the same set. It also doesn't matter if the channel was assigned a
* command or not. */
/* note also:
* NV_GENERAL_DMAPUT is a write-only register on some cards (confirmed NV11). */
NV_REG32(NVACC_FIFO + NV_GENERAL_DMAPUT +
si->engine.fifo.handle[(si->engine.fifo.ch_ptr[NV_ROP5_SOLID])]) =
(si->engine.dma.put << 2);
NV_REG32(NVACC_FIFO + NV_GENERAL_DMAPUT) = (si->engine.dma.put << 2);
}
}
@ -831,8 +830,11 @@ static status_t nv_acc_fifofree_dma(uint16 cmd_size)
/* see where the engine is currently fetching from the buffer */
/* note:
* read this only once in the code as accessing registers is relatively slow */
dmaget = ((NV_REG32(NVACC_FIFO + NV_GENERAL_DMAGET +
si->engine.fifo.handle[(si->engine.fifo.ch_ptr[NV_ROP5_SOLID])])) >> 2);
/* note also:
* it doesn't matter which FIFO channel's DMA registers we access, they are in
* fact all the same set. It also doesn't matter if the channel was assigned a
* command or not. */
dmaget = ((NV_REG32(NVACC_FIFO + NV_GENERAL_DMAGET)) >> 2);
/* update timeout counter: on NV11 on a Pentium4 2.8Ghz max reached count
* using BeRoMeter 1.2.6 was about 600; so counting 10000 before generating