Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2020-02-03 10:58:01 +0300
committerJeroen Bakker <jeroen@blender.org>2020-02-03 13:05:40 +0300
commitd237681cada6696487876f710a1eb2372572b16f (patch)
treef2c2e94b4798b5e913609cb4ffd09df1e57d1fcb /source/blender/gpu/intern/gpu_draw.c
parent831bb6bc772ec69a3f6b4df46b8acf0933506fe7 (diff)
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
Diffstat (limited to 'source/blender/gpu/intern/gpu_draw.c')
-rw-r--r--source/blender/gpu/intern/gpu_draw.c138
1 files changed, 69 insertions, 69 deletions
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);
}