Without this flag, attempting to perform any operation on the buffer while it is mapped will fail.You must use one of the mapping bits when using this bit.But this only restricts how the user directly modifies the data store; "server-side" operations on buffer contents are always available.The following operations are always valid on immutable buffers regardless of the Allows the buffer object to be mapped in such a way that it can be used while it is mapped.
When you're just creating, filling the buffer object with data, or both, the target you use doesn't technically matter.
In this case, the purpose of the buffer is just to make the read asynchronous. Buffer objects are general purpose memory storage blocks allocated by Open GL. To give the implementation great flexibility in exactly what a particular buffer object's data store will be, so as to better optimize performance, the user is required to give usage hints.
These provide a general description as to how exactly the user will be using the buffer object.
For example, if you want to have a buffer store the results of a vertex shader computation through the use of transform feedback, the user is not directly changing the buffer information. Similarly, the user can read a buffer's data, using a variety of commands.
Or, the user can execute an Open GL command that causes the GL to read the contents of the buffer and do something based on it.
Buffers storing vertex data are read by the GL when rendering.