diff options
author | Brian Paul <[email protected]> | 2008-05-08 19:19:52 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2008-05-08 19:19:52 -0600 |
commit | 2a39dbe7364af5444b1eb43650dfc31ed09257dc (patch) | |
tree | 3ea7a9799e35a4b4d3a1ab036e4e483038169f87 | |
parent | 044d583ba12689cbe99098eb999854303de57f59 (diff) |
gallium: fix out of tex memory crashes
-rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 11 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_texture.c | 5 |
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; } |