gallium: catch some out of memory conditions in the texture image code.
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Mar 2008 23:08:07 +0000 (17:08 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Mar 2008 23:08:07 +0000 (17:08 -0600)
st_finalize_texture()'s return code now indicates success/fail instead of
presence of texture border (which we discard earlier).

src/mesa/state_tracker/st_atom_texture.c
src/mesa/state_tracker/st_cb_texture.c

index 2a711e513df34a3002453ab3dc0ac29739ac399a..9aef30f45669b8341ce161227920da90f8b9fe50 100644 (file)
@@ -64,7 +64,10 @@ update_textures(struct st_context *st)
          GLboolean flush, retval;
 
          retval = st_finalize_texture(st->ctx, st->pipe, texObj, &flush);
-         /* XXX retval indicates whether there's a texture border */
+         if (!retval) {
+            /* out of mem */
+            continue;
+         }
 
          st->state.num_textures = unit + 1;
       }
index 306b27c423562fb79cded7d9124b43e35e25e92f..a6c1a353552f306e05ca8e2c7f3f7ecb10832b83 100644 (file)
@@ -564,7 +564,8 @@ st_TexImage(GLcontext * ctx,
    if (!stObj->pt) {
       guess_and_alloc_texture(ctx->st, stObj, stImage);
       if (!stObj->pt) {
-        DBG("guess_and_alloc_texture: failed\n");
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
+         return;
       }
    }
 
@@ -1379,7 +1380,7 @@ copy_image_data_to_texture(struct st_context *st,
 /**
  * Called during state validation.  When this function is finished,
  * the texture object should be ready for rendering.
- * \return GL_FALSE if a texture border is present, GL_TRUE otherwise
+ * \return GL_TRUE for success, GL_FALSE for failure (out of mem)
  */
 GLboolean
 st_finalize_texture(GLcontext *ctx,
@@ -1405,6 +1406,7 @@ st_finalize_texture(GLcontext *ctx,
    calculate_first_last_level(stObj);
    firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]);
 
+#if 0
    /* Fallback case:
     */
    if (firstImage->base.Border) {
@@ -1413,7 +1415,7 @@ st_finalize_texture(GLcontext *ctx,
       }
       return GL_FALSE;
    }
-
+#endif
 
    /* If both firstImage and stObj point to a texture which can contain
     * all active images, favour firstImage.  Note that because of the
@@ -1466,6 +1468,10 @@ st_finalize_texture(GLcontext *ctx,
                                     firstImage->base.Height,
                                     firstImage->base.Depth,
                                     comp_byte);
+      if (!stObj->pt) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
+         return GL_FALSE;
+      }
    }
 
    /* Pull in any images not in the object's texture:
@@ -1486,7 +1492,6 @@ st_finalize_texture(GLcontext *ctx,
       }
    }
 
-
    return GL_TRUE;
 }