summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2008-05-08 19:19:52 -0600
committerBrian Paul <[email protected]>2008-05-08 19:19:52 -0600
commit2a39dbe7364af5444b1eb43650dfc31ed09257dc (patch)
tree3ea7a9799e35a4b4d3a1ab036e4e483038169f87
parent044d583ba12689cbe99098eb999854303de57f59 (diff)
gallium: fix out of tex memory crashes
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c11
-rw-r--r--src/mesa/state_tracker/st_texture.c5
2 files changed, 13 insertions, 3 deletions
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 3468b5f2a13..c0dba4cf2da 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -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) {
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index d0f56c9717c..9553b34e317 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -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;
}