intel: Fix segfault when doing SW mipmap generation with a PBO texture upload.
authorEric Anholt <eric@anholt.net>
Thu, 9 Apr 2009 18:03:03 +0000 (11:03 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 15 Apr 2009 19:55:50 +0000 (12:55 -0700)
Triggered in test-fbo from clutter since
37fb2d9b23eab5dbbb43a212c3475cb8016837d8.

src/mesa/drivers/dri/intel/intel_tex_image.c

index 71561cf85cd4f2ada217e5d7f69da07ea787b1d1..c81f2309847f6b08e7489bbbf3056fd4610bc66a 100644 (file)
@@ -316,7 +316,7 @@ intelTexImage(GLcontext * ctx,
    GLint postConvHeight = height;
    GLint texelBytes, sizeInBytes;
    GLuint dstRowStride, srcRowStride = texImage->RowStride;
-
+   GLboolean needs_map;
 
    DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__,
        _mesa_lookup_enum_by_nr(target), level, width, height, depth, border);
@@ -482,8 +482,15 @@ intelTexImage(GLcontext * ctx,
 
    LOCK_HARDWARE(intel);
 
+   /* Two cases where we need a mapping of the miptree: when the user supplied
+    * data is mapped as well (non-PBO, memcpy upload) or when we're going to do
+    * (software) mipmap generation.
+    */
+   needs_map = (pixels != NULL) || (level == texObj->BaseLevel &&
+                                 texObj->GenerateMipmap);
+
    if (intelImage->mt) {
-      if (pixels)
+      if (needs_map)
          texImage->Data = intel_miptree_image_map(intel,
                                                   intelImage->mt,
                                                   intelImage->face,
@@ -549,7 +556,7 @@ intelTexImage(GLcontext * ctx,
    _mesa_unmap_teximage_pbo(ctx, unpack);
 
    if (intelImage->mt) {
-      if (pixels)
+      if (needs_map)
          intel_miptree_image_unmap(intel, intelImage->mt);
       texImage->Data = NULL;
    }