Part of the Khronos Group

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 3 of 3

Thread: binding the same buffer object to a different target

  1. #1
    Intern Contributor
    Join Date
    Oct 2012

    binding the same buffer object to a different target


    Can one bind the same buffer object to different targets at differnt times?

    So for example, let's say I create a buffer
    glGenBuffers(1, &id);
    glBufferData(GL_ARRAY_BUFFER, 2048, data, GL_DYNAMIC_COPY); //data is my data array

    Let's say I use this to do certain things.

    Now I want to use the same buffer as a GL_SHADER_STORAGE_BUFFER, can I simply go ahead and use the sae buffer without having to recreate another buffer?

    For some reason, I had stumbled on this question earlier, but I cannot remember what I had learned from it.


  2. #2
    Senior Member OpenGL Pro
    Join Date
    Jan 2007
    Yes, you can do this.

    However, buffer objects have their origins in the GL_ARB_vertex_buffer_object extension, and that notes:

    Note that it is expected that implementations may have different memory type requirements for efficient storage of indices and vertices. For example, some systems may prefer indices in AGP memory and vertices in video memory, or vice versa; or, on systems where DMA of index data is not supported, index data must be stored in (cacheable) system memory for acceptable performance. As a result, applications are strongly urged to put their models' vertex and index data in separate buffers, to assist drivers in choosing the most efficient locations.
    I'm not sure how much of this is relevant to more modern hardware, but if so, it can be expected to be generalized to any buffer object type. So the standard advice is that GL may make assumptions about how (and where) best to store the buffer based on the binding-point used when it's first bound, but that these assumptions may not yield the best performance for other binding-points. On the other hand if it saves you a memory copy then that may not be such a big deal, so I'd encourage you to experiment with both approaches (never forgetting that what runs good on Vendor A may run poor on Vendor B, or vice-versa).

  3. #3
    Junior Member Regular Contributor
    Join Date
    May 2013
    The only real difference I know about is the buffer location. Meaning Vram or System Memory. (In case of APUs there is only System memory)
    Modern drivers most likely also ignore your usage hint (GL_DYNAMIC_COPY) and decide on your usage patterns where to move/leave the buffer later on.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts