We dont need to call r300EmitAOS if we arent going to draw anything(r300_get_num_vert...
[mesa.git] / src / mesa / drivers / dri / unichrome / via_fb.c
index 9d9a5b10350d0ad4b32c6292ec1c8350187a25d3..b590e833b690401d5bb042697aa7a8ca9bce9c03 100644 (file)
 #include "via_context.h"
 #include "via_ioctl.h"
 #include "via_fb.h"
+#include "xf86drm.h"
 #include <sys/ioctl.h>
 
 GLboolean
-via_alloc_back_buffer(viaContextPtr vmesa)
+via_alloc_draw_buffer(viaContextPtr vmesa, viaBuffer *buf)
 {
-    drm_via_mem_t fb;
-    unsigned char *pFB;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
-    fb.context = vmesa->hHWContext;
-    fb.size = vmesa->back.size;
-    fb.type = VIDEO;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "context = %d, size =%d, type = %d\n", fb.context, fb.size, fb.type);
-#endif
-    if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb))
-        return GL_FALSE;
-    
-    pFB = vmesa->driScreen->pFB;
-    
-    vmesa->back.offset = fb.offset;
-    vmesa->back.map = (char *)(fb.offset + (GLuint)pFB);
-    vmesa->back.index = fb.index;
-#ifdef DEBUG    
-    if (VIA_DEBUG) {
-       fprintf(stderr, "offset = %08x\n", vmesa->back.offset);
-       fprintf(stderr, "index = %d\n", vmesa->back.index);
-    }
-
-    if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-#endif    
-    return GL_TRUE;
-}
+   drm_via_mem_t mem;
+   mem.context = vmesa->hHWContext;
+   mem.size = buf->size;
+   mem.type = VIDEO;
 
-GLboolean
-via_alloc_front_buffer(viaContextPtr vmesa)
-{
-    drm_via_mem_t fb;
-    unsigned char *pFB;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
-    fb.context = vmesa->hHWContext;
-    fb.size = vmesa->back.size;
-    fb.type = VIDEO;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "context = %d, size =%d, type = %d\n", fb.context, fb.size, fb.type);
-#endif
-    if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb))
-        return GL_FALSE;
+   if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &mem)) 
+      return GL_FALSE;
     
-    pFB = vmesa->driScreen->pFB;
     
-    vmesa->front.offset = fb.offset;
-    vmesa->front.map = (char *)(fb.offset + (GLuint)pFB);
-    vmesa->front.index = fb.index;
-#ifdef DEBUG    
-    if (VIA_DEBUG) {
-       fprintf(stderr, "offset = %08x\n", vmesa->front.offset);
-       fprintf(stderr, "index = %d\n", vmesa->front.index);
-    }
-
-
-    if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-#endif    
-    return GL_TRUE;
+   buf->offset = mem.offset;
+   buf->map = (char *)vmesa->driScreen->pFB + mem.offset;
+   buf->index = mem.index;
+   return GL_TRUE;
 }
 
 void
-via_free_back_buffer(viaContextPtr vmesa)
-{
-    drm_via_mem_t fb;
-
-    if (!vmesa) return;
-    fb.context = vmesa->hHWContext;
-    fb.index = vmesa->back.index;
-    fb.type = VIDEO;
-    ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb);
-    vmesa->back.map = NULL;
-}
-
-void
-via_free_front_buffer(viaContextPtr vmesa)
-{
-    drm_via_mem_t fb;
-
-    if (!vmesa) return;
-    fb.context = vmesa->hHWContext;
-    fb.index = vmesa->front.index;
-    fb.type = VIDEO;
-    ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb);
-    vmesa->front.map = NULL;
-}
-
-GLboolean
-via_alloc_depth_buffer(viaContextPtr vmesa)
+via_free_draw_buffer(viaContextPtr vmesa, viaBuffer *buf)
 {
-    drm_via_mem_t fb;
-    unsigned char *pFB;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);    
-#endif 
-    fb.context = vmesa->hHWContext;
-    fb.size = vmesa->depth.size;
-    fb.type = VIDEO;
+   drm_via_mem_t mem;
 
-    if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) {
-       return GL_FALSE;
-    }
-
-    pFB = vmesa->driScreen->pFB;
-    
-    vmesa->depth.offset = fb.offset;
-    vmesa->depth.map = (char *)(fb.offset + (GLuint)pFB);
-    vmesa->depth.index = fb.index;
-#ifdef DEBUG    
-    if (VIA_DEBUG) {
-       fprintf(stderr, "offset = %08x\n", vmesa->depth.offset);
-       fprintf(stderr, "index = %d\n", vmesa->depth.index);    
-    }  
+   if (!vmesa) return;
 
-    if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);    
-#endif
-    return GL_TRUE;
+   mem.context = vmesa->hHWContext;
+   mem.index = buf->index;
+   mem.type = VIDEO;
+   ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &mem);
+   buf->map = NULL;
 }
 
-void
-via_free_depth_buffer(viaContextPtr vmesa)
-{
-    drm_via_mem_t fb;
-       
-    if (!vmesa) return;
-    fb.context = vmesa->hHWContext;
-    fb.index = vmesa->depth.index;
-    fb.type = VIDEO;
-    ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb);
-    vmesa->depth.map = NULL;
-}
 
 GLboolean
 via_alloc_dma_buffer(viaContextPtr vmesa)
 {
-    drm_via_mem_t fb;
-    drmVIADMABuf dma;
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
-    if (vmesa->viaScreen->agpLinearStart) {
-       /* Allocate DMA in AGP memory*/
-       fb.context = vmesa->hHWContext;
-       fb.size = vmesa->dma[0].size;
-       fb.type = AGP;
-       if (!ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) {
-           vmesa->dma[0].offset = fb.offset;
-           vmesa->dma[0].index = fb.index;
-           vmesa->dma[0].map = (unsigned char *)((GLuint)vmesa->viaScreen->agpLinearStart + fb.offset);
-           if (!ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) {
-               vmesa->dma[1].offset = fb.offset;
-               vmesa->dma[1].index = fb.index;
-               vmesa->dma[1].map = (unsigned char *)((GLuint)vmesa->viaScreen->agpLinearStart + fb.offset);    
-               vmesa->useAgp = GL_TRUE;
-               
-               return GL_TRUE;
-           } 
-           else {
-               /* release dma[0]*/
-               return GL_FALSE;                
-           }
-       }
-       return GL_FALSE;        
-    } 
-    else {
-       /* Allocate DMA in System memory */
-       dma.size = vmesa->dma[0].size;
-
-       if (drmVIAAllocateDMA(vmesa->driFd,&dma) < 0) {
-           return GL_FALSE;
-       }
-
-       vmesa->dma[0].offset = 0;
-       vmesa->dma[0].map = (unsigned char *)dma.address;
-       vmesa->dma[0].index = dma.index;
-
-       drmVIAAllocateDMA(vmesa->driFd, &dma);
+   drm_via_dma_init_t init;
 
-       vmesa->dma[1].offset = 0;
-       vmesa->dma[1].map = (unsigned char *)dma.address;
-       vmesa->dma[1].index = dma.index;
-       vmesa->useAgp = GL_FALSE;
-       
-       return GL_TRUE;
-    }
-#ifdef DEBUG    
-    if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-#endif
+   if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
+   vmesa->dma = (GLubyte *) malloc(VIA_DMA_BUFSIZ);
+    
+   /*
+    * Check whether AGP DMA has been initialized.
+    */
+   init.func = VIA_DMA_INITIALIZED;
+   vmesa->useAgp = 
+     ( 0 == drmCommandWrite(vmesa->driFd, DRM_VIA_DMA_INIT, 
+                            &init, sizeof(init)));
+   if (VIA_DEBUG) {
+      if (vmesa->useAgp) 
+         fprintf(stderr, "unichrome_dri.so: Using AGP.\n");
+      else
+         fprintf(stderr, "unichrome_dri.so: Using PCI.\n");
+   
+      fprintf(stderr, "%s - out\n", __FUNCTION__);
+   }
+      
+   return ((vmesa->dma) ? GL_TRUE : GL_FALSE);
 }
 
 void
 via_free_dma_buffer(viaContextPtr vmesa)
 {
-    drmVIADMABuf dma;
-    drm_via_mem_t fb;
-    
-    
     if (!vmesa) return;
-    
-    /* Release AGP command buffer */
-    if (vmesa->useAgp) {
-       fb.context = vmesa->hHWContext;
-       fb.index = vmesa->dma[0].index;
-       fb.type = AGP;
-       ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb);
-       vmesa->dma[0].map = NULL;    
-       fb.index = vmesa->dma[1].index;
-       ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb);
-       vmesa->dma[1].map = NULL;    
-    }
-    /* Release System command buffer */
-    else {
-       
-       dma.address = (unsigned long *)vmesa->dma[0].map;
-       /*=* John Sheng [2003.6.16] fix pci path *=*/
-       dma.size = (unsigned int)vmesa->dma[0].size;
-       drmVIAReleaseDMA(vmesa->driFd, &dma);
-       
-       dma.address = (unsigned long *)vmesa->dma[1].map;
-       /*=* John Sheng [2003.6.16] fix pci path *=*/
-       dma.size = (unsigned int)vmesa->dma[1].size;
-       drmVIAReleaseDMA(vmesa->driFd, &dma);
-       vmesa->dma[0].map = 0;
-       vmesa->dma[1].map = 0;
-    }
+    free(vmesa->dma);
+    vmesa->dma = 0;
 } 
 
 GLboolean
 via_alloc_texture(viaContextPtr vmesa, viaTextureObjectPtr t)
 {
     drm_via_mem_t fb;
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
     fb.context = vmesa->hHWContext;
     fb.size = t->texMem.size;
     fb.type = VIDEO;
-#ifdef DEBUG    
     if (VIA_DEBUG) {
        fprintf(stderr, "texture size = %d\n", fb.size);
        fprintf(stderr, "texture type = %d\n", fb.type);
     }
-#endif
     if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) {
        fprintf(stderr, "via_alloc_texture fail\n");
         return GL_FALSE;
@@ -285,14 +117,10 @@ via_alloc_texture(viaContextPtr vmesa, viaTextureObjectPtr t)
     
     t->texMem.offset = fb.offset;
     t->texMem.index = fb.index;
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "texture index = %d\n", (GLuint)fb.index);
-#endif
     
     t->bufAddr = (unsigned char *)(fb.offset + (GLuint)vmesa->driScreen->pFB);
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);    
-#endif
     return GL_TRUE;
 }
 /*=* John Sheng [2003.5.31]  agp tex *=*/
@@ -300,18 +128,14 @@ GLboolean
 via_alloc_texture_agp(viaContextPtr vmesa, viaTextureObjectPtr t)
 {
     drm_via_mem_t fb;
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
     fb.context = vmesa->hHWContext;
     fb.size = t->texMem.size;
     fb.type = AGP;
-#ifdef DEBUG    
     if (VIA_DEBUG) {
        fprintf(stderr, "texture_agp size = %d\n", fb.size);
        fprintf(stderr, "texture type = %d\n", fb.type);
     }
-#endif
     if (ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) {
        fprintf(stderr, "via_alloc_texture_agp fail\n");
         return GL_FALSE;
@@ -319,16 +143,12 @@ via_alloc_texture_agp(viaContextPtr vmesa, viaTextureObjectPtr t)
     
     t->texMem.offset = fb.offset;
     t->texMem.index = fb.index;
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "texture agp index = %d\n", (GLuint)fb.index);
-#endif
     
     t->bufAddr = (unsigned char *)((GLuint)vmesa->viaScreen->agpLinearStart + fb.offset);      
     /*=* John Sheng [2003.5.31]  agp tex *=*/
     t->inAGP = GL_TRUE;
-#ifdef DEBUG    
     if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);    
-#endif
     return GL_TRUE;
 }
 
@@ -336,14 +156,12 @@ void
 via_free_texture(viaContextPtr vmesa, viaTextureObjectPtr t)
 {
     drm_via_mem_t fb;
-#ifdef DEBUG           
     if (VIA_DEBUG) {
        fprintf(stderr, "via_free_texture: index = %d\n",
             t->texMem.index);
        fprintf(stderr, "via_free_texture: size = %d\n",
             t->texMem.size);
     }
-#endif
     if (!vmesa) {
        fprintf(stderr, "!mesa\n");
        return;