svga: don't crash/assert if we fail to allocate a vertex buffer
authorBrian Paul <brianp@vmware.com>
Thu, 10 Nov 2011 16:54:26 +0000 (09:54 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 11 Nov 2011 14:10:56 +0000 (07:10 -0700)
v2: check if pipe_buffer_map() returns NULL, and return NULL from
svga_vbuf_render_map_vertices().  Per Jose's suggestion.

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_swtnl_backend.c

index 15b1bb5e09748337db8278f098f92bf5a2872763..e149d21a47eea7433cc99cdf0a434b9b23cfdca7 100644 (file)
@@ -96,7 +96,9 @@ svga_vbuf_render_allocate_vertices( struct vbuf_render *render,
                                                 PIPE_BIND_VERTEX_BUFFER,
                                                 PIPE_USAGE_STREAM,
                                                 svga_render->vbuf_size);
-         assert(svga_render->vbuf);
+         /* The buffer allocation may fail if we run out of memory.
+          * The draw module's vbuf code should handle that without crashing.
+          */
       }
 
       svga->swtnl.new_vdecl = TRUE;
@@ -119,14 +121,23 @@ svga_vbuf_render_map_vertices( struct vbuf_render *render )
    struct svga_vbuf_render *svga_render = svga_vbuf_render(render);
    struct svga_context *svga = svga_render->svga;
 
-   char *ptr = (char*)pipe_buffer_map(&svga->pipe,
-                                      svga_render->vbuf,
-                                      PIPE_TRANSFER_WRITE | 
-                                      PIPE_TRANSFER_FLUSH_EXPLICIT |
-                                      PIPE_TRANSFER_DISCARD |
-                                      PIPE_TRANSFER_UNSYNCHRONIZED,
-                                     &svga_render->vbuf_transfer);
-   return ptr + svga_render->vbuf_offset;
+   if (svga_render->vbuf) {
+      char *ptr = (char*)pipe_buffer_map(&svga->pipe,
+                                         svga_render->vbuf,
+                                         PIPE_TRANSFER_WRITE |
+                                         PIPE_TRANSFER_FLUSH_EXPLICIT |
+                                         PIPE_TRANSFER_DISCARD |
+                                         PIPE_TRANSFER_UNSYNCHRONIZED,
+                                         &svga_render->vbuf_transfer);
+      if (ptr)
+         return ptr + svga_render->vbuf_offset;
+      else
+         return NULL;
+   }
+   else {
+      /* we probably ran out of memory when allocating the vertex buffer */
+      return NULL;
+   }
 }
 
 static void