[Bf-blender-cvs] [24318440ebb] temp-udim-images: Add per-tile struct to Image to track the status of every tile
Lukas Stockner
noreply at git.blender.org
Tue Jun 12 18:56:17 CEST 2018
Commit: 24318440ebbe4d0071fc8a693dd50f26db3625de
Author: Lukas Stockner
Date: Tue Jun 12 18:06:33 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB24318440ebbe4d0071fc8a693dd50f26db3625de
Add per-tile struct to Image to track the status of every tile
===================================================================
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/intern/image.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/blenloader/intern/writefile.c
M source/blender/compositor/operations/COM_ViewerOperation.cpp
M source/blender/editors/object/object_bake_api.c
M source/blender/editors/render/render_preview.c
M source/blender/editors/space_image/image_ops.c
M source/blender/gpu/intern/gpu_draw.c
M source/blender/makesdna/DNA_image_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 3cd83926379..2f44ac28316 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -277,13 +277,13 @@ bool BKE_image_has_opengl_texture(struct Image *ima);
/* get tile index for tiled images */
int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser);
+bool BKE_image_make_tiled(struct Image *ima, int num_tiles);
+
struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type);
void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPUTexture *tex);
int BKE_image_get_tile_from_pos(struct Image *ima, float uv[2], float new_uv[2], float ofs[2]);
-void BKE_image_set_num_tiles(struct Image *ima, int num_tiles);
-
void BKE_image_get_size(struct Image *image, struct ImageUser *iuser, int *width, int *height);
void BKE_image_get_size_fl(struct Image *image, struct ImageUser *iuser, float size[2]);
void BKE_image_get_aspect(struct Image *image, float *aspx, float *aspy);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index b5a1728d6f9..bbec4ec527a 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -327,7 +327,9 @@ void BKE_image_free_buffers_ex(Image *ima, bool do_lock)
GPU_free_image(ima);
}
- ima->ok = IMA_OK;
+ for (int i = 0; i < ima->num_tiles; i++) {
+ ima->tiles[i].ok = IMA_OK;
+ }
if (do_lock) {
BLI_spin_unlock(&image_spin);
@@ -361,6 +363,8 @@ void BKE_image_free(Image *ima)
BKE_icon_id_delete(&ima->id);
BKE_previewimg_free(&ima->preview);
+
+ MEM_freeN(ima->tiles);
}
/* only image block itself */
@@ -368,8 +372,6 @@ static void image_init(Image *ima, short source, short type)
{
BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(ima, id));
- ima->ok = IMA_OK;
-
ima->aspx = ima->aspy = 1.0;
ima->gen_x = 1024; ima->gen_y = 1024;
ima->gen_type = IMA_GENTYPE_GRID;
@@ -381,6 +383,8 @@ static void image_init(Image *ima, short source, short type)
ima->flag |= IMA_VIEW_AS_RENDER;
ima->num_tiles = 1;
+ ima->tiles = MEM_callocN(sizeof(ImageTile), "Image Tiles");
+ ima->tiles[0].ok = IMA_OK;
BKE_color_managed_colorspace_settings_init(&ima->colorspace_settings);
ima->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Image Stereo Format");
@@ -659,8 +663,10 @@ Image *BKE_image_load_exists_ex(Main *bmain, const char *filepath, bool *r_exist
(ima->id.us == 0))
{
id_us_plus(&ima->id); /* officially should not, it doesn't link here! */
- if (ima->ok == 0)
- ima->ok = IMA_OK;
+ for (int i = 0; i < ima->num_tiles; i++) {
+ if (ima->tiles[i].ok == 0)
+ ima->tiles[i].ok = IMA_OK;
+ }
if (r_exists)
*r_exists = true;
return ima;
@@ -769,7 +775,7 @@ Image *BKE_image_add_generated(
image_add_view(ima, names[view_id], "");
}
- ima->ok = IMA_OK_LOADED;
+ ima->tiles[0].ok = IMA_OK_LOADED;
}
return ima;
@@ -792,7 +798,7 @@ Image *BKE_image_add_from_imbuf(Main *bmain, ImBuf *ibuf, const char *name)
if (ima) {
STRNCPY(ima->name, ibuf->name);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
- ima->ok = IMA_OK_LOADED;
+ ima->tiles[0].ok = IMA_OK_LOADED;
}
return ima;
@@ -2778,7 +2784,10 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
BKE_image_free_buffers(ima);
#endif
- ima->ok = 1;
+ for (int i = 0; i < ima->num_tiles; i++) {
+ ima->tiles[i].ok = 1;
+ }
+
if (iuser)
iuser->ok = 1;
@@ -2838,7 +2847,9 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
case IMA_SIGNAL_COLORMANAGE:
BKE_image_free_buffers(ima);
- ima->ok = 1;
+ for (int i = 0; i < ima->num_tiles; i++) {
+ ima->tiles[i].ok = 1;
+ }
if (iuser)
iuser->ok = 1;
@@ -2992,6 +3003,23 @@ void BKE_image_set_num_tiles(struct Image *ima, int num_tiles)
image_alloc_gputexture(ima);
}
+bool BKE_image_make_tiled(struct Image *ima, int num_tiles)
+{
+ if (ima->source != IMA_SRC_FILE) {
+ return false;
+ }
+
+ BKE_image_free_buffers(ima);
+
+ ima->source = IMA_SRC_TILED;
+ ima->num_tiles = num_tiles;
+ ima->tiles = MEM_recallocN(ima->tiles, sizeof(ImageTile)*num_tiles);
+ for (int i = 0; i < num_tiles; i++)
+ ima->tiles[i].ok = 1;
+
+ return true;
+}
+
/* if layer or pass changes, we need an index for the imbufs list */
/* note it is called for rendered results, but it doesnt use the index! */
/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
@@ -3175,7 +3203,7 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
#endif /* WITH_OPENEXR */
/* common stuff to do with images after loading */
-static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
+static void image_initialize_after_load(Image *ima, ImageUser *iuser, ImBuf *ibuf)
{
/* Preview is NULL when it has never been used as an icon before.
* Never handle previews/icons outside of main thread. */
@@ -3191,7 +3219,8 @@ static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
/* timer */
BKE_image_tag_time(ima);
- ima->ok = IMA_OK_LOADED;
+ int tile = BKE_image_get_tile_index(ima, iuser);
+ ima->tiles[tile].ok = IMA_OK_LOADED;
}
@@ -3230,6 +3259,7 @@ static ImBuf *load_sequence_single(Image *ima, ImageUser *iuser, int frame, cons
char name[FILE_MAX];
int flag;
ImageUser iuser_t = {0};
+ int tile = BKE_image_get_tile_index(ima, iuser);
/* XXX temp stuff? */
if (ima->lastframe != frame)
@@ -3275,14 +3305,16 @@ static ImBuf *load_sequence_single(Image *ima, ImageUser *iuser, int frame, cons
}
}
else {
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
*r_assign = true;
}
#else
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
*r_assign = true;
#endif
}
+ else
+ ima->tiles[tile].ok = 0;
return ibuf;
}
@@ -3339,6 +3371,7 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int entry,
static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int entry, int frame)
{
struct ImBuf *ibuf = NULL;
+ int tile = BKE_image_get_tile_index(ima, iuser);
/* either we load from RenderResult, or we have to load a new one */
@@ -3373,17 +3406,17 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int e
ibuf->mall = IB_rectfloat;
ibuf->channels = rpass->channels;
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
image_assign_ibuf(ima, ibuf, iuser ? iuser->multi_index : 0, entry);
}
// else printf("pass not found\n");
}
else
- ima->ok = 0;
+ ima->tiles[tile].ok = 0;
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = ima->tiles[tile].ok;
return ibuf;
}
@@ -3433,13 +3466,13 @@ static ImBuf *load_movie_single(Image *ima, ImageUser *iuser, int frame, const i
IMB_PROXY_NONE));
if (ibuf) {
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
}
else
- ima->ok = 0;
+ ima->tiles[0].ok = 0;
}
else
- ima->ok = 0;
+ ima->tiles[0].ok = 0;
return ibuf;
}
@@ -3483,7 +3516,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
image_assign_ibuf(ima, ibuf_arr[i], i, frame);
}
else {
- ima->ok = 0;
+ ima->tiles[0].ok = 0;
}
}
@@ -3502,7 +3535,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
}
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = ima->tiles[0].ok;
return ibuf;
}
@@ -3568,7 +3601,7 @@ static ImBuf *load_image_single(
else
#endif
{
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
*r_assign = true;
/* check if the image is a font image... */
@@ -3585,7 +3618,7 @@ static ImBuf *load_image_single(
}
}
else {
- ima->ok = 0;
+ ima->tiles[BKE_image_get_tile_index(ima, iuser)].ok = 0;
}
return ibuf;
@@ -3659,7 +3692,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
}
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = ima->tiles[0].ok;
return ibuf;
}
@@ -3681,7 +3714,7 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser)
if (rpass) {
ibuf = IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0);
- image_initialize_after_load(ima, ibuf);
+ image_initialize_after_load(ima, iuser, ibuf);
ibuf->rect_float = rpass->rect;
ibuf->flags |= IB_rectfloat;
@@ -3692,9 +3725,9 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser)
}
if (ibuf == NULL)
- ima->ok = 0;
+ ima->tiles[0].ok = 0;
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = ima->tiles[0].ok;
return ibuf;
}
@@ -3890,7 +3923,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
ibuf->dither = dither;
- ima->ok = IMA_OK_LOADED;
+ ima->tiles[0].ok = IMA_OK_LOADED;
return ibuf;
}
@@ -3976,10 +4009,10 @@ static ImBuf *image_get_cached_ibuf(Image *ima, ImageUser *iuser, int *r_entry,
* that is not in the cache (through image_acquire_ibuf for instance),
* yet we have valid frames in the cache loaded */
if (ibuf) {
- ima->ok = IMA_OK_LOADED;
+ ima->tiles[0].ok = IMA_OK_LOADED;
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = ima->tiles[0].ok;
}
}
else if (ima->type == IMA_TYPE_MULTILAYER) {
@@ -3993,10 +4026,11 @@ static ImBuf *image_get_cached_ibuf(Image *ima, ImageUser *iuser, int *r_entry,
ibuf = image_get_cached_ibuf_for_index_entry(ima, index, entry);
if ((ima->type == IMA_TYPE_IMAGE) && ibuf) {
- ima->ok = IMA_OK_LOADED;
+ ima->tiles[entry].ok = IMA_OK_LOADED;
+ /* iuser->ok is useless for tiled images because iuser->tile changes all the time. */
if (iuser)
- iuser->ok = ima->ok;
+ iuser->ok = 1;
}
}
}
@@ -4032,8 +4066,12 @@ BLI_INLINE bool image_quick_test(Image *ima, ImageUser *iuser)
if (iuser) {
if (iuser-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list