diff options
author | Jeroen Bakker <jeroen@blender.org> | 2021-01-25 13:17:03 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-01-25 13:27:55 +0300 |
commit | ebaa3fcedd2388c6e1a213911b79bfdc1e49df78 (patch) | |
tree | be5ad658f0612481c97d0e25900be3605652b8fc /source/blender/blenkernel/intern | |
parent | 02404ded80ac7d861a45a36960d0a3b279bbf721 (diff) |
Fix T84398: Multiview images show only one view.
The `image_get_gpu_texture` didn't use the iuser->view_index but
recalculated the requested view again. This lead to inconsistent
behavior when switching between multi view textures or stereo textures.
This has been fixed by ensuring that the `iuser->view_index` is always
used.
An Image has only place to store 2 view textures. This is done for
right/left eye compositing. A multi view texture can have more views.
This would lead to reading and writing to unallocated space.
When a multiview texture is requested that is larger than 1. It will
always be cached as being the first eye. The `gpu_view` of the Image is
also used as a cache key to check this.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/image_gpu.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index 05aa3c89a84..a6bd65227a0 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -271,6 +271,7 @@ static GPUTexture **get_image_gpu_texture_ptr(Image *ima, { const bool in_range = (textarget >= 0) && (textarget < TEXTARGET_COUNT); BLI_assert(in_range); + BLI_assert(multiview_eye == 0 || multiview_eye == 1); if (in_range) { return &(ima->gputexture[textarget][multiview_eye]); @@ -310,9 +311,17 @@ static GPUTexture *image_get_gpu_texture(Image *ima, * the current `pass` and `layer` should be 0. */ short requested_pass = iuser ? iuser->pass : 0; short requested_layer = iuser ? iuser->layer : 0; - if (ima->gpu_pass != requested_pass || ima->gpu_layer != requested_layer) { + short requested_view = iuser ? iuser->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 (ima->gpu_pass != requested_pass || ima->gpu_layer != requested_layer || + ima->gpu_view != requested_view) { ima->gpu_pass = requested_pass; ima->gpu_layer = requested_layer; + ima->gpu_view = requested_view; ima->gpuflag |= IMA_GPU_REFRESH; } @@ -345,9 +354,10 @@ static GPUTexture *image_get_gpu_texture(Image *ima, BKE_image_tag_time(ima); /* Test if we already have a texture. */ - const int current_view = iuser ? ((iuser->flag & IMA_SHOW_STEREO) != 0 ? iuser->multiview_eye : - iuser->view) : - 0; + int current_view = iuser ? iuser->multi_index : 0; + if (current_view >= 2) { + current_view = 0; + } GPUTexture **tex = get_image_gpu_texture_ptr(ima, textarget, current_view); if (*tex) { return *tex; |