diff options
author | Jeroen Bakker <jeroen@blender.org> | 2022-02-14 13:00:30 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-02-14 13:00:30 +0300 |
commit | 48e2bf3638e1d96d8cbfbc74d29c347ccfcad576 (patch) | |
tree | d40cb6b120a2a0718f68199556760c4398461fd2 | |
parent | efac4db166292229e4e2ab7afa6034d637893bd6 (diff) | |
parent | 1236d2aea8d55c7d98409fc76968bad297a53007 (diff) |
Merge branch 'blender-v3.1-release'
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image_gpu.cc | 9 | ||||
-rw-r--r-- | source/blender/draw/engines/image/image_drawing_mode.hh | 3 | ||||
-rw-r--r-- | source/blender/draw/engines/image/image_instance_data.hh | 23 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.cc | 2 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_edit.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_image_types.h | 8 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_image.c | 4 |
8 files changed, 35 insertions, 20 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 68816731593..fa63f99d3f1 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -4361,7 +4361,7 @@ RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima) } else { rr = BKE_image_get_renderslot(ima, ima->render_slot)->render; - ima->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(ima); } /* set proper views */ @@ -5729,7 +5729,7 @@ void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra) /* NOTE: a single texture and refresh doesn't really work when * multiple image users may use different frames, this is to * be improved with perhaps a GPU texture cache. */ - ima->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(ima); ima->gpuframenr = iuser->framenr; } diff --git a/source/blender/blenkernel/intern/image_gpu.cc b/source/blender/blenkernel/intern/image_gpu.cc index a12ae2951f4..5675641deb4 100644 --- a/source/blender/blenkernel/intern/image_gpu.cc +++ b/source/blender/blenkernel/intern/image_gpu.cc @@ -389,18 +389,9 @@ static GPUTexture *image_get_gpu_texture(Image *ima, ima->gpu_pass = requested_pass; ima->gpu_layer = requested_layer; ima->gpu_view = requested_view; - ima->gpuflag |= IMA_GPU_REFRESH; } #undef GPU_FLAGS_TO_CHECK - /* TODO(jbakker): We should replace the IMA_GPU_REFRESH flag with a call to - * BKE_image-partial_update_mark_full_update. Although the flag is quicker it leads to double - * administration. */ - if ((ima->gpuflag & IMA_GPU_REFRESH) != 0) { - BKE_image_partial_update_mark_full_update(ima); - ima->gpuflag &= ~IMA_GPU_REFRESH; - } - if (ima->runtime.partial_update_user == nullptr) { ima->runtime.partial_update_user = BKE_image_partial_update_create(ima); } diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh index d0dbc799c31..b3d6c3abd18 100644 --- a/source/blender/draw/engines/image/image_drawing_mode.hh +++ b/source/blender/draw/engines/image/image_drawing_mode.hh @@ -458,6 +458,9 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD method.update_screen_space_bounds(region); method.update_screen_uv_bounds(); + /* Check for changes in the image user compared to the last time. */ + instance_data->update_image_user(iuser); + /* Step: Update the GPU textures based on the changes in the image. */ instance_data->update_gpu_texture_allocations(); update_textures(*instance_data, image, iuser); diff --git a/source/blender/draw/engines/image/image_instance_data.hh b/source/blender/draw/engines/image/image_instance_data.hh index dde313d63f8..ec6290ae8de 100644 --- a/source/blender/draw/engines/image/image_instance_data.hh +++ b/source/blender/draw/engines/image/image_instance_data.hh @@ -25,6 +25,8 @@ constexpr int SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN = 1; struct IMAGE_InstanceData { struct Image *image; + /** Copy of the last image user to detect iuser differences that require a full update. */ + struct ImageUser last_image_user; PartialImageUpdater partial_update; @@ -93,6 +95,27 @@ struct IMAGE_InstanceData { } } + void update_image_user(const ImageUser *image_user) + { + short requested_pass = image_user ? image_user->pass : 0; + short requested_layer = image_user ? image_user->layer : 0; + short requested_view = image_user ? image_user->multi_index : 0; + /* There is room for 2 multiview textures. When a higher number is requested we should always + * target the first view slot. This is fine as multi view images aren't used together. */ + if (requested_view < 2) { + requested_view = 0; + } + + if (last_image_user.pass != requested_pass || last_image_user.layer != requested_layer || + last_image_user.multi_index != requested_view) { + + last_image_user.pass = requested_pass; + last_image_user.layer = requested_layer; + last_image_user.multi_index = requested_view; + reset_dirty_flag(true); + } + } + private: /** \brief Set dirty flag of all texture slots to the given value. */ void reset_dirty_flag(bool new_value) diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index af4003b0c14..1ca2b01a2cb 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -512,7 +512,7 @@ static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender) ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID; } BKE_image_release_ibuf(oglrender->ima, ibuf, lock); - oglrender->ima->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(oglrender->ima); if (oglrender->write_still) { screen_opengl_render_write(oglrender); diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c index 5c386856827..e851b99d3ba 100644 --- a/source/blender/editors/space_image/image_edit.c +++ b/source/blender/editors/space_image/image_edit.c @@ -388,7 +388,7 @@ bool ED_image_slot_cycle(struct Image *image, int direction) } if ((cur != image->render_slot)) { - image->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(image); } return (cur != image->render_slot); } diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 39a53b06d4c..06b589d4f76 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -237,15 +237,13 @@ enum { /* Image.gpuflag */ enum { - /** GPU texture needs to be refreshed. */ - IMA_GPU_REFRESH = (1 << 0), /** All mipmap levels in OpenGL texture set? */ - IMA_GPU_MIPMAP_COMPLETE = (1 << 1), + IMA_GPU_MIPMAP_COMPLETE = (1 << 0), /* Reuse the max resolution textures as they fit in the limited scale. */ - IMA_GPU_REUSE_MAX_RESOLUTION = (1 << 2), + IMA_GPU_REUSE_MAX_RESOLUTION = (1 << 1), /* Has any limited scale textures been allocated. * Adds additional checks to reuse max resolution images when they fit inside limited scale. */ - IMA_GPU_HAS_LIMITED_SCALE_TEXTURES = (1 << 3), + IMA_GPU_HAS_LIMITED_SCALE_TEXTURES = (1 << 2), }; /* Image.source, where the image comes from */ diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index 8adb9267769..e40fafd2069 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -594,7 +594,7 @@ static void rna_render_slots_active_set(PointerRNA *ptr, int index = BLI_findindex(&image->renderslots, slot); if (index != -1) { image->render_slot = index; - image->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(image); } } } @@ -610,7 +610,7 @@ static void rna_render_slots_active_index_set(PointerRNA *ptr, int value) Image *image = (Image *)ptr->owner_id; int num_slots = BLI_listbase_count(&image->renderslots); image->render_slot = value; - image->gpuflag |= IMA_GPU_REFRESH; + BKE_image_partial_update_mark_full_update(image); CLAMP(image->render_slot, 0, num_slots - 1); } |