problem with glBufferAddressRangeNV

I have one big VBO & IBO, this VBO store 3 kinds of attributes.

I use glGenVertexArrays / glBindVertexArray to record all my attributes for my 3 kind of attributes.

XYZ + NORMAL + UV + UV2 + COLOR
XYX + UV for ENV MAP
XYZ + NORMAL + UV

When I use glBindVertexArray, I need to call glBufferAddressRangeNV for each attributes
even if that was done during my vertex array creation…

Creation code:


glGenVertexArrays(1, &m_id);
glBindVertexArray(m_id);
...
glVertexAttribFormatNV(attrib, size, GL_FLOAT, GL_FALSE, stride);
..
for each attrib...
    glEnableVertexAttribArray(i);
    glBufferAddressRangeNV(GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV, i, vb->m_address + offset, vb->size() - offset);
..
glBufferAddressRangeNV(GL_ELEMENT_ARRAY_ADDRESS_NV, 0, ib->m_address, ib->size());
glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV);
glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV);
glBindVertexArray(0);

This is not the full code since i have a class that handle attributes, so it can be anything… its not hardcoded…

Anyway, Why glBufferAddressRangeNV need to be called each time glBindVertexArray is used? If I dont call that nothing is rendered, maybe its related because I have multiple vertex array in one VBO. but its not an issue if I dont use unified memory…

Doesn’t make sense to me. NV_vertex_buffer_unified_memory clearly states that {VERTEX_ATTRIB,ELEMENT}ARRAY{ADDRESS,LENGTH}_NV and the associated enables are VAO state. That said, I don’t use VAOs with bindless as I saw worse performance when I tried this. I just store this data in my batch state objects. Less cache misses with that I suspect.

Are you sure your start addresses and sizes are static?

[QUOTE=Dark Photon;1253843]Doesn’t make sense to me. NV_vertex_buffer_unified_memory clearly states that {VERTEX_ATTRIB,ELEMENT}ARRAY{ADDRESS,LENGTH}_NV and the associated enables are VAO state. That said, I don’t use VAOs with bindless as I saw worse performance when I tried this. I just store this data in my batch state objects. Less cache misses with that I suspect.

Are you sure your start addresses and sizes are static?[/QUOTE]

The address is ok, I used a sample you pasted on another thread, the address is get just after the creation of the VBO / IBO.

The IBO state seam to work, but for my static VBO, it seam to not work so far, but I have 3 VAO to that VBO, I did not try just one, because i need to deactivate lot of crap to test this, so right now , the same code used to create the VAO after i bind a VAO to setup the address…

Maybe I need to setup something that I am not aware, but all samples I saw from the forum and net just use VBO without VAO, and VAO is working quite fine without NV (on my side)

I think I got an increase of about 10% in FPS with NV but since I set the address each time, I bet I can do better if VAO do his job. You say it will be worse maybe :slight_smile: but I cannot verify this right now :frowning: