### Godot version

v4.1.beta3.official [ada712e06]

### System information

Godot v4.1.beta3 - Windows 10.0.22621 - Vulkan (Mobile) - dedicated NVIDIA GeForce RTX 2080 with Max-Q Design (NVIDIA; 31.0.15.3161) - Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz (12 Threads)

### Issue description

I am using the main renderingdevice to do offscreen drawing to a texture. If I use the same code on a local rendering device created using `RenderingServer.create_local_rendering_device()`, it works fine, but the moment I do anything on the main rendering device (from RenderingServer.get_rendering_device() ), my code will run for one or two frames, then the game quits silently.

I've narrowed it down with a passthrough shader and no actual draw calls - just any call to `draw_list_begin` and `draw_list_end`, and it dies.

If you use single threaded renderingdevice, it works.

I feel like this is a good test of the stability of the vulkan multithreading ( see https://github.com/godotengine/godot-proposals/discussions/7163 ) - if we want to allow multithreaded use of a single renderingdevice, then this should work.

### Steps to reproduce

Hit play on the project below. It will hopefully print out before, inside, after, then silently quit. Does on mine at least, on dev builds and on 4.1b3. If you set rendering to single-threaded (safe or unsafe), then it works happily.



### Minimal reproduction project

[crashtest.zip](https://github.com/godotengine/godot/files/11892220/crashtest.zip)

}
	if (p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) {
		image_create_info.usage |= VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
	}
	if (p_format.usage_bits & TEXTURE_USAGE_CAN_UPDATE_BIT) {
		image_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
	}
	if (p_format.usage_bits & TEXTURE_USAGE_CAN_COPY_FROM_BIT) {
		image_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
	}
	if (p_format.usage_bits & TEXTURE_USAGE_CAN_COPY_TO_BIT) {
		image_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
	}
	image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
	image_create_info.queueFamilyIndexCount = 0;
	image_create_info.pQueueFamilyIndices = nullptr;
	image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
	uint32_t required_mipmaps = get_image_required_mipmaps(image_create_info.extent.width, image_create_info.extent.height, image_create_info.extent.depth);
	ERR_FAIL_COND_V_MSG(required_mipmaps < image_create_info.mipLevels, RID(),
			"Too many mipmaps requested for texture format and dimensions (" + itos(image_create_info.mipLevels) + "), maximum allowed: (" + itos(required_mipmaps) + ").");
	if (p_data.size()) {
		ERR_FAIL_COND_V_MSG(!(p_format.usage_bits & TEXTURE_USAGE_CAN_UPDATE_BIT), RID(),
				"Texture needs the TEXTURE_USAGE_CAN_UPDATE_BIT usage flag in order to be updated at initialization or later");
		int expected_images = image_create_info.arrayLayers;
		ERR_FAIL_COND_V_MSG(p_data.size() != expected_images, RID(),
				"Default supplied data for image format is of invalid length (" + itos(p_data.size()) + "), should be (" + itos(expected_images) + ").");
		for (uint32_t i = 0; i < image_create_info.arrayLayers; i++) {
			uint32_t required_size = get_image_format_required_size(p_format.format, image_create_info.extent.width, image_create_info.extent.height, image_create_info.extent.depth, image_create_info.mipLevels);
			ERR_FAIL_COND_V_MSG((uint32_t)p_data[i].size() != required_size, RID(),
					"Data for slice index " + itos(i) + " (mapped to layer " + itos(i) + ") differs in size (supplied: " + itos(p_data[i].size()) + ") than what is required by the format (" + itos(required_size) + ").");