diff options
-rw-r--r-- | drivers/gles3/storage/texture_storage.h | 3 | ||||
-rw-r--r-- | platform/ios/os_ios.mm | 9 | ||||
-rw-r--r-- | servers/rendering/dummy/storage/texture_storage.h | 3 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp | 1 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | 1 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/renderer_scene_render_rd.cpp | 3 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/storage_rd/texture_storage.cpp | 26 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/storage_rd/texture_storage.h | 8 | ||||
-rw-r--r-- | servers/rendering/renderer_viewport.cpp | 5 | ||||
-rw-r--r-- | servers/rendering/storage/texture_storage.h | 3 | ||||
-rw-r--r-- | thirdparty/README.md | 3 | ||||
-rw-r--r-- | thirdparty/mingw-std-threads/godot.patch (renamed from thirdparty/mingw-std-threads/no_except.patch) | 68 | ||||
-rw-r--r-- | thirdparty/mingw-std-threads/mingw.condition_variable.h | 4 | ||||
-rw-r--r-- | thirdparty/mingw-std-threads/mingw.mutex.h | 2 | ||||
-rw-r--r-- | thirdparty/mingw-std-threads/mingw.shared_mutex.h | 4 | ||||
-rw-r--r-- | thirdparty/mingw-std-threads/mingw.thread.h | 3 |
16 files changed, 123 insertions, 23 deletions
diff --git a/drivers/gles3/storage/texture_storage.h b/drivers/gles3/storage/texture_storage.h index 87a07ebb36..27e358ec31 100644 --- a/drivers/gles3/storage/texture_storage.h +++ b/drivers/gles3/storage/texture_storage.h @@ -619,6 +619,9 @@ public: void render_target_clear_used(RID p_render_target); virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override {} + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override { return false; } + virtual void render_target_do_msaa_resolve(RID p_render_target) override {} virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr_2d) override {} virtual bool render_target_is_using_hdr(RID p_render_target) const override { return false; } diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index 68e6d4c934..16ac3acbec 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -72,16 +72,15 @@ HashMap<String, void *> OS_IOS::dynamic_symbol_lookup_table; void add_ios_init_callback(init_callback cb) { if (ios_init_callbacks_count == ios_init_callbacks_capacity) { - void *new_ptr = realloc(ios_init_callbacks, sizeof(cb) * 32); + void *new_ptr = realloc(ios_init_callbacks, sizeof(cb) * (ios_init_callbacks_capacity + 32)); if (new_ptr) { ios_init_callbacks = (init_callback *)(new_ptr); ios_init_callbacks_capacity += 32; + } else { + ERR_FAIL_MSG("Unable to allocate memory for extension callbacks."); } } - if (ios_init_callbacks_capacity > ios_init_callbacks_count) { - ios_init_callbacks[ios_init_callbacks_count] = cb; - ++ios_init_callbacks_count; - } + ios_init_callbacks[ios_init_callbacks_count++] = cb; } void register_dynamic_symbol(char *name, void *address) { diff --git a/servers/rendering/dummy/storage/texture_storage.h b/servers/rendering/dummy/storage/texture_storage.h index 2a72547810..b3a5323e66 100644 --- a/servers/rendering/dummy/storage/texture_storage.h +++ b/servers/rendering/dummy/storage/texture_storage.h @@ -177,6 +177,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) override {} virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override {} virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override { return RS::VIEWPORT_MSAA_DISABLED; } + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override {} + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override { return false; } + virtual void render_target_do_msaa_resolve(RID p_render_target) override {} virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr_2d) override {} virtual bool render_target_is_using_hdr(RID p_render_target) const override { return false; } diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index 462fc4b524..b1413a52e8 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -268,6 +268,7 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe target_buffer = texture_storage->render_target_get_rd_texture(render_target); } else { target_buffer = texture_storage->render_target_get_rd_texture_msaa(render_target); + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } ERR_FAIL_COND_V(target_buffer.is_null(), RID()); diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 0b1561939e..6ec9f0768a 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1116,6 +1116,7 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co fb_uniform_set = texture_storage->render_target_get_backbuffer_uniform_set(p_to_render_target); } else { framebuffer = texture_storage->render_target_get_rd_framebuffer(p_to_render_target); + texture_storage->render_target_set_msaa_needs_resolve(p_to_render_target, false); // If MSAA is enabled, our framebuffer will be resolved! if (texture_storage->render_target_is_clear_requested(p_to_render_target)) { clear = true; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 1a33f1d6e0..d4ed640247 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -586,6 +586,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende if (dest_is_msaa_2d) { dest_fb = FramebufferCacheRD::get_singleton()->get_cache(texture_storage->render_target_get_rd_texture_msaa(render_target)); + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } else { dest_fb = texture_storage->render_target_get_rd_framebuffer(render_target); } @@ -611,6 +612,8 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende RID source_texture = texture_storage->render_target_get_rd_texture(render_target); RID dest_fb = FramebufferCacheRD::get_singleton()->get_cache(texture_storage->render_target_get_rd_texture_msaa(render_target)); copy_effects->copy_to_fb_rect(source_texture, dest_fb, Rect2i(Point2i(), rb->get_target_size())); + + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } RD::get_singleton()->draw_command_end_label(); diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 678564a0e4..307cbd703a 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -3364,6 +3364,31 @@ RS::ViewportMSAA TextureStorage::render_target_get_msaa(RID p_render_target) con return rt->msaa; } +void TextureStorage::render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL(rt); + + rt->msaa_needs_resolve = p_needs_resolve; +} + +bool TextureStorage::render_target_get_msaa_needs_resolve(RID p_render_target) const { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL_V(rt, false); + + return rt->msaa_needs_resolve; +} + +void TextureStorage::render_target_do_msaa_resolve(RID p_render_target) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL(rt); + if (!rt->msaa_needs_resolve) { + return; + } + RD::get_singleton()->draw_list_begin(rt->get_framebuffer(), RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); + RD::get_singleton()->draw_list_end(); + rt->msaa_needs_resolve = false; +} + void TextureStorage::render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) { RenderTarget *rt = render_target_owner.get_or_null(p_render_target); ERR_FAIL_NULL(rt); @@ -3479,6 +3504,7 @@ void TextureStorage::render_target_do_clear_request(RID p_render_target) { RD::get_singleton()->draw_list_begin(rt->get_framebuffer(), RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, clear_colors); RD::get_singleton()->draw_list_end(); rt->clear_requested = false; + rt->msaa_needs_resolve = false; } void TextureStorage::render_target_set_sdf_size_and_scale(RID p_render_target, RS::ViewportSDFOversize p_size, RS::ViewportSDFScale p_scale) { diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.h b/servers/rendering/renderer_rd/storage_rd/texture_storage.h index 276c8c4ce2..c665b02e14 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.h @@ -331,9 +331,10 @@ private: uint32_t view_count; RID color; Vector<RID> color_slices; - RID color_multisample; // Needed when MSAA is enabled. + RID color_multisample; // Needed when 2D MSAA is enabled. - RS::ViewportMSAA msaa = RS::VIEWPORT_MSAA_DISABLED; + RS::ViewportMSAA msaa = RS::VIEWPORT_MSAA_DISABLED; // 2D MSAA mode + bool msaa_needs_resolve = false; // 2D MSAA needs resolved //used for retrieving from CPU RD::DataFormat color_format = RD::DATA_FORMAT_R4G4_UNORM_PACK8; @@ -718,6 +719,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) override; virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override; + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override; + virtual void render_target_do_msaa_resolve(RID p_render_target) override; virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) override; virtual bool render_target_is_using_hdr(RID p_render_target) const override; diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index d0a6542fe4..a246420bff 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -622,6 +622,11 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { RSG::texture_storage->render_target_do_clear_request(p_viewport->render_target); } + if (RSG::texture_storage->render_target_get_msaa_needs_resolve(p_viewport->render_target)) { + WARN_PRINT_ONCE("2D MSAA is enabled while there is no 2D content. Disable 2D MSAA for better performance."); + RSG::texture_storage->render_target_do_msaa_resolve(p_viewport->render_target); + } + if (p_viewport->measure_render_time) { String rt_id = "vp_end_" + itos(p_viewport->self.get_id()); RSG::utilities->capture_timestamp(rt_id); diff --git a/servers/rendering/storage/texture_storage.h b/servers/rendering/storage/texture_storage.h index 6332dd578e..cf37fbfb4a 100644 --- a/servers/rendering/storage/texture_storage.h +++ b/servers/rendering/storage/texture_storage.h @@ -151,6 +151,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) = 0; virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) = 0; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const = 0; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) = 0; + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const = 0; + virtual void render_target_do_msaa_resolve(RID p_render_target) = 0; virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) = 0; virtual bool render_target_is_using_hdr(RID p_render_target) const = 0; diff --git a/thirdparty/README.md b/thirdparty/README.md index 0baa5f85bc..52962c1c87 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -530,7 +530,8 @@ Files extracted from upstream repository: - `mingw.shared_mutex.h` - `mingw.thread.h` -Once copied, apply `no_except.patch` (needed because Godot is built without exceptions). +Once copied, apply `godot.patch` (needed because Godot is built without exceptions +and to avoid std:: replacements leak in Clang builds). ## minimp3 diff --git a/thirdparty/mingw-std-threads/no_except.patch b/thirdparty/mingw-std-threads/godot.patch index 6151103a8a..9d772a2e53 100644 --- a/thirdparty/mingw-std-threads/no_except.patch +++ b/thirdparty/mingw-std-threads/godot.patch @@ -1,7 +1,16 @@ diff --git a/thirdparty/mingw-std-threads/mingw.condition_variable.h b/thirdparty/mingw-std-threads/mingw.condition_variable.h -index 50c5ebd6df..f9e248c154 100644 +index 50c5ebd6df..d099fad2ec 100644 --- a/thirdparty/mingw-std-threads/mingw.condition_variable.h +++ b/thirdparty/mingw-std-threads/mingw.condition_variable.h +@@ -58,7 +58,7 @@ + + namespace mingw_stdthread + { +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + enum class cv_status { no_timeout, timeout }; + #else + using std::cv_status; @@ -87,12 +87,12 @@ public: : mSemaphore(CreateSemaphoreA(NULL, 0, 0xFFFF, NULL)) { @@ -26,8 +35,17 @@ index 50c5ebd6df..f9e248c154 100644 } } public: +@@ -547,7 +547,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::cv_status; + using mingw_stdthread::condition_variable; + using mingw_stdthread::condition_variable_any; diff --git a/thirdparty/mingw-std-threads/mingw.mutex.h b/thirdparty/mingw-std-threads/mingw.mutex.h -index 03efa13f8b..73698d13cb 100644 +index 03efa13f8b..1e881e6c7d 100644 --- a/thirdparty/mingw-std-threads/mingw.mutex.h +++ b/thirdparty/mingw-std-threads/mingw.mutex.h @@ -132,7 +132,7 @@ struct _OwnerThread @@ -55,8 +73,17 @@ index 03efa13f8b..73698d13cb 100644 } bool try_lock() { +@@ -480,7 +480,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::recursive_mutex; + using mingw_stdthread::mutex; + using mingw_stdthread::recursive_timed_mutex; diff --git a/thirdparty/mingw-std-threads/mingw.shared_mutex.h b/thirdparty/mingw-std-threads/mingw.shared_mutex.h -index ff1ac65135..5375b0fbd1 100644 +index ff1ac65135..ddc46bb826 100644 --- a/thirdparty/mingw-std-threads/mingw.shared_mutex.h +++ b/thirdparty/mingw-std-threads/mingw.shared_mutex.h @@ -134,7 +134,7 @@ public: @@ -98,12 +125,28 @@ index ff1ac65135..5375b0fbd1 100644 mMutex->unlock_shared(); mOwns = false; } +@@ -484,10 +484,10 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) ++#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) + using mingw_stdthread::shared_mutex; + #endif +-#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) ++#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) + using mingw_stdthread::shared_timed_mutex; + using mingw_stdthread::shared_lock; + #elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition diff --git a/thirdparty/mingw-std-threads/mingw.thread.h b/thirdparty/mingw-std-threads/mingw.thread.h -index bcdd1a36a8..7ca09e25f5 100644 +index bcdd1a36a8..60d2200db2 100644 --- a/thirdparty/mingw-std-threads/mingw.thread.h +++ b/thirdparty/mingw-std-threads/mingw.thread.h -@@ -196,7 +196,7 @@ public: - int errnum = errno; +@@ -193,10 +193,9 @@ public: + if (int_handle == 0) + { + mHandle = kInvalidHandle; +- int errnum = errno; delete call; // Note: Should only throw EINVAL, EAGAIN, EACCES - throw std::system_error(errnum, std::generic_category()); @@ -111,7 +154,7 @@ index bcdd1a36a8..7ca09e25f5 100644 } else { mThreadId.mId = id_receiver; mHandle = reinterpret_cast<HANDLE>(int_handle); -@@ -213,11 +213,11 @@ public: +@@ -213,11 +212,11 @@ public: { using namespace std; if (get_id() == id(GetCurrentThreadId())) @@ -126,7 +169,7 @@ index bcdd1a36a8..7ca09e25f5 100644 WaitForSingleObject(mHandle, kInfinite); CloseHandle(mHandle); mHandle = kInvalidHandle; -@@ -266,7 +266,7 @@ moving another thread to it.\n"); +@@ -266,7 +265,7 @@ moving another thread to it.\n"); if (!joinable()) { using namespace std; @@ -135,3 +178,12 @@ index bcdd1a36a8..7ca09e25f5 100644 } if (mHandle != kInvalidHandle) { +@@ -326,7 +325,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::thread; + // Remove ambiguity immediately, to avoid problems arising from the above. + //using std::thread; diff --git a/thirdparty/mingw-std-threads/mingw.condition_variable.h b/thirdparty/mingw-std-threads/mingw.condition_variable.h index f9e248c154..d099fad2ec 100644 --- a/thirdparty/mingw-std-threads/mingw.condition_variable.h +++ b/thirdparty/mingw-std-threads/mingw.condition_variable.h @@ -58,7 +58,7 @@ namespace mingw_stdthread { -#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) enum class cv_status { no_timeout, timeout }; #else using std::cv_status; @@ -547,7 +547,7 @@ namespace std // was none. Direct specification (std::), however, would be unaffected. // Take the safe option, and include only in the presence of MinGW's win32 // implementation. -#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) using mingw_stdthread::cv_status; using mingw_stdthread::condition_variable; using mingw_stdthread::condition_variable_any; diff --git a/thirdparty/mingw-std-threads/mingw.mutex.h b/thirdparty/mingw-std-threads/mingw.mutex.h index 73698d13cb..1e881e6c7d 100644 --- a/thirdparty/mingw-std-threads/mingw.mutex.h +++ b/thirdparty/mingw-std-threads/mingw.mutex.h @@ -480,7 +480,7 @@ namespace std // was none. Direct specification (std::), however, would be unaffected. // Take the safe option, and include only in the presence of MinGW's win32 // implementation. -#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) using mingw_stdthread::recursive_mutex; using mingw_stdthread::mutex; using mingw_stdthread::recursive_timed_mutex; diff --git a/thirdparty/mingw-std-threads/mingw.shared_mutex.h b/thirdparty/mingw-std-threads/mingw.shared_mutex.h index 5375b0fbd1..ddc46bb826 100644 --- a/thirdparty/mingw-std-threads/mingw.shared_mutex.h +++ b/thirdparty/mingw-std-threads/mingw.shared_mutex.h @@ -484,10 +484,10 @@ namespace std // was none. Direct specification (std::), however, would be unaffected. // Take the safe option, and include only in the presence of MinGW's win32 // implementation. -#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) +#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) using mingw_stdthread::shared_mutex; #endif -#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) +#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) using mingw_stdthread::shared_timed_mutex; using mingw_stdthread::shared_lock; #elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition diff --git a/thirdparty/mingw-std-threads/mingw.thread.h b/thirdparty/mingw-std-threads/mingw.thread.h index 7ca09e25f5..60d2200db2 100644 --- a/thirdparty/mingw-std-threads/mingw.thread.h +++ b/thirdparty/mingw-std-threads/mingw.thread.h @@ -193,7 +193,6 @@ public: if (int_handle == 0) { mHandle = kInvalidHandle; - int errnum = errno; delete call; // Note: Should only throw EINVAL, EAGAIN, EACCES __builtin_trap(); @@ -326,7 +325,7 @@ namespace std // was none. Direct specification (std::), however, would be unaffected. // Take the safe option, and include only in the presence of MinGW's win32 // implementation. -#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) using mingw_stdthread::thread; // Remove ambiguity immediately, to avoid problems arising from the above. //using std::thread; |