Mesa (master): llvmpipe: don't crash/assert on out of memory

Brian Paul brianp at kemper.freedesktop.org
Tue Jun 29 14:40:48 PDT 2010


Module: Mesa
Branch: master
Commit: 3d6101245b2726721a26931e0491c61286ca29c6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3d6101245b2726721a26931e0491c61286ca29c6

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jun 29 15:40:15 2010 -0600

llvmpipe: don't crash/assert on out of memory

Check for null pointers and return early, etc.

---

 src/gallium/drivers/llvmpipe/lp_rast_priv.h |    3 ++-
 src/gallium/drivers/llvmpipe/lp_surface.c   |   16 +++++++++-------
 src/gallium/drivers/llvmpipe/lp_texture.c   |   10 +++++-----
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
index d33dd49..9bded08 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
@@ -172,7 +172,8 @@ lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task,
    assert((y % TILE_VECTOR_HEIGHT) == 0);
 
    color = task->color_tiles[buf];
-   assert(color);
+   if (!color)
+      return NULL;
 
    px = x % TILE_SIZE;
    py = y % TILE_SIZE;
diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c
index f0cbbe8..f761e82 100644
--- a/src/gallium/drivers/llvmpipe/lp_surface.c
+++ b/src/gallium/drivers/llvmpipe/lp_surface.c
@@ -146,13 +146,15 @@ lp_resource_copy(struct pipe_context *pipe,
                                               subdst.level,
                                               LP_TEX_LAYOUT_LINEAR);
 
-      util_copy_rect(dst_linear_ptr, format,
-                     llvmpipe_resource_stride(&dst_tex->base, subdst.level),
-                     dstx, dsty,
-                     width, height,
-                     src_linear_ptr,
-                     llvmpipe_resource_stride(&src_tex->base, subsrc.level),
-                     srcx, srcy);
+      if (dst_linear_ptr && src_linear_ptr) {
+         util_copy_rect(dst_linear_ptr, format,
+                        llvmpipe_resource_stride(&dst_tex->base, subdst.level),
+                        dstx, dsty,
+                        width, height,
+                        src_linear_ptr,
+                        llvmpipe_resource_stride(&src_tex->base, subsrc.level),
+                        srcx, srcy);
+      }
    }
 }
 
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c
index 0d526ea..a156bb6 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -389,7 +389,6 @@ llvmpipe_resource_map(struct pipe_resource *resource,
 
       map = llvmpipe_get_texture_image(lpr, face + zslice, level,
                                        tex_usage, layout);
-      assert(map);
       return map;
    }
    else {
@@ -1035,7 +1034,7 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
 
             layout_logic(cur_layout, layout, usage, &new_layout, &convert);
 
-            if (convert) {
+            if (convert && other_data && target_data) {
                if (layout == LP_TEX_LAYOUT_TILED) {
                   lp_linear_to_tiled(other_data, target_data,
                                      x * TILE_SIZE, y * TILE_SIZE,
@@ -1067,8 +1066,6 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
                                         width_t, height_t, layout);
    }
 
-   assert(target_data);
-
    return target_data;
 }
 
@@ -1187,13 +1184,16 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
    cur_layout = llvmpipe_get_texture_tile_layout(lpr, face_slice, level, tx, ty);
 
    layout_logic(cur_layout, LP_TEX_LAYOUT_TILED, usage, &new_layout, &convert);
-   if (convert) {
+   if (convert && linear_image && tiled_image) {
       lp_linear_to_tiled(linear_image, tiled_image,
                          x, y, TILE_SIZE, TILE_SIZE, lpr->base.format,
                          lpr->row_stride[level],
                          lpr->tiles_per_row[level]);
    }
 
+   if (!tiled_image)
+      return NULL;
+
    if (new_layout != cur_layout)
       llvmpipe_set_texture_tile_layout(lpr, face_slice, level, tx, ty, new_layout);
 



More information about the mesa-commit mailing list