<div dir="ltr">Hi Community,<div><br></div><div>I am trying to implement 4.4 Persistent Mapping Streaming, within the context  of OSG. Bellow is from the spec. I am struggling at the moment with making the buffer object sections, with the current OSG implementation and not sure if it is possible so I am asking here for hints if any of you have done something similar. Thanks a bunch as always!</div><div><br></div><div><h2 style="color:rgb(0,0,0);background-image:none;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;font-weight:normal;margin:1em 0px 0.25em;overflow:hidden;padding:0px;border-bottom:1px solid rgb(162,169,177);font-family:"Linux Libertine",Georgia,Times,serif;line-height:1.3"><span class="gmail-mw-headline" id="gmail-Persistent_mapped_streaming">Persistent mapped streaming</span></h2><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">Given the availability of OpenGL 4.4 or <a rel="nofollow" class="external gmail-text" href="http://www.opengl.org/registry/specs/ARB/buffer_storage.txt" style="text-decoration-line:none;color:rgb(102,51,102);background-color:initial;padding-right:13px">ARB_buffer_storage</a>, the use of persistent mapping of buffers becomes a possibility.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">The idea here is to allocate an immutable buffer 2-3x the size you need, and while you're executing operations from one region of the buffer while you are writing to a different region. The difference between the prior mapping scheme is that you are not frequently mapping and unmapping the buffer. You map it persistently when you create the buffer, and keep it mapped until it's time to delete the buffer.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">This requires using <span class="gmail-tpl-code" style="font-family:Consolas,monospace;background-color:rgb(248,248,248)"><a href="https://www.khronos.org/opengl/wiki/GLAPI/glBufferStorage" title="GLAPI/glBufferStorage" style="text-decoration-line:none;color:rgb(11,0,128);background:none">glBufferStorage</a></span> with the <span class="gmail-tpl-enum" style="font-family:Consolas,monospace;background-color:rgb(248,248,248);color:rgb(160,0,160)">GL_MAP_WRITE</span> and <span class="gmail-tpl-enum" style="font-family:Consolas,monospace;background-color:rgb(248,248,248);color:rgb(160,0,160)">GL_PERSISTENT_BIT</span>s. It also requires using <span class="gmail-tpl-code" style="font-family:Consolas,monospace;background-color:rgb(248,248,248)"><a href="https://www.khronos.org/opengl/wiki/GLAPI/glMapBufferRange" title="GLAPI/glMapBufferRange" style="text-decoration-line:none;color:rgb(11,0,128);background:none">glMapBufferRange</a></span> with those same bits when mapping it.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">The general algorithm is as follows. The buffer is logically divided into 3 sections: the section you're writing to, and two sections that could currently be in use.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">The first step is to write to section 1 of the buffer. Once you have finished writing, you must make this range of data visible to OpenGL by flushing it (if you aren't mapping coherently). Then, you do whatever you need to in order to <a href="https://www.khronos.org/opengl/wiki/Buffer_Object_Streaming#Persistent_visibility" style="text-decoration-line:none;color:rgb(11,0,128);background:none">ensure that this data is visible to OpenGL</a>. Once the data is visible, you issue some number of <a href="https://www.khronos.org/opengl/wiki/Rendering_Command" class="gmail-mw-redirect" title="Rendering Command" style="text-decoration-line:none;color:rgb(11,0,128);background:none">Rendering Commands</a> that read from that section of the buffer. After issuing all of the commands that read from the buffer, you create a <a href="https://www.khronos.org/opengl/wiki/Sync_Object" title="Sync Object" style="text-decoration-line:none;color:rgb(11,0,128);background:none">fence sync object</a>.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">Next frame, you start writing to buffer section 2. You do all of the above, and create a new fence sync object. Keep each buffer section's sync objects separate.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">You do the same with buffer section 3 on the next frame.</p><p style="margin:0.5em 0px;line-height:inherit;font-family:sans-serif;font-size:14px">On the fourth frame, you want to start using section 1 again. However, you need to check section 1's sync object to see if it has completed <i>before</i> you can start. You can only start writing to a section if that section's sync object has completed.</p></div><div><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">trajce nikolov nick<br></div></div></div>