From 65659e2ab63f028a16cb361769dd5c86e85529b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= Date: Fri, 7 Sep 2018 10:21:28 +0200 Subject: [PATCH] Fix OpenGL renderer stuttering when loading new textures into atlas --- .../drawing/engines/opengl/TextureCache.cpp | 30 +++++++++++++------ .../drawing/engines/opengl/TextureCache.h | 1 + 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp index d35faffcb0..211bfb0558 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp @@ -136,6 +136,7 @@ void TextureCache::CreateTextures() _initialized = true; _atlasesTextureIndices = 0; + _atlasesTextureCapacity = 0; } } @@ -169,22 +170,33 @@ void TextureCache::EnlargeAtlasesTexture(GLuint newEntries) GLuint newIndices = _atlasesTextureIndices + newEntries; - // Retrieve current array data - auto oldPixels = std::vector(_atlasesTextureDimensions * _atlasesTextureDimensions * _atlasesTextureIndices); - if (oldPixels.size() > 0) + std::vector oldPixels; + + if (newIndices > _atlasesTextureCapacity) { - glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, oldPixels.data()); + // Retrieve current array data, growing buffer. + oldPixels.resize(_atlasesTextureDimensions * _atlasesTextureDimensions * _atlasesTextureCapacity); + if (oldPixels.size() > 0) + { + glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, oldPixels.data()); + } + + // Initial capacity will be 12 which covers most cases of a fully visible park. + _atlasesTextureCapacity = (_atlasesTextureCapacity + 6) << 1; } glBindTexture(GL_TEXTURE_2D_ARRAY, _atlasesTexture); glTexImage3D( - GL_TEXTURE_2D_ARRAY, 0, GL_R8UI, _atlasesTextureDimensions, _atlasesTextureDimensions, newIndices, 0, GL_RED_INTEGER, - GL_UNSIGNED_BYTE, nullptr); + GL_TEXTURE_2D_ARRAY, 0, GL_R8UI, _atlasesTextureDimensions, _atlasesTextureDimensions, _atlasesTextureCapacity, 0, + GL_RED_INTEGER, GL_UNSIGNED_BYTE, nullptr); // Restore old data - glTexSubImage3D( - GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, _atlasesTextureDimensions, _atlasesTextureDimensions, _atlasesTextureIndices, - GL_RED_INTEGER, GL_UNSIGNED_BYTE, oldPixels.data()); + if (oldPixels.size() > 0) + { + glTexSubImage3D( + GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, _atlasesTextureDimensions, _atlasesTextureDimensions, _atlasesTextureIndices, + GL_RED_INTEGER, GL_UNSIGNED_BYTE, oldPixels.data()); + } _atlasesTextureIndices = newIndices; } diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.h b/src/openrct2-ui/drawing/engines/opengl/TextureCache.h index 69ac59783b..7e60c29a3c 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.h +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.h @@ -189,6 +189,7 @@ private: GLuint _atlasesTexture = 0; GLint _atlasesTextureDimensions = 0; + GLuint _atlasesTextureCapacity = 0; GLuint _atlasesTextureIndices = 0; GLint _atlasesTextureIndicesLimit = 0; std::vector _atlases;