### Godot version

v4.0.3.stable.mono.official [5222a99f5]

### System information

Windows 11, Forward+, Nvidia 3070 latest driver

### Issue description

When instancing many GPUParticles2D, occasionally the following error will be printed to the debugger console:

```
E 0:15:35:0980   compute_list_dispatch: Uniforms were never supplied for set (3) at the time of drawing, which are required by the pipeline
  <C++ Error>    Method/function failed.
  <C++ Source>   drivers/vulkan/rendering_device_vulkan.cpp:8007 @ compute_list_dispatch()
```

Massive artifacts coincide with this error. See example below:

https://github.com/godotengine/godot/assets/4622925/07b31c12-5388-4977-9c13-e91c8b6442fb

I am having difficulty recreating the exact conditions for this error. It seems to happen when many GPU particles are added to the tree at around the same time.

### Steps to reproduce

1. Instance many particles at once.

I realize this isn't helpful. I'm going to do more investigation to see if I can get more accurate reproduction steps.

### Minimal reproduction project

N/A yet
pipelines_cache.current_size = p_pso_blob_size;
	pipelines_cache.buffer.clear();
	pipelines_cache.buffer.resize(p_pso_blob_size);
	VkResult vr = vkGetPipelineCacheData(device, pipelines_cache.cache_object, &p_pso_blob_size, pipelines_cache.buffer.ptrw());
	ERR_FAIL_COND(vr);
	print_verbose(vformat("Updated PSO cache (%.1f MiB)", p_pso_blob_size / (1024.0f * 1024.0f)));
	VkPhysicalDeviceProperties props;
	vkGetPhysicalDeviceProperties(context->get_physical_device(), &props);
	PipelineCacheHeader header = {};
	header.magic = 868 + VK_PIPELINE_CACHE_HEADER_VERSION_ONE;
	header.data_size = pipelines_cache.buffer.size();
	header.data_hash = hash_murmur3_buffer(pipelines_cache.buffer.ptr(), pipelines_cache.buffer.size());
	header.device_id = props.deviceID;
	header.vendor_id = props.vendorID;
	header.driver_version = props.driverVersion;
	for (size_t i = 0; i < VK_UUID_SIZE; i++) {
		header.uuid[i] = props.pipelineCacheUUID[i];
	}
	header.driver_abi = sizeof(void *);
	Ref<FileAccess> f = FileAccess::open("user://vulkan/pipelines.cache", FileAccess::WRITE, nullptr);
	if (f.is_valid()) {
		f->store_buffer((const uint8_t *)&header, sizeof(PipelineCacheHeader));
		f->store_buffer(pipelines_cache.buffer);
	}
}
template <class T>
void RenderingDeviceVulkan::_free_rids(T &p_owner, const char *p_type) {