diff options
author | Brecht Van Lommel <brecht@blender.org> | 2022-08-19 22:02:02 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-08-19 22:02:02 +0300 |
commit | 6b9209ddfab375c55b73c11ac798b76345b822a0 (patch) | |
tree | 08aa1760f2aebe814f4c11e04d3b1f5141800c13 | |
parent | 6ef4267d5ef6fe91069c1ce1a131f49534eeb516 (diff) | |
parent | 51b79e4775e1f661df9aac60b7d355b72aa8b748 (diff) |
Merge branch 'blender-v3.3-release'
-rw-r--r-- | intern/cycles/blender/CMakeLists.txt | 1 | ||||
-rw-r--r-- | intern/cycles/blender/display_driver.cpp | 24 | ||||
-rw-r--r-- | intern/cycles/graph/node_type.h | 2 | ||||
-rw-r--r-- | intern/cycles/util/defines.h | 40 |
4 files changed, 24 insertions, 43 deletions
diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt index ab0937ac9eb..72f8a4cc15d 100644 --- a/intern/cycles/blender/CMakeLists.txt +++ b/intern/cycles/blender/CMakeLists.txt @@ -8,6 +8,7 @@ set(INC ../../../source/blender/makesdna ../../../source/blender/makesrna ../../../source/blender/blenlib + ../../../source/blender/gpu ${CMAKE_BINARY_DIR}/source/blender/makesrna/intern ) diff --git a/intern/cycles/blender/display_driver.cpp b/intern/cycles/blender/display_driver.cpp index 61cd88fb433..30ad3ecad51 100644 --- a/intern/cycles/blender/display_driver.cpp +++ b/intern/cycles/blender/display_driver.cpp @@ -7,6 +7,8 @@ #include "util/log.h" #include "util/opengl.h" +#include "GPU_platform.h" + extern "C" { struct RenderEngine; @@ -507,6 +509,7 @@ class DrawTileAndPBO { DrawTile tile; GLPixelBufferObject buffer_object; + bool need_update_texture_pixels = false; }; /* -------------------------------------------------------------------- @@ -585,6 +588,8 @@ void BlenderDisplayDriver::next_tile_begin() /* Moving to the next tile without giving render data for the current tile is not an expected * situation. */ DCHECK(!need_clear_); + /* Texture should have been updated from the PBO at this point. */ + DCHECK(!tiles_->current_tile.need_update_texture_pixels); tiles_->finished_tiles.tiles.emplace_back(std::move(tiles_->current_tile.tile)); } @@ -702,8 +707,18 @@ void BlenderDisplayDriver::update_end() * One concern with this approach is that if the update happens more often than drawing then * doing the unpack here occupies GPU transfer for no good reason. However, the render scheduler * takes care of ensuring updates don't happen that often. In regular applications redraw will - * happen much more often than this update. */ - update_tile_texture_pixels(tiles_->current_tile); + * happen much more often than this update. + * + * On some older GPUs on macOS, there is a driver crash when updating the texture for viewport + * renders while Blender is drawing. As a workaround update texture during draw, under assumption + * that there is no graphics interop on macOS and viewport render has a single tile. */ + if (use_gl_context_ && + GPU_type_matches_ex(GPU_DEVICE_NVIDIA, GPU_OS_MAC, GPU_DRIVER_ANY, GPU_BACKEND_ANY)) { + tiles_->current_tile.need_update_texture_pixels = true; + } + else { + update_tile_texture_pixels(tiles_->current_tile); + } gl_upload_sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); glFlush(); @@ -953,6 +968,11 @@ void BlenderDisplayDriver::draw(const Params ¶ms) glEnableVertexAttribArray(texcoord_attribute); glEnableVertexAttribArray(position_attribute); + if (tiles_->current_tile.need_update_texture_pixels) { + update_tile_texture_pixels(tiles_->current_tile); + tiles_->current_tile.need_update_texture_pixels = false; + } + draw_tile(zoom_, texcoord_attribute, position_attribute, diff --git a/intern/cycles/graph/node_type.h b/intern/cycles/graph/node_type.h index 65b16c9bf75..9101b51bb9f 100644 --- a/intern/cycles/graph/node_type.h +++ b/intern/cycles/graph/node_type.h @@ -171,7 +171,7 @@ struct NodeType { #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \ { \ static datatype defval = default_value; \ - CHECK_TYPE(T::name, datatype); \ + static_assert(std::is_same_v<decltype(T::name), datatype>); \ type->register_input(ustring(#name), \ ustring(ui_name), \ TYPE, \ diff --git a/intern/cycles/util/defines.h b/intern/cycles/util/defines.h index c7118ca09c9..1969529eff0 100644 --- a/intern/cycles/util/defines.h +++ b/intern/cycles/util/defines.h @@ -89,46 +89,6 @@ # define UNLIKELY(x) (x) #endif -#if defined(__GNUC__) || defined(__clang__) -# if defined(__cplusplus) -/* Some magic to be sure we don't have reference in the type. */ -template<typename T> static inline T decltype_helper(T x) -{ - return x; -} -# define TYPEOF(x) decltype(decltype_helper(x)) -# else -# define TYPEOF(x) typeof(x) -# endif -#endif - -/* Causes warning: - * incompatible types when assigning to type 'Foo' from type 'Bar' - * ... the compiler optimizes away the temp var */ -#ifdef __GNUC__ -# define CHECK_TYPE(var, type) \ - { \ - TYPEOF(var) * __tmp; \ - __tmp = (type *)NULL; \ - (void)__tmp; \ - } \ - (void)0 - -# define CHECK_TYPE_PAIR(var_a, var_b) \ - { \ - TYPEOF(var_a) * __tmp; \ - __tmp = (typeof(var_b) *)NULL; \ - (void)__tmp; \ - } \ - (void)0 -#else -# define CHECK_TYPE(var, type) -# define CHECK_TYPE_PAIR(var_a, var_b) -#endif - -/* can be used in simple macros */ -#define CHECK_TYPE_INLINE(val, type) ((void)(((type)0) != (val))) - #ifndef __KERNEL_GPU__ # include <cassert> # define util_assert(statement) assert(statement) |