Browse Source

Avoid crash when CanvasTexture used with light decal atlas

The decal atlas is used for Light2Ds, decals, and Light3Ds
clayjohn 2 years ago
parent
commit
cfd5fe0f29

+ 3 - 0
drivers/gles3/rasterizer_canvas_gles3.cpp

@@ -1499,6 +1499,9 @@ void RasterizerCanvasGLES3::light_set_texture(RID p_rid, RID p_texture) {
 	if (cl->texture == p_texture) {
 		return;
 	}
+
+	ERR_FAIL_COND(p_texture.is_valid() && !texture_storage->owns_texture(p_texture));
+
 	if (cl->texture.is_valid()) {
 		texture_storage->texture_remove_from_texture_atlas(cl->texture);
 	}

+ 3 - 0
servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp

@@ -1550,6 +1550,9 @@ void RendererCanvasRenderRD::light_set_texture(RID p_rid, RID p_texture) {
 	if (cl->texture == p_texture) {
 		return;
 	}
+
+	ERR_FAIL_COND(p_texture.is_valid() && !texture_storage->owns_texture(p_texture));
+
 	if (cl->texture.is_valid()) {
 		texture_storage->texture_remove_from_decal_atlas(cl->texture);
 	}

+ 2 - 0
servers/rendering/renderer_rd/storage_rd/light_storage.cpp

@@ -232,6 +232,8 @@ void LightStorage::light_set_projector(RID p_light, RID p_texture) {
 		return;
 	}
 
+	ERR_FAIL_COND(p_texture.is_valid() && !texture_storage->owns_texture(p_texture));
+
 	if (light->type != RS::LIGHT_DIRECTIONAL && light->projector.is_valid()) {
 		texture_storage->texture_remove_from_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI);
 	}