From 889d8aaab3e8d7370f1f14e846ec06b3b601b0fb Mon Sep 17 00:00:00 2001
From: wwylele <wwylele@gmail.com>
Date: Sun, 11 Mar 2018 13:31:29 +0200
Subject: [PATCH] gl_rasterizer/cache: only reallocate cubemap when size/format
 mismatch

---
 .../renderer_opengl/gl_rasterizer_cache.cpp        | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 81ba557d9..1500519fc 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -1264,9 +1264,17 @@ void RasterizerCacheOpenGL::FillTextureCube(GLuint dest_handle,
     state.Apply();
     glActiveTexture(TextureUnits::TextureCube.Enum());
     FormatTuple format_tuple = GetFormatTuple(faces[0].surface->pixel_format);
-    for (auto& face : faces) {
-        glTexImage2D(face.gl_face, 0, format_tuple.internal_format, scaled_size, scaled_size, 0,
-                     format_tuple.format, format_tuple.type, nullptr);
+
+    GLint cur_size, cur_format;
+    glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_TEXTURE_WIDTH, &cur_size);
+    glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_TEXTURE_INTERNAL_FORMAT,
+                             &cur_format);
+
+    if (cur_size != scaled_size || cur_format != format_tuple.internal_format) {
+        for (auto& face : faces) {
+            glTexImage2D(face.gl_face, 0, format_tuple.internal_format, scaled_size, scaled_size, 0,
+                         format_tuple.format, format_tuple.type, nullptr);
+        }
     }
 
     state.draw.read_framebuffer = read_framebuffer.handle;