[Bf-blender-cvs] [d237681cada] blender-v2.82-release: Fix T73559: UDIM Crash Fill Tile

Jeroen Bakker noreply at git.blender.org
Mon Feb 3 11:06:21 CET 2020


Commit: d237681cada6696487876f710a1eb2372572b16f
Author: Jeroen Bakker
Date:   Mon Feb 3 08:58:01 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rBd237681cada6696487876f710a1eb2372572b16f

Fix T73559: UDIM Crash Fill Tile

The function `gpu_texture_create_tile_array` checked for a valid
tile ibuf when determining the packing location. During the actual packaging it didn't.

As the tiles are already ignored when selecting the packing location, we
can also ignore it when copying it to the glTexture. Therefore this
patch removes the existing BLI_assert and replaces it with a NULL check.

Reviewed By: Brecht van Lommel

Differential Revision: https://developer.blender.org/D6738

===================================================================

M	source/blender/gpu/intern/gpu_draw.c

===================================================================

diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index cfeb7f6bedb..cac3ba37b0a 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -363,86 +363,86 @@ static uint gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf)
     BKE_imageuser_default(&iuser);
     iuser.tile = tile->tile_number;
     ImBuf *ibuf = BKE_image_acquire_ibuf(ima, &iuser, NULL);
-    BLI_assert(ibuf != NULL);
 
-    bool needs_scale = (ibuf->x != tilesize[0] || ibuf->y != tilesize[1]);
-
-    ImBuf *scale_ibuf = NULL;
-    if (ibuf->rect_float) {
-      float *rect_float = ibuf->rect_float;
+    if (ibuf) {
+      bool needs_scale = (ibuf->x != tilesize[0] || ibuf->y != tilesize[1]);
 
-      const bool store_premultiplied = ima->alpha_mode != IMA_ALPHA_STRAIGHT;
-      if (ibuf->channels != 4 || !store_premultiplied) {
-        rect_float = MEM_mallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, __func__);
-        IMB_colormanagement_imbuf_to_float_texture(
-            rect_float, 0, 0, ibuf->x, ibuf->y, ibuf, store_premultiplied);
-      }
+      ImBuf *scale_ibuf = NULL;
+      if (ibuf->rect_float) {
+        float *rect_float = ibuf->rect_float;
 
-      float *pixeldata = rect_float;
-      if (needs_scale) {
-        scale_ibuf = IMB_allocFromBuffer(NULL, rect_float, ibuf->x, ibuf->y, 4);
-        IMB_scaleImBuf(scale_ibuf, tilesize[0], tilesize[1]);
-        pixeldata = scale_ibuf->rect_float;
-      }
+        const bool store_premultiplied = ima->alpha_mode != IMA_ALPHA_STRAIGHT;
+        if (ibuf->channels != 4 || !store_premultiplied) {
+          rect_float = MEM_mallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, __func__);
+          IMB_colormanagement_imbuf_to_float_texture(
+              rect_float, 0, 0, ibuf->x, ibuf->y, ibuf, store_premultiplied);
+        }
 
-      glTexSubImage3D(GL_TEXTURE_2D_ARRAY,
-                      0,
-                      tileoffset[0],
-                      tileoffset[1],
-                      tilelayer,
-                      tilesize[0],
-                      tilesize[1],
-                      1,
-                      GL_RGBA,
-                      GL_FLOAT,
-                      pixeldata);
+        float *pixeldata = rect_float;
+        if (needs_scale) {
+          scale_ibuf = IMB_allocFromBuffer(NULL, rect_float, ibuf->x, ibuf->y, 4);
+          IMB_scaleImBuf(scale_ibuf, tilesize[0], tilesize[1]);
+          pixeldata = scale_ibuf->rect_float;
+        }
 
-      if (rect_float != ibuf->rect_float) {
-        MEM_freeN(rect_float);
-      }
-    }
-    else {
-      unsigned int *rect = ibuf->rect;
-
-      if (!IMB_colormanagement_space_is_data(ibuf->rect_colorspace)) {
-        rect = MEM_mallocN(sizeof(uchar) * 4 * ibuf->x * ibuf->y, __func__);
-        IMB_colormanagement_imbuf_to_byte_texture((uchar *)rect,
-                                                  0,
-                                                  0,
-                                                  ibuf->x,
-                                                  ibuf->y,
-                                                  ibuf,
-                                                  internal_format == GL_SRGB8_ALPHA8,
-                                                  ima->alpha_mode == IMA_ALPHA_PREMUL);
+        glTexSubImage3D(GL_TEXTURE_2D_ARRAY,
+                        0,
+                        tileoffset[0],
+                        tileoffset[1],
+                        tilelayer,
+                        tilesize[0],
+                        tilesize[1],
+                        1,
+                        GL_RGBA,
+                        GL_FLOAT,
+                        pixeldata);
+
+        if (rect_float != ibuf->rect_float) {
+          MEM_freeN(rect_float);
+        }
       }
+      else {
+        unsigned int *rect = ibuf->rect;
+
+        if (!IMB_colormanagement_space_is_data(ibuf->rect_colorspace)) {
+          rect = MEM_mallocN(sizeof(uchar) * 4 * ibuf->x * ibuf->y, __func__);
+          IMB_colormanagement_imbuf_to_byte_texture((uchar *)rect,
+                                                    0,
+                                                    0,
+                                                    ibuf->x,
+                                                    ibuf->y,
+                                                    ibuf,
+                                                    internal_format == GL_SRGB8_ALPHA8,
+                                                    ima->alpha_mode == IMA_ALPHA_PREMUL);
+        }
 
-      unsigned int *pixeldata = rect;
-      if (needs_scale) {
-        scale_ibuf = IMB_allocFromBuffer(rect, NULL, ibuf->x, ibuf->y, 4);
-        IMB_scaleImBuf(scale_ibuf, tilesize[0], tilesize[1]);
-        pixeldata = scale_ibuf->rect;
+        unsigned int *pixeldata = rect;
+        if (needs_scale) {
+          scale_ibuf = IMB_allocFromBuffer(rect, NULL, ibuf->x, ibuf->y, 4);
+          IMB_scaleImBuf(scale_ibuf, tilesize[0], tilesize[1]);
+          pixeldata = scale_ibuf->rect;
+        }
+        glTexSubImage3D(GL_TEXTURE_2D_ARRAY,
+                        0,
+                        tileoffset[0],
+                        tileoffset[1],
+                        tilelayer,
+                        tilesize[0],
+                        tilesize[1],
+                        1,
+                        GL_RGBA,
+                        GL_UNSIGNED_BYTE,
+                        pixeldata);
+
+        if (rect != ibuf->rect) {
+          MEM_freeN(rect);
+        }
       }
-      glTexSubImage3D(GL_TEXTURE_2D_ARRAY,
-                      0,
-                      tileoffset[0],
-                      tileoffset[1],
-                      tilelayer,
-                      tilesize[0],
-                      tilesize[1],
-                      1,
-                      GL_RGBA,
-                      GL_UNSIGNED_BYTE,
-                      pixeldata);
-
-      if (rect != ibuf->rect) {
-        MEM_freeN(rect);
+      if (scale_ibuf != NULL) {
+        IMB_freeImBuf(scale_ibuf);
       }
     }
 
-    if (scale_ibuf != NULL) {
-      IMB_freeImBuf(scale_ibuf);
-    }
-
     BKE_image_release_ibuf(ima, ibuf, NULL);
   }



More information about the Bf-blender-cvs mailing list