gallium: fix out of tex memory crashes
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 9 May 2008 01:19:52 +0000 (19:19 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 9 May 2008 01:19:52 +0000 (19:19 -0600)
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_texture.c

index 3468b5f2a131789fd4ea13b08aab5ad184e20f2e..c0dba4cf2dab36b919c06d7cc53ad73900c8e16c 100644 (file)
@@ -645,7 +645,8 @@ st_TexImage(GLcontext * ctx,
    if (stImage->pt) {
       texImage->Data = st_texture_image_map(ctx->st, stImage, 0,
                                             PIPE_BUFFER_USAGE_CPU_WRITE);
-      dstRowStride = stImage->surface->pitch * stImage->surface->cpp;
+      if (stImage->surface)
+         dstRowStride = stImage->surface->pitch * stImage->surface->cpp;
    }
    else {
       /* Allocate regular memory and store the image there temporarily.   */
@@ -663,6 +664,11 @@ st_TexImage(GLcontext * ctx,
       texImage->Data = malloc(sizeInBytes);
    }
 
+   if (!texImage->Data) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
+      return;
+   }
+
    DBG("Upload image %dx%dx%d row_len %x pitch %x\n",
        width, height, depth, width * texelBytes, dstRowStride);
 
@@ -906,7 +912,8 @@ st_TexSubimage(GLcontext * ctx,
    if (stImage->pt) {
       texImage->Data = st_texture_image_map(ctx->st, stImage, zoffset, 
                                             PIPE_BUFFER_USAGE_CPU_WRITE);
-      dstRowStride = stImage->surface->pitch * stImage->surface->cpp;
+      if (stImage->surface)
+         dstRowStride = stImage->surface->pitch * stImage->surface->cpp;
    }
 
    if (!texImage->Data) {
index d0f56c9717cadb088b150a2252657d52ca754cee..9553b34e317b178980691d1da27dd79931cfaba2 100644 (file)
@@ -197,7 +197,10 @@ st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
                                               stImage->level, zoffset, 
                                               flags);
 
-   return screen->surface_map(screen, stImage->surface, flags);
+   if (stImage->surface)
+      return screen->surface_map(screen, stImage->surface, flags);
+   else
+      return NULL;
 }