r300RefillCurrentDmaRegion: Retry buffer acquisition only once, after
authorNicolai Haehnle <prefect_@gmx.net>
Fri, 18 Feb 2005 18:57:38 +0000 (18:57 +0000)
committerNicolai Haehnle <prefect_@gmx.net>
Fri, 18 Feb 2005 18:57:38 +0000 (18:57 +0000)
waiting for the engine to idle. There's no way for another buffer to
become free anyway once the engine is idle.

src/mesa/drivers/dri/r300/r300_ioctl.c

index e8e044eab1c199688b1b41d917dcb756be824425..de21bfc81b0caf3773aa2f2cde0dc8708a82e8b6 100644 (file)
@@ -403,19 +403,24 @@ void r300RefillCurrentDmaRegion(r300ContextPtr rmesa)
 
        LOCK_HARDWARE(&rmesa->radeon);  /* no need to validate */
 
-       while (1) {
-               ret = drmDMA(fd, &dma);
-               if (ret == 0)
-                       break;
+       ret = drmDMA(fd, &dma);
 
+       if (ret != 0) {
+               /* Try to release some buffers and wait until we can't get any more */
                if (rmesa->dma.nr_released_bufs) {
                        r300FlushCmdBufLocked(rmesa, __FUNCTION__);
                }
 
-               if (rmesa->radeon.do_usleeps) {
+               if (RADEON_DEBUG & DEBUG_DMA)
+                       fprintf(stderr, "Waiting for buffers\n");
+
+               radeonWaitForIdleLocked(&rmesa->radeon);
+               ret = drmDMA(fd, &dma);
+
+               if (ret != 0) {
                        UNLOCK_HARDWARE(&rmesa->radeon);
-                       DO_USLEEP(1);
-                       LOCK_HARDWARE(&rmesa->radeon);
+                       fprintf(stderr, "Error: Could not get dma buffer... exiting\n");
+                       exit(-1);
                }
        }