Potential workaround for driver bug related to canvas mipmaps

This commit is contained in:
Alex Szpakowski
2020-12-25 16:13:29 -04:00
parent 9c4db00e94
commit 4f730e930b
+17
View File
@@ -60,12 +60,26 @@ static GLenum createFBO(GLuint &framebuffer, TextureType texType, PixelFormat fo
// Make sure all faces and layers of the texture are initialized to // Make sure all faces and layers of the texture are initialized to
// transparent black. This is unfortunately probably pretty slow for // transparent black. This is unfortunately probably pretty slow for
// 2D-array and 3D textures with a lot of layers... // 2D-array and 3D textures with a lot of layers...
// Iterate backwards to make sure mip/layer/face 0 is bound at the end.
for (int mip = nb_mips - 1; mip >= 0; mip--) for (int mip = nb_mips - 1; mip >= 0; mip--)
{ {
int nlayers = layers; int nlayers = layers;
if (texType == TEXTURE_VOLUME) if (texType == TEXTURE_VOLUME)
nlayers = std::max(layers >> mip, 1); nlayers = std::max(layers >> mip, 1);
GLuint tempframebuffer = 0;
if (mip > 0)
{
// Some Intel drivers on Windows don't like reusing the same
// FBO for different sized attachments, so use a temporary one
// to clear smaller mips.
// https://github.com/love2d/love/issues/1585
glGenFramebuffers(1, &tempframebuffer);
gl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, tempframebuffer);
}
else
gl.bindFramebuffer(OpenGL::FRAMEBUFFER_ALL, framebuffer);
for (int layer = nlayers - 1; layer >= 0; layer--) for (int layer = nlayers - 1; layer >= 0; layer--)
{ {
for (int face = faces - 1; face >= 0; face--) for (int face = faces - 1; face >= 0; face--)
@@ -98,6 +112,9 @@ static GLenum createFBO(GLuint &framebuffer, TextureType texType, PixelFormat fo
} }
} }
} }
if (tempframebuffer != 0)
gl.deleteFramebuffer(tempframebuffer);
} }
} }