Buffer Object Usage Hints


Can anybody explain to me what the various usage hints mean when allocating a buffer object.

From what I can gather the second part is quite simple:

DRAW is CPU to GPU transfer
READ is GPU to CPU transfer
COPY is GPU to GPU transfer

My confusion is on the temporal hints. To take the official words…

STATIC The data store contents will be modified once and used many times.
STREAM The data store contents will be modified once and used at most a few times.
DYNAMIC The data store contents will be modified repeatedly and used many times.

STATIC seems straight forward. I take it as “This memory will be read far more than it’s written, so put it near the reader”. So it would be GPU memory for DRAW and COPY buffers, CPU memory for READ buffers.

I read STREAM to be the same as STATIC, but the buffer will be short lived.
I read DYNAMIC as this buffer will be reused (and long lived).

My confusion arises because I tend to see STREAM buffers used when people are streaming updates (example code and such like), but the docs say it’s a write once buffer. I’ve never seen DYNAMIC buffers used, but my interpretation makes this the correct hint for any buffer that is updated.

Is my understanding wrong?
The docs are obviously talking in euphemisms. What’s the real story?


Static Geometry : STATIC_DRAW
Texture Streaming : DYNAMIC_DRAW
Transform Feedback : DYNAMIC_COPY

This may help: Using VBOs (NVidia)