Hi Robert,
You're right. The reference counter of the buffer object is exactly what
I want. In order to be able to release the GL buffer after the last
texture compilation, the boolean "copy data and release GL buffer
object" of the buffer object should also be set to false in StateToCompile.
Trying ...
On 13/12/2012 15:43, Robert Osfield wrote:
HI Lionel,
Might the Texture::setUnRefImageDataAfterApply() mechanism be useful
here? As the osg::Image is released then the BufferObject would be
decremented till eventual it itself is deleted. In theory I'd expect
this to happen right now. Is there an issue here?
Robert.
On 12 December 2012 14:32, Lionel Lagarde <[email protected]
<mailto:[email protected]>> wrote:
Hi,
Let's imagine this scenario:
The database pager loads the file "x.osgb".
This file contains 3 geometries (A, B, C). A has a texture
that uses A.jpg, B uses B.jpg and C uses C.jpg. These textures
are not used by the already rendered geometry (i.e. not compiled)
The FindCompileableGLObjectsVisitor is configured to set a
pixel buffer object on the texture's image. An unique buffer
object (shared by the 3 images) is created.
The buffer object is configured to release it's GL buffer once
the texture is applied
(setCopyDataAndReleaseGLBufferObject(true)).
After the draw dispatch, the IncrementalCompileOperation
compiles the new geometries and textures:
for each textures
texture->apply(. . .) =
bind the buffer object
copy A.jpg, b.jpg and C.jpg in the buffer (the 3
images are copied because the buffer object is shared)
glTex[Sub]Image(. . ., offset of the current image
in the buffer)
if (getCopyDataAndReleaseGLBufferObject())
release GL buffer
So, for each texture, a GL buffer is created, the 3 images are
copied, the data is copied in the texture using the current
image offset in the buffer and the buffer is deleted.
The GL buffer should not be released before all the images are
copied into their textures(i.e. glTex[Sub]Image for all the textures).
There are few usages cases of a pixel buffer object:
* texture paging (IncrementalCompileOperation): the GL buffer
release can be done after the compilation loop
* rendering (a noncompiled texture is used to render geometry):
the GL buffer release can be done once all the textures using
the buffer are compiled
* texture streaming (movie): the GL buffer should not be released
The first 2 cases can be handledusing some king of reference
counter (the buffer contains X segments, each glTex[Sub]Image
decrements this counter, when it reaches 0the buffer can be released).
In the third case, the buffer should never be released. The
counter should not be decremented.
What do you think about this? I'm not sure all the usage cases are
covered, especially if the buffer is a vertex buffer or an indices
buffer.
Lionel Lagarde
_______________________________________________
osg-users mailing list
[email protected]
<mailto:[email protected]>
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org