[Bf-blender-cvs] [141e94f87ff] blender2.8: Fix T55888: Eevee: crash when shadow cube size is > 512px

Clément Foucault noreply at git.blender.org
Fri Jul 27 13:58:49 CEST 2018


Commit: 141e94f87ff29452ed8df82b4c25d8d134a34dad
Author: Clément Foucault
Date:   Fri Jul 27 13:56:07 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB141e94f87ff29452ed8df82b4c25d8d134a34dad

Fix T55888: Eevee: crash when shadow cube size is > 512px

Note that this was only reported to happen on AMD GPU + windows.

===================================================================

M	source/blender/gpu/intern/gpu_extensions.c
M	source/blender/gpu/intern/gpu_texture.c

===================================================================

diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index dff6cfb74a8..43081154e89 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -66,6 +66,7 @@
 
 static struct GPUGlobal {
 	GLint maxtexsize;
+	GLint maxtexlayers;
 	GLint maxcubemapsize;
 	GLint maxtextures;
 	GLint maxubosize;
@@ -96,6 +97,11 @@ int GPU_max_texture_size(void)
 	return GG.maxtexsize;
 }
 
+int GPU_max_texture_layers(void)
+{
+	return GG.maxtexlayers;
+}
+
 int GPU_max_textures(void)
 {
 	return GG.maxtextures;
@@ -142,6 +148,7 @@ void gpu_extensions_init(void)
 	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
 
 	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GG.maxtexsize);
+	glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &GG.maxtexlayers);
 	glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &GG.maxcubemapsize);
 
 	if (GLEW_EXT_texture_filter_anisotropic)
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 5ac746ec9c1..f5b52db1c85 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -432,6 +432,11 @@ static bool gpu_texture_try_alloc(
 			glTexImage2D(proxy, 0, internalformat, tex->w, tex->h, 0, data_format, data_type, NULL);
 			break;
 		case GL_PROXY_TEXTURE_2D_ARRAY:
+			/* HACK: Some driver wrongly check GL_PROXY_TEXTURE_2D_ARRAY as a GL_PROXY_TEXTURE_3D
+			 * checking all dimensions against GPU_max_texture_layers (see T55888). */
+			return (tex->w < GPU_max_texture_size()) &&
+			       (tex->h < GPU_max_texture_size()) &&
+			       (tex->d < GPU_max_texture_layers());
 		case GL_PROXY_TEXTURE_3D:
 			glTexImage3D(proxy, 0, internalformat, tex->w, tex->h, tex->d, 0, data_format, data_type, NULL);
 			break;



More information about the Bf-blender-cvs mailing list