diff --git a/MobileGL/Includes.h b/MobileGL/Includes.h index 2400bcbb..e6f303ed 100644 --- a/MobileGL/Includes.h +++ b/MobileGL/Includes.h @@ -33,6 +33,7 @@ #include #include #include +#include // Include FastSTL #include diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index b7042714..508bfa89 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -191,6 +191,8 @@ namespace MobileGL::MG_Backend::DirectGLES { // 1. textures bound to texture units (TODO: only sync ones that are used in current program) // 2. textures used in current FBO // 3. textures bound to image units (TODO) + constexpr SizeT TextureTargetCount = static_cast(TextureTarget::TextureTargetCount); + std::bitset dirtyTextureTargetBits; Vector> texturesToSync; @@ -202,6 +204,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& end = texturesToSync.end(); if (std::find(texturesToSync.begin(), end, textureObject) == end) { texturesToSync.push_back(textureObject); + dirtyTextureTargetBits.set(static_cast(textureObject->GetTarget())); } } } @@ -217,11 +220,23 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& end = texturesToSync.end(); if (std::find(texturesToSync.begin(), end, textureObject) == end) { texturesToSync.push_back(textureObject); + dirtyTextureTargetBits.set(static_cast(textureObject->GetTarget())); } } } } + BufferImpl::BackendBufferBindingProtector pixelUnpackProtector = + BufferImpl::BackendBufferBindingProtector(GL_PIXEL_UNPACK_BUFFER); + + Vector textureBindingProtectors; + for (SizeT target = 0; target < TextureTargetCount; ++target) { + if (dirtyTextureTargetBits[target]) { + textureBindingProtectors.emplace_back( + MG_Util::ConvertTextureTargetToGLEnum(static_cast(target))); + } + } + // Do real sync for (auto& textureObject : texturesToSync) { SyncTextureObjectToBackend(textureObject); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 92c8071f..2e0e5770 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -328,7 +328,7 @@ namespace MobileGL::MG_Backend::DirectGLES { return; } - BackendTextureBindingProtector backendTextureBindingProtector(target); + // BackendTextureBindingProtector backendTextureBindingProtector(target); Bind(target); errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str());