Browse Source

Merge pull request #35216 from clayjohn/GLES2-texture3d

Gracefully handle 3D textures in GLES2
Rémi Verschelde 5 years ago
parent
commit
13b9d6fb77
1 changed files with 9 additions and 4 deletions
  1. 9 4
      drivers/gles2/rasterizer_storage_gles2.cpp

+ 9 - 4
drivers/gles2/rasterizer_storage_gles2.cpp

@@ -109,6 +109,7 @@ PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT
 #define glFramebufferTexture2DMultisample glFramebufferTexture2DMultisampleANGLE
 #endif
 
+#define GL_TEXTURE_3D 0x806F
 #define GL_MAX_SAMPLES 0x8D57
 #endif //!GLES_OVER_GL
 
@@ -565,11 +566,11 @@ void RasterizerStorageGLES2::texture_allocate(RID p_texture, int p_width, int p_
 			texture->target = GL_TEXTURE_CUBE_MAP;
 			texture->images.resize(6);
 		} break;
-		case VS::TEXTURE_TYPE_2D_ARRAY: {
-			texture->images.resize(p_depth_3d);
-		} break;
+		case VS::TEXTURE_TYPE_2D_ARRAY:
 		case VS::TEXTURE_TYPE_3D: {
-			texture->images.resize(p_depth_3d);
+			texture->target = GL_TEXTURE_3D;
+			ERR_PRINT("3D textures and Texture Arrays are not supported in GLES2. Please switch to the GLES3 backend.");
+			return;
 		} break;
 		default: {
 			ERR_PRINT("Unknown texture type!");
@@ -626,6 +627,10 @@ void RasterizerStorageGLES2::texture_set_data(RID p_texture, const Ref<Image> &p
 	Texture *texture = texture_owner.getornull(p_texture);
 
 	ERR_FAIL_COND(!texture);
+	if (texture->target == GL_TEXTURE_3D) {
+		// Target is set to a 3D texture or array texture, exit early to avoid spamming errors
+		return;
+	}
 	ERR_FAIL_COND(!texture->active);
 	ERR_FAIL_COND(texture->render_target);
 	ERR_FAIL_COND(texture->format != p_image->get_format());