svga: Temporarily create a sw vertex buf when failed to create a hw buf.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 18 Feb 2010 18:11:50 +0000 (18:11 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Mon, 22 Feb 2010 21:46:30 +0000 (21:46 +0000)
Many apps don't check the return of map buffer so it is better not to
fail.

src/gallium/drivers/svga/svga_screen_buffer.c

index 525352f347c54487684941a34706a7a4015a09c9..8f591e197726d3d7e333e101cd7a5eb4978c3606 100644 (file)
@@ -410,18 +410,31 @@ svga_buffer_map_range( struct pipe_screen *screen,
    struct svga_buffer *sbuf = svga_buffer( buf );
    void *map;
 
-   if(sbuf->swbuf) {
+   if (!sbuf->swbuf && !sbuf->hw.buf) {
+      if (svga_buffer_create_hw_storage(ss, sbuf) != PIPE_OK) {
+         /*
+          * We can't create a hardware buffer big enough, so create a malloc
+          * buffer instead.
+          */
+
+         debug_printf("%s: failed to allocate %u KB of DMA, splitting DMA transfers\n",
+                      __FUNCTION__,
+                      (sbuf->base.size + 1023)/1024);
+
+         sbuf->swbuf = align_malloc(sbuf->base.size, sbuf->base.alignment);
+      }
+   }
+
+   if (sbuf->swbuf) {
       /* User/malloc buffer */
       map = sbuf->swbuf;
    }
-   else {
-      if(!sbuf->hw.buf) {
-         if(svga_buffer_create_hw_storage(ss, sbuf) != PIPE_OK)
-            return NULL;
-      }
-         
+   else if (sbuf->hw.buf) {
       map = sws->buffer_map(sws, sbuf->hw.buf, usage);
    }
+   else {
+      map = NULL;
+   }
 
    if(map) {
       pipe_mutex_lock(ss->swc_mutex);