### 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
}
	return ret;
}
RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_shader_binary) {
	const uint8_t *binptr = p_shader_binary.ptr();
	uint32_t binsize = p_shader_binary.size();
	uint32_t read_offset = 0;
	
	ERR_FAIL_COND_V(binsize < sizeof(uint32_t) * 3 + sizeof(RenderingDeviceVulkanShaderBinaryData), RID());
	ERR_FAIL_COND_V(binptr[0] != 'G' || binptr[1] != 'S' || binptr[2] != 'B' || binptr[3] != 'D', RID());
	uint32_t bin_version = decode_uint32(binptr + 4);
	ERR_FAIL_COND_V(bin_version != SHADER_BINARY_VERSION, RID());
	uint32_t bin_data_size = decode_uint32(binptr + 8);
	const RenderingDeviceVulkanShaderBinaryData &binary_data = *(reinterpret_cast<const RenderingDeviceVulkanShaderBinaryData *>(binptr + 12));
	Shader::PushConstant push_constant;
	push_constant.size = binary_data.push_constant_size;
	push_constant.vk_stages_mask = binary_data.push_constant_vk_stages_mask;
	uint32_t vertex_input_mask = binary_data.vertex_input_mask;
	uint32_t fragment_output_mask = binary_data.fragment_output_mask;
	bool is_compute = binary_data.is_compute;
	const uint32_t compute_local_size[3] = { binary_data.compute_local_size[0], binary_data.compute_local_size[1], binary_data.compute_local_size[2] };
	read_offset += sizeof(uint32_t) * 3 + bin_data_size;
	String name;
	if (binary_data.shader_name_len) {
		name.parse_utf8((const char *)(binptr + read_offset), binary_data.shader_name_len);
		read_offset += binary_data.shader_name_len;
		if ((binary_data.shader_name_len % 4) != 0) { 
			read_offset += 4 - (binary_data.shader_name_len % 4);
		}
	}