### 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
RenderingDeviceVulkanShaderBinaryDataBinding binding{};
				binding.type = (uint32_t)spirv_uniform.type;
				binding.binding = spirv_uniform.binding;
				binding.stages = (uint32_t)spirv_uniform.stages_mask;
				binding.length = spirv_uniform.length;
				binding.writable = (uint32_t)spirv_uniform.writable;
				set_bindings.push_back(binding);
			}
			uniform_info.push_back(set_bindings);
		}
		for (const SpirvReflectionData::SpecializationConstant &spirv_sc : spirv_data.specialization_constants) {
			RenderingDeviceVulkanShaderBinarySpecializationConstant spec_constant{};
			spec_constant.type = (uint32_t)spirv_sc.type;
			spec_constant.constant_id = spirv_sc.constant_id;
			spec_constant.int_value = spirv_sc.int_value;
			spec_constant.stage_flags = (uint32_t)spirv_sc.stages_mask;
			specialization_constants.push_back(spec_constant);
		}
	}
	Vector<Vector<uint8_t>> compressed_stages;
	Vector<uint32_t> smolv_size;
	Vector<uint32_t> zstd_size; 
	uint32_t stages_binary_size = 0;
	bool strip_debug = false;
	for (int i = 0; i < p_spirv.size(); i++) {
		smolv::ByteArray smolv;
		if (!smolv::Encode(p_spirv[i].spir_v.ptr(), p_spirv[i].spir_v.size(), smolv, strip_debug ? smolv::kEncodeFlagStripDebugInfo : 0)) {
			ERR_FAIL_V_MSG(Vector<uint8_t>(), "Error compressing shader stage :" + String(shader_stage_names[p_spirv[i].shader_stage]));
		} else {
			smolv_size.push_back(smolv.size());