From 690d76c6244d1e423c570fb0b1918619fd76b6aa Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 14 Aug 2020 13:41:42 +0200 Subject: [PATCH 1/5] Fix T79769, T79768: crash tweaking volume settings with Cycles viewport render Refitting the BVH does not work in this case, it needs to be fully rebuilt. --- intern/cycles/render/mesh_volume.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/intern/cycles/render/mesh_volume.cpp b/intern/cycles/render/mesh_volume.cpp index 70189ea4812..a90ae32d4c8 100644 --- a/intern/cycles/render/mesh_volume.cpp +++ b/intern/cycles/render/mesh_volume.cpp @@ -540,6 +540,7 @@ void GeometryManager::create_volume_mesh(Mesh *mesh, Progress &progress) mesh->clear(true); mesh->reserve_mesh(vertices.size(), indices.size() / 3); mesh->used_shaders.push_back(volume_shader); + mesh->need_update_rebuild = true; for (size_t i = 0; i < vertices.size(); ++i) { mesh->add_vertex(vertices[i]); From d958ab62e760641056a56eb6521077556018a4b8 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 14 Aug 2020 13:42:33 +0200 Subject: [PATCH 2/5] Fix NULL pointer access in render engine reported by address sanitizer This may not have caused an actual bug. --- .../render/intern/source/external_engine.c | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 075202e8a79..0790d40d56c 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -513,15 +513,15 @@ void RE_engine_active_view_set(RenderEngine *engine, const char *viewname) float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, bool use_spherical_stereo) { - Render *re = engine->re; - /* When using spherical stereo, get camera shift without multiview, * leaving stereo to be handled by the engine. */ - if (use_spherical_stereo) { - re = NULL; + Render *re = engine->re; + if (use_spherical_stereo || re == NULL) { + return BKE_camera_multiview_shift_x(NULL, camera, NULL); + } + else { + return BKE_camera_multiview_shift_x(&re->r, camera, re->viewname); } - - return BKE_camera_multiview_shift_x(re ? &re->r : NULL, camera, re->viewname); } void RE_engine_get_camera_model_matrix(RenderEngine *engine, @@ -529,16 +529,15 @@ void RE_engine_get_camera_model_matrix(RenderEngine *engine, bool use_spherical_stereo, float *r_modelmat) { - Render *re = engine->re; - /* When using spherical stereo, get model matrix without multiview, * leaving stereo to be handled by the engine. */ - if (use_spherical_stereo) { - re = NULL; + Render *re = engine->re; + if (use_spherical_stereo || re == NULL) { + BKE_camera_multiview_model_matrix(NULL, camera, NULL, (float(*)[4])r_modelmat); + } + else { + BKE_camera_multiview_model_matrix(&re->r, camera, re->viewname, (float(*)[4])r_modelmat); } - - BKE_camera_multiview_model_matrix( - re ? &re->r : NULL, camera, re->viewname, (float(*)[4])r_modelmat); } bool RE_engine_get_spherical_stereo(RenderEngine *engine, Object *camera) From 77e4905b171a57bfe6e4e92864747534cdba9f53 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Fri, 14 Aug 2020 16:10:45 +0200 Subject: [PATCH 3/5] Fix --debug-xr not outputting OpenXR debug prints on Windows The OpenXR debug extension was disabled on Windows as a workaround. This was an old leftover from when there was only the Windows Mixed Reality runtime on Windows. The debug extension didn't work for it and we didn't have a way to disable it just for Windows Mixed Reality. Now it seems to work though, so we remove the workaround. If specific runtimes still have trouble with the extension, we can disable it specifically for these runtimes now. --- intern/ghost/intern/GHOST_XrContext.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_XrContext.cpp b/intern/ghost/intern/GHOST_XrContext.cpp index 6933103a2d6..0d8d42a72f7 100644 --- a/intern/ghost/intern/GHOST_XrContext.cpp +++ b/intern/ghost/intern/GHOST_XrContext.cpp @@ -408,11 +408,9 @@ void GHOST_XrContext::getExtensionsToEnable( std::vector try_ext; /* Try enabling debug extension. */ -#ifndef WIN32 if (isDebugMode()) { try_ext.push_back(XR_EXT_DEBUG_UTILS_EXTENSION_NAME); } -#endif r_ext_names.reserve(try_ext.size() + graphics_binding_types.size()); From c074943dfd914fafd25f59cd43e26b4e8ac499f0 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Fri, 14 Aug 2020 16:38:45 +0200 Subject: [PATCH 4/5] Fix undefined behavior with --debug-xr Mistake in cb578ca1048d3. Before that, the extension vector was static, to make sure the extension name strings wouldn't get destructed when leaving the function. I didn't think that was an issue and couldn't recreate one, because until the previous commit we wouldn't actually add any extensions to the vector on Windows (the system I tested with). Use C++17's `std::string_view` now, which avoids the string copies `std::string` creates for itself and thus its destruction when leaving the local scope. --- intern/ghost/intern/GHOST_XrContext.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/intern/ghost/intern/GHOST_XrContext.cpp b/intern/ghost/intern/GHOST_XrContext.cpp index 0d8d42a72f7..3dbf539f0c7 100644 --- a/intern/ghost/intern/GHOST_XrContext.cpp +++ b/intern/ghost/intern/GHOST_XrContext.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "GHOST_Types.h" #include "GHOST_XrException.h" @@ -348,7 +349,7 @@ static bool openxr_layer_is_available(const std::vector la } static bool openxr_extension_is_available(const std::vector extensions_info, - const std::string &extension_name) + const std::string_view &extension_name) { for (const XrExtensionProperties &ext_info : extensions_info) { if (ext_info.extensionName == extension_name) { @@ -405,7 +406,7 @@ void GHOST_XrContext::getExtensionsToEnable( const std::vector &graphics_binding_types, std::vector &r_ext_names) { - std::vector try_ext; + std::vector try_ext; /* Try enabling debug extension. */ if (isDebugMode()) { @@ -422,9 +423,9 @@ void GHOST_XrContext::getExtensionsToEnable( r_ext_names.push_back(gpu_binding); } - for (const std::string &ext : try_ext) { + for (const std::string_view &ext : try_ext) { if (openxr_extension_is_available(m_oxr->extensions, ext)) { - r_ext_names.push_back(ext.c_str()); + r_ext_names.push_back(ext.data()); } } } From b3c08a3a0a9b0cd9e66bbf4bdeeedb6c2c5e7c76 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Fri, 14 Aug 2020 16:57:57 +0200 Subject: [PATCH 5/5] Fix constant lighting change in VR view when rotating head We have to explicitly enable fixed world space lighting. This was in fact already done, but overridden by the code to sync the 3D View shading settings to the VR view. --- source/blender/blenloader/intern/versioning_280.c | 8 ++++++-- source/blender/editors/space_view3d/view3d_view.c | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 111ac728cc3..51df61143e0 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -4951,8 +4951,6 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) const View3D *v3d_default = DNA_struct_default_get(View3D); wm->xr.session_settings.shading = v3d_default->shading; - /* Don't rotate light with the viewer by default, make it fixed. */ - wm->xr.session_settings.shading.flag |= V3D_SHADING_WORLD_ORIENTATION; wm->xr.session_settings.draw_flags = (V3D_OFSDRAW_SHOW_GRIDFLOOR | V3D_OFSDRAW_SHOW_ANNOTATION); wm->xr.session_settings.clip_start = v3d_default->clip_start; @@ -5110,6 +5108,12 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) { + /* Don't rotate light with the viewer by default, make it fixed. Shading settings can't be + * edited and this flag should always be set. So we can always execute this. */ + wm->xr.session_settings.shading.flag |= V3D_SHADING_WORLD_ORIENTATION; + } + /* Keep this block, even when empty. */ } } diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 66efa5b5de3..839f8c60a66 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1733,6 +1733,8 @@ void ED_view3d_xr_shading_update(wmWindowManager *wm, const View3D *v3d, const S { if (v3d->runtime.flag & V3D_RUNTIME_XR_SESSION_ROOT) { View3DShading *xr_shading = &wm->xr.session_settings.shading; + /* Flags that shouldn't be overridden by the 3D View shading. */ + const int flag_copy = V3D_SHADING_WORLD_ORIENTATION; BLI_assert(WM_xr_session_exists(&wm->xr)); @@ -1750,7 +1752,9 @@ void ED_view3d_xr_shading_update(wmWindowManager *wm, const View3D *v3d, const S } /* Copy shading from View3D to VR view. */ + const int old_xr_shading_flag = xr_shading->flag; *xr_shading = v3d->shading; + xr_shading->flag = (xr_shading->flag & ~flag_copy) | (old_xr_shading_flag & flag_copy); if (v3d->shading.prop) { xr_shading->prop = IDP_CopyProperty(xr_shading->prop); }